/* 
Title:      videotron.remoteLoad.js
Author:     nurun.com
Updated:    September 2008

Content:	- VIDEOTRON.widget.Overlay
			- VIDEOTRON.widget.remoteLoad
			- VIDEOTRON.widget.Dialog 

*/


if (typeof VIDEOTRON === "undefined" || !VIDEOTRON) {
    var VIDEOTRON = {};
}
if (typeof VIDEOTRON.widget === "undefined" || !VIDEOTRON.widget) {
    VIDEOTRON.widget = {};
}

// ------[ WIDGET OVERLAY ]------------------------------------------------- //
/**
 * Overlay crée un panel YUI avec un contenu lié à un objet (lien/form/etc.)
 *
 * @param {Object}  UserConfig  Un objet contenant les valeurs initials pour les
 								configs initials du panel
 * @param {String | HTMLElement} target Id | Element for the overlay panel
 * @param {Objetc remoteLoad} rl - Référence à l'objet remoteLoad qui demande la construction
 */
 

VIDEOTRON.widget.Overlay = function(userConfig, hookedElement, rl) {

	/**********
		Private member
	**********/
		var that = this; //Référence à l'object lui même

		this.submittedId = false;
		
		// Crée le Namespace de travail (scope global à tous les overlays)
		if(!YAHOO.custom || !YAHOO.custom.overlay) {
			this.scope = YAHOO.namespace('custom.overlay');
		} else {
			this.scope = YAHOO.custom.overlay;
		}

		// Ajoute le Overlay Manager s'il n'existe pas (scope global à tous les overlay) 
		if(!this.scope.manager) {
			this.scope.manager = new YAHOO.widget.OverlayManager();
		}
		
		// Ajoute automatiquement le script pour les objets flash
		// IE ne supporte pas bien le onload sur les script donc le script doit être chargé le plus tôt possible
		if(typeof(swfobject) == 'undefined') {
			var script = document.createElement("script");
			script.src = "/service/static/residentiel/js/swfobject.js";
			script.type = "text/javascript";
			var hd = document.getElementsByTagName("head")[0];
			hd.appendChild(script);
		}

		// Crée un div qui sert de wrapper au différent overlay du scope
		if(!this.scope.wrapper) {
			this.scope.wrapper = document.createElement('div');
			this.scope.wrapper.id='custom-overlay-wrapper';
			this.scope.wrapper.style.position = 'absolute';
			this.scope.wrapper.style.zIndex = '102';
			this.scope.wrapper.style.left = '0px';
			this.scope.wrapper.style.top = '0px';
			document.body.appendChild(this.scope.wrapper);
		}
		
		this.hookedElement = hookedElement;
		
		this._isLoaded = false; // indique si le panel a été chargé
		
		this._headerContent = ''; // Contenue par défaut du header du overlay
		this._bodyConent = ''; // Contenue par défaut du body du overlay
		this._footerContent = ''; // Contenue par défaut du footer du overlay
		
		// Configuration initial par défaut
		this.cfg = {
			/**
			 * ID {String} Identifiant du container du panel
			 * Optionnel : Identifiant par défaut du panel. Le Id est généré à partir du targetId ou du ID du hookedElement lors du rendering du panel
			 * Défaut : remoteLoad
			 **/
	        id: "remoteLoad",

			/**
			 * renderTarget {Object} Noeud du DOM qui sert de point d'origine pour le rendering du panel et la recherche des éléments
			 * Optionnel : Le noeud sert de point d'origine, donc définir sur le container parent pour les sous-panels
			 * Défaut : document.body
			 **/
	        renderTarget: document.body,
			
			/**
			 * title {String} Titre du panel
			 * Optionnel : Peut être défini avec la config meta overlay-title si le contentType est défini à "remote"
			 * Défaut : ""
			 **/
			title: "",
			
			/**
			 * width {Integer} largeur total du panel
			 * Optionnel : Peut être défini avec la config meta overlay-width si le contentType est défini à "remote"
			 * Défaut : 50em - Éviter les mesures en pourcentage (%).
			 **/
			width: "50em",
			
			/**
			 * height {Integer} hauteur total du panel
			 * Optionnel : Peut être défini avec la config meta overlay-height si le contentType est défini à "remote"
			 * Défaut : auto - Éviter les mesures en pourcentage (%).
			 **/
			height: 'auto',
			
			/**
			 * fixedCenter {Boolean} Indique si le panel doit être centré
			 * Optionnel : Positionne le panel au centre de l'espace visible à l'écran et le conserve centré même si l'utilisateur scroll le contenue
			 * 			   Cette propriété est automatiquement défini à false pour les panel qui affiche des objets flash
			 * Défaut : true
			 **/
			fixedCenter: true,
			
			/**
			 * dragable {Boolean} Indique si le panel peut être déplacé par l'utilisateur
			 * Optionnel : Permet à l'utilisateur de déplacer la fenêtre avec la souris
			 * Défaut : false
			 **/
			dragable: false,
			
			/**
			 * showCloseX {Boolean} Permettre la fermeture du panel
			 * Optionnel : Fait référence à la propriété 'close' du panel.
			 * Défaut : true
			 **/
			showCloseX: true, 
			
			/**
			 * modal {Boolean} Indique si le panel est modal ou pas
			 * Optionnel : Ajoute un mask qui couvre tout le contenue et gère les click pour prévenir tout action sur le contenu 
			 *             à l'extérieur du panel lorsqu'il est affiché
			 * Défaut : true
			 **/
			modal: true,
			
			/**
			 * addCloseLink {Boolean} Permet de générer un lien (bouton) "fermmer" dans le footer du panel
			 * Optionnel : Cette propriété dépend directement de la méthode getFooterContent().
			 * Défaut : false
			 **/
			addCloseLink: false,
			
			/**
			 * useTooltips {Boolean} Indique que le panel utilise des fonctionnalité du YAHOO.widget.Tooltip
			 * Optionnel : Requiert la présence des scripts nécessaire au fonctionnement du YAHOO.widget.Tooltip.
			 *             Peut être défini avec la config meta overlay-useTooltips si le contentType est défini à "remote".
			 *			   Cette valeur sert uniquement d'indiquateur. Si le contentType est défini à "remote", la page chargé
			 *			   doit contenir les scripts nécessaire à l'initialisation des Tooltips.
			 * Défaut : false
			 **/
			useTooltips: false,
			
			/**
			 * useColapsedList {Boolean} Indique que le panel utilise des fonctionnalité de list Collapse
			 * Optionnel : Cette fonctionnalité a été ajouté dans le cadre du projet refonte Vidéotron.
			 *			   Requiert la présence des scripts nécessaire au fonctionnement des liste Collapse (voir fonction collapseUncollapseDataList() du projet refonte Vidéotron)
			 *             Peut être défini avec la config meta overlay-useColapsedList si le contentType est défini à "remote".
			 * Défaut : false
			 **/
			useColapsedList: false,

			/**
			 * useSWFObject {Boolean} Indique que le panel utilise des fonctionnalité du objectswf.js
			 * Optionnel : Requiert la présence des scripts nécessaire au fonctionnement du objectswf.
			 *             Peut être défini avec la config meta overlay-useSWFObject si le contentType est défini à "remote".
			 *			   Cette valeur sert uniquement d'indiquateur. Si le contentType est défini à "remote", la page chargé
			 *			   doit contenir les scripts nécessaire à l'initialisation des swf. La méthode _testSWFScript convertie
			 *			   automatiquement les calls embedSWF en createSWF. 
			 *			   Voir la méthode _testSWFScript pour plus de détails.
			 * Défaut : false
			 **/
			useSWFObject: false,
			
			/**
			 * contentType {String | Function} Indique le mode de fonctionnement du chargement des données du panel.
			 * Optionnel : {String} 'remote' - Utilise l'attribut href d'un lien ou l'attribut action d'un form pour charger le 
			 *								   contenue avec un YUI.connection (AJAX)
			 *			   {Function} - Appelle une fonction pour récupérer le contenue du overlay. La fonction doit retourner un objet 
			 *							strucuturé {head: 'head content', body: 'body content', foot: 'footer content'}
			 * Défaut : 'remote'
			 **/
			contentType: 'remote',
			
			/**
			 * useMetaConfig {Boolean} Indique que des metas sont définie dans le document pour configurer les différentes options du Panel.
			 * Optionnel : Applicable uniquement avec le contentType 'remote'.
			 * Utilisation : i.e.: <meta name="overlay-title" content="titre du overlay" />
			 *				 Configuration meta disponible :
			 *			 	 overlay-title : Défini le titre du panel
			 *			 	 overlay-width : Largeur total du panel
			 *			 	 overlay-height : Hauteur total du panel
			 *			 	 overlay-addCloseLink : Indique qu'un lien (bouton) de fermeture doit être ajouté automatiqment dans le footer du panel
			 *			 	 overlay-useTooltips : Le panel utilise des fonctionnalité de tooltips, la fonction applicable doit donc être exécuté
			 *			 	 	 				   Plus vraiment utile de l'indquer dans cette version, la détection et l'exécution des script est maintenant automatisé
			 *			 	 overlay-useColapsedList : Dans le cadre du projet Vidéotron, cette fonction permet d'exécuter les initialisation des liste rétractable
			 *			 	 					       Fonctionnalité ajouté uniquement pour le projet refonte Vidéotron.
			 *			 	 overlay-useSWFObject : Le panel contient du flash et doit s'afficher proprement en concéquence de cette option
			 *			 	 				   		Optionnel, la détection est automatisé au moment de parser les scripts
			 *								   		contenue avec un YUI.connection (AJAX)
			 * Défaut : true
			 **/
			useMetaConfig: true,
			
			/**
			 * useRemotePreLoader {Boolean} Indique si une image de préchargement doit être affiché.
			 * Optionnel : Affiche une image de préchargement sur un mask modal.
			 *			   Applicable uniquement si le contentType est défini à "remote"
			 * Défaut : true
			 **/
			useRemotePreLoader: true,
			
			/**
			 * remoteSourceElements {Object} Indique les sources de données pour le head, le body et le footer du panel
			 * Optionnel : Applicable uniquement si le contentType est défini à "remote".
			 *			   L'objet contient 3 propriété qui indentifi les ID des noeuds à utiliser pour les infos du panel
			 *			   Structure de l'objet :
			 *			   header {String) Id du noeud à récupérer dans le DOM pour le contenu du header du panel.
			 *							   * Si le test du header retourne false, le contenu par défaut sera utilisé
			 *							   Défaut : false
			 *			   content {String) Id du noeud à récupérer dans le DOM pour le contenu du body du panel.
			 *							   * Si le test du content retourne false, le contenu par défaut sera utilisé
			 *							   Défaut : 'content'
			 *			   footer {String) Id du noeud à récupérer dans le DOM pour le contenu du footer du panel.
			 *							   * Si le test du footer retourne false, le contenu par défaut sera utilisé
			 *							   Défaut : false
			 **/
			remoteSourceElements: {
				header: false,
				content: 'content',
				footer: false
			},

			/**
			 * imgPreloader {Object} Information sur l'image utilisé pour l'affichage du preloader.
			 * Optionnel : Applicable uniquement si le contentType est défini à "remote".
			 *			   L'objet contient 3 propriétés obligatoires qui indentifi la source, le width et le height de l'image
			 *			   Structure de l'objet :
			 *			   src {String) Url de l'image à utiliser
			 *							Défaut : '/service/static/residentiel/img/interface/ajax-loader4.gif'
			 *			   width {Integer) Width en PX de l'image pour l'affichage
			 *							   Défaut : 62
			 *			   height {Integer) Height en PX de l'image pour l'affichage
			 *							   Défaut : 62
			 **/
			imgPreloader: {
				src: '/service/static/residentiel/img/interface/ajax-loader4.gif',
				width: '62',
				height: '62'
			},
			
			/**
			 * effect {Boolean false | Object} Effet à utiliser pour l'affichage du panel
			 * Optionnel : Si un effet est défini, elle sera appliqué au panel pour l'affichage et la fermetur du panel
			 *			   La structure de l'objet dépend de l'effet demandé.
			 *			   Les code d'exécution de l'effet doivent être préalablement chargé pour le bon fonctionnement de l'effet
			 * Défaut : {effect: YAHOO.widget.ContainerEffect.FADE, duration: 0.5}
			 **/
			effect:{effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5}
			
		};

		// Récupère les configs initial passé en paramètre
	    for (var key in userConfig) {
	        if (userConfig.hasOwnProperty(key)) {
	            this.cfg[key] = userConfig[key];
	        }
	    }
	
		// initialise le target pour le rendering du panel
		// Si le hookedElement est une string, l'élément doit être récupéré dans le dom
		if(typeof hookedElement == 'string') {
			var tmpEl = document.getElementById(hookedElement);
			// Si l'élément n'a pas été trouvé le overlay ne peut pas exister!
			if(!tmpEl || typeof tmpEl == 'undefined') {
				return false;
			} else {
				hoodedElement = tmpEl;
			}
		}
		this.cfg.renderTarget = hookedElement.targetId || hookedElement.id || this.cfg.id;
		
		// Défini le nom du panel
		this.panelName = '_panel_' + this.cfg.renderTarget;
		
		/***** OLD TRACKING
			WORS WITH ALL BROWSER EXCEPT IE < 8 -- Not tested on IE 8
		*****
		this._timerID = null;
		
		this._startHistoryTracking = function() {
			that._historyLength = window.history.length;
			that._timerID = setInterval(that._checkHistoryHash, 5000);
		};

		this._checkHistoryHash = function() {
			alert('check history hash Loc = ' + document.location.href);
			if(!/\#overlay-/i.test(document.location.href)) {
				alert('hide panel!');
				that.scope[that.panelName].hide();
				that._stopHistoryTracking();
			}
		};

		this._stopHistoryTracking = function() {
			clearInterval(that._timerID);
		};
		*****/
		
		/**
		 * Ajoute la possibilité d'avoir un callback après que le panel soit fermé
		 * @return void
		 */
		this._afterHide = function () {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension qui doit être exécuté après la fermeture du panel
				***** Le callback est déjà implémenté dans la méthode _prepareMyPanel
			*****/
			//alert('afterHide - ' + that.scope.wrapper.style.zIndex);
			//that.scope.wrapper.style.zIndex = '102';
			that.scope[that.panelName].isVisible = false;
			YAHOO.util.Dom.removeClass(document.body, "overlay-print-layout");
			YAHOO.util.Dom.removeClass('yui-panel-' + that.cfg.renderTarget, "overlay-print-layout");
			YAHOO.util.Dom.removeClass('yui-panel-' + that.cfg.renderTarget + '_c', "overlay-print-layout");
		};
		
		/**
		 * Ajoute la possibilité d'avoir un callback juste avant que le panel se ferme
		 * @return void
		 */
		this._beforeHide = function () {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode qui doit être exécuté avant la fermeture du panel
				***** Le callback est déjà implémenté dans la méthode _prepareMyPanel
			*****/
			//if(/^\#overlay-/i.test(document.location.hash)) {
			//	history.back(1);
			//}
		};

		/**
		 * Ajoute la possibilité d'avoir un callback lorsque le panel est affiché
		 * @return void
		 */
		this._afterShow = function () {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension et de callback de cette méhode qui doit être exécuté après l'affichage du panel
			*****/
			//var loc = document.location;
			//window.location.assign('#' + that.cfg.renderTarget);
			//document.location = '#' + that.cfg.renderTarget;
			//window.navigate('#' + that.cfg.renderTarget);
			//that._startHistoryTracking();
		};
		
		/**
		 * Ajoute la possibilité d'avoir un callback avant l'affichage du panel
		 * @return void
		 */
		this._beforeShow = function () {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode qui doit être exécuté avant l'affichage du panel
				***** Le callback est déjà implémenté dans la méthode _prepareMyPanel
			*****/
			// Assure que le wrapper des panel est toujours au dessus du mask avant de faire l'affichage
			that.scope.wrapper.style.zIndex = that.scope[that.panelName].cfg.getProperty('zIndex');
			YAHOO.util.Dom.addClass(document.body, "overlay-print-layout");
			YAHOO.util.Dom.addClass('yui-panel-' + that.cfg.renderTarget, "overlay-print-layout");
			YAHOO.util.Dom.addClass('yui-panel-' + that.cfg.renderTarget + '_c', "overlay-print-layout");
		};
		
		/**
		 * Ajoute la possibilité d'avoir un callback après le chargement des données du panel
		 * @return void
		 */
		this._afterLoad = function () {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode qui doit être exécuté après le chargement des données du panel
			*****/
			// Initialise le panel
			that._prepareMyPanel();
			if(that.submittedId){
			//	rl.manageOnReady(null ,null ,rl);
			//	rl.manageLinks(that.submittedId,rl);
			}
		};

		/**
		 * Ajoute la possibilité d'avoir un callback avant le chargement des données du panel (avant le call AJAX)
		 * @return void
		 */
		this._beforeRemoteLoad = function() {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode qui doit être exécuté avant le call AJAX pour chargé les données du panel.
				Incluant la possibilité d'avoir d'autre code exécuté avant le code de la fonction elle même et la possibilité d'overwriter la méthode elle même.
			*****/

			/*****
				Un seul preloader est généré pour tous les overlay. Le scope du preloader est donc global à tous les overlay.
			*****/
			
			// Si le preloader doit être affiché pour indiquer un téléchargement
			if(that.cfg.useRemotePreLoader) {
				// Si le preloader n'a pas encore été créé, crée le preloader
				if(!this.scope.preloader) {
					// Si un div#overlay-preloader existe déjà dans le document, récupère se DIV
					var div = document.getElementById('overlay-preloader');
					// Si aucune div#overlay-preloader, ajoute le div au DOM
					if(!div) {
						div = document.createElement('div');
						div.id = 'overlay-preloader';
						this.scope.wrapper.appendChild(div);
						div.style.position = 'relative';
					}

					// Initialise le panel pour le preloader temporaire qui sera afficher jusqu'a se que les données externe soit reçus et que le panel soit prêt à afficher
					this.scope.preloader = 
							new YAHOO.widget.Panel("preloader",  
								{ width:"50em",
								  fixedcenter:true, 
								  close:false, 
								  draggable:false, 
								  zindex:1,
								  modal:true,
								  visible:false
								} 
							);

					this.scope.preloader.isVisible = false;
					
					/**
					 * setPosition permet de centrer l'image du preloader au centre de la zone visible de la fenêtre
					 * @return void
					 */
					this.scope.preloader.setPosition = function() {

						var l, t, Dom;
						Dom = YAHOO.util.Dom;
						// Calcul la position horizontal
						l = Dom.getDocumentScrollLeft() + Math.ceil(Dom.getViewportWidth()/2) - Math.ceil(that.cfg.imgPreloader.width/2);
						// Calcul la position vertical
						t = Dom.getDocumentScrollTop() + Math.ceil(Dom.getViewportHeight()/2) - Math.ceil(that.cfg.imgPreloader.height/2);
						// Applique le positionnement sur l'image
						that.scope.preloader.loaderImage.style.left = l + 'px';
						that.scope.preloader.loaderImage.style.top = t + 'px';
						// Applique le positionnement sur le label
						t += parseInt(that.cfg.imgPreloader.height);
						that.scope.preloader.loaderLabel.style.top = t + 'px';
						that.scope.preloader.loaderLabel.style.left = '0px';
						
					};
					// Ajoute le preloader au manager des overlays
					this.scope.manager.register(this.scope.preloader);

					// Gestion du positionnement de l'image du preloader
					that.scope.preloader.showMaskEvent.subscribe(function() {
																	if(!that.scope.preloader.loaderImage) {
																		var img = new Image;
																		img.src = that.cfg.imgPreloader.src;
																		img.id = 'CPNL_overlay___ajax_img_loader___';
																		img.style.width = that.cfg.imgPreloader.width + 'px';
																		img.style.height = that.cfg.imgPreloader.height + 'px';
																		img.style.position = 'absolute';
																		img.style.zIndex = 101;
																		img.setAttribute('alt', rl.lang.lbl.titlePreloader);
																		document.body.appendChild(img);
																		that.scope.preloader.loaderImage = img;
																		var lbl = document.createElement('div');
																		lbl.className = 'overlay-loading-label';
																		lbl.id = 'CPNL_overlay___ajax_lbl_loader___';
																		lbl.style.zIndex = 102;
																		lbl.innerHTML = rl.lang.lbl.titlePreloader;
																		document.body.appendChild(lbl);
																		that.scope.preloader.loaderLabel = lbl;
																	}
																	that.scope.preloader.setPosition();
																	that.scope.preloader.loaderImage.style.display = 'block';
																	that.scope.preloader.loaderLabel.style.display = 'block';
																}, that.scope.preloader, true);					
				}
				
				// Aucun panel n'est affiché pour le preloader. L'image du preloader est affiché au dessus du mask
				// du panel et centré dans la zone visible de l'écran
				this.scope.preloader.buildMask();
				this.scope.preloader.sizeMask();
				this.scope.preloader.cfg.setProperty('zIndex', 100);
				this.scope.preloader.stackMask();
				this.scope.preloader.showMask();
				this.scope.preloader.isVisible = true;

				// Charge le contenue du overlay
				that._loadContent();

			}
			
		};
		

		/**
		 * searchNodes est utilisé par la méthode getElementsByAttribute qui permet
		 * de recherche des nodes à travers un DOM XML pour IE
		 *
		 * @param {Node Object}  node  Un objet représentant une node d'un DOM XML
		 * @param {Function} func Fonction utilisé pour la récursivité
		 */
		this.searchNodes = function _searchNodes(node, func) {
			// Exécute la fonction avec le paramètre node
			func(node);
			// Récupère la node suivante
			node = node.firstChild;
			// Boucle récursive pour rechercher dans tous les nodes enfants
			while(node) {
				_searchNodes(node, func);
				node = node.nextSibling;
			}
		};
		
		/**
		 * getElementsByAttribute est une méthode utilisée pour rechercher des nodes d'un
		 * DOM XML ayant une valeur précise dans un attribut précis.
		 *
		 * @param {DOM Object}  dom  Un objet représentant un DOM XML ou un noeud de DOM XML
		 * @param {String} attr Nom de l'attribut à tester
		 * @param {String} value Valeur recherché dans l'attribut attr
		 * @param [Integer] limit Valeur optionnel permettant de limiter le nombre de noeuds retourné par la fonction
		 */
		this.getElementsByAttribute = function (dom, attr, value, limit) {
			// S'il n'y a pas de dom, retourne false
			if(!dom) return false; // Défini le limit à false si aucune limite (numérique) n'est reçus
			if(typeof limit == 'undefined' || typeof limit != 'number') limit = false;
			var results = [];
			
			// Recherche récursive pour trouver les nodes correspondante
			this.searchNodes(dom, function (node) {
				// Récupère uniquement si le node type est un element et que la node contient l'attribut voulue
				var curNode = node.nodeType === 1 && node.getAttribute(attr);
				// Si curNode est une string et éguale à value ou que value n'est pas une string récupère la node
				if(typeof curNode === 'string' && (curNode == value || typeof value !== 'string')) {
					// Si le DOM ne supporte pas le innerHTML sur les node (IE par exemple)
					if(!node.innerHTML) {
						// Reconstruit le résultat produit par le innerHTML.
						// Le innerHTML ne contient pas le XML (html) de la node courrante, mais seulement l'intérieur
						var inHTML = '';
						if(node.hasChildNodes()) {
							for(var c=0;c<node.childNodes.length;c+=1) {
								inHTML += node.childNodes(c).xml;
							}
						}
						// Crée un nouvel objet avec les propriétés nécessaires :: Objet évolutif, ajouté les propriétés utilisés ici pour une bonne constance
						var tNode = {
						  tagName: node.tagName,
						  id: node.getAttribute('id'),
						  innerHTML: inHTML
						};
						results.push(tNode);
					} else {
						results.push(node);
					}
				}
			});
			
			// Si aucune node trouvé, retourne false
			if(results.length === 0) return false;
			else if(limit === 1 && results.length) return results[0]; // Nodes trouvé et limit de 1 demandé, retourne l'objet 0
			else if(limit && results.length > limit) return results.slice(0, limit); // Retourne le nombre d'éléments imposé par la limite
			else return results; // Retourne le array de nodes trouvé (aucune limite)
			
		};

		/**
		 * getHeaderContent est la méthode utilisée pour préparer le contenu HTML à envoyer dans le header du panel
		 *
		 * @return {String} Html à injecter dans le header du panel
		 */
		this.getHeaderContent = function() {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode pour remplacer le code utilsé par défaut
			*****/
			//Prépare le header du overlay
			var txtHeader = '<div id="' + that.cfg.renderTarget + '-closePanel" class="closePanel" title="' + rl.lang.lbl.xCloseTitle + '"><span>' + rl.lang.lbl.xCloseLabel + '</span></div>';
			if(that.cfg.title) {
				txtHeader = "<span class='headPanelTitle'>" + that.cfg.title + "</span>" + txtHeader;
			}
			return txtHeader;
		};
		
		/**
		 * getBodyContent est la méthode utilisée pour préparer le contenu HTML à envoyer dans le body du panel
		 *
		 * @return {String} Html à injecter dans le body du panel
		 */
		this.getBodyContent = function() {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode pour remplacer le code utilsé par défaut
			*****/

			return '<div class="main-content overlay-content">' + that._bodyContent + '</div>';
		};
		
		/**
		 * getFooterContent est la méthode utilisée pour préparer le contenu HTML à envoyer dans le footer du panel
		 *
		 * @return {String} Html à injecter dans le footer du panel
		 */
		this.getFooterContent = function() {
			/*****
				::: TO DO ::: 
				Ajouter les fonctionnalités d'extension de cette méhode pour remplacer le code utilsé par défaut
			*****/
			// Par défaut, si l'option de configuration addCloseLink est false, retourne une string vide
			return (that.cfg.addCloseLink ? '<div id="' + that.cfg.renderTarget + '-closePanelFooter" class="closePanelFooter button y-button"><button><span><span>' + rl.lang.lbl.btnCloseCaption + '</span></span></div>' : '');
		};
		

		this._handleCLose = function() {
	        try {
                YAHOO.util.History.navigate("cpnl", "none");
				that.scope[that.panelName].hide();
	        } catch (e) {
	            that.scope[that.panelName].hide();
	        }
		}

		/**
		 * _prepareMyPanel est la méthode utilisée pour préparer le panel pour l'affichage
		 *
		 * @return void
		 */
		this._prepareMyPanel = function() {
			// Si le panel n'a pas encore été créé, crée le panel
			//if(!that.scope[that.panelName]) {
				// Si le div qui doit contenir le panel n'existe pas, il sera ajouté dans le wrapper
				//if(!document.getElementById(that.cfg.renderTarget)) {
					// Créé un div pour le marqueur des URL pourqu'un saut soit possible
					var div = document.createElement('div');
					div.id = that.cfg.renderTarget;
					div.name = that.cfg.renderTarget;
					that.scope.wrapper.appendChild(div);
			//	}
				
				// Configuration initial du panel
				var conf = {};
				conf['width'] = that.cfg.width;
				if(that.cfg.height != 'auto') conf['height'] = that.cfg.height;
				conf['fixedcenter'] = that.cfg.fixedCenter;
				conf['close'] = that.cfg.showCloseX;
				conf['dragable'] = that.cfg.dragable;
				conf['AutoFillHeight'] = true;
				conf['zindex'] = 10 + that.scope.manager.overlays.length;
				conf['modal'] = that.cfg.modal;
				conf['visible'] = false;
				if(that.cfg.effect) conf['effect'] = that.cfg.effect;
				
				// Crée un nouveau panel et l'ajoute au scope
				that.scope[that.panelName] = new YAHOO.widget.Panel('yui-panel-' + that.cfg.renderTarget, conf);
				that.scope[that.panelName].setHeader(that.getHeaderContent()); 
				that.scope[that.panelName].setBody(that.getBodyContent()); 
				that.scope[that.panelName].setFooter(that.getFooterContent()); 


				//Ajoute la gestion de la touche ESC pour fermer la fenêtre
				var kl = new YAHOO.util.KeyListener(document, { keys:27 },
													  { fn:that._handleCLose,
														scope:that.scope[that.panelName],
														correctScope:true }, "keyup" ); 
														// keyup is used here because Safari won't recognize the ESC
														// keydown event, which would normally be used by default
			
				that.scope[that.panelName].cfg.queueProperty("keylisteners", kl);
				// Prépare le panel
				that.scope[that.panelName].render(document.getElementById(that.cfg.renderTarget));

				// Gestion des footers multiple. Les div.ft qui sont définis dans le code qui est chargé sont utilisés
				// pour l'affichage sans javascript. Ils doivent donc être caché à l'exception du dernier si l'option
				// de configuration "addCloseLink" est à false 
				var fts = YAHOO.util.Dom.getElementsByClassName("ft", "div", that.cfg.renderTarget);
				if(fts) {
					for(var i=0; i<fts.length-1; i+=1) {
						fts[i].style.display = (that.cfg.addCloseLink ? 'none' : 'block');
					}
					fts[i].style.display = (!that.cfg.addCloseLink ? 'none' : 'block');
				}
				//Ajoute la gestion des click sur le "X" le bouton "Fermer" et le bouton "Annuler" pour fermer le panel
				YAHOO.util.Event.addListener([that.cfg.renderTarget + "-closePanel", that.cfg.renderTarget + "-closePanelFooter"], "click", that._handleCLose, that.scope[that.panelName], true);
				
				var btnResets = YAHOO.util.Dom.getElementsByClassName('bt-cancel', 'button', document.getElementById(that.cfg.renderTarget));
				if(btnResets) {
					for(var i=0; btnResets[i]; i++) {
						//console.dir(btnResets[i]);
						if(btnResets[i].type == 'reset') {
							YAHOO.util.Event.addListener(btnResets[i], "click", that._handleCLose, that.scope[that.panelName], true);
						}
					}
				}
				
				// Gestion des tag script est des embedswf()
				that.scope[that.panelName].showEvent.subscribe(function() {
																	if(that.cfg.useSWFObject) that._testSWFScript();
																	else that._parseForScriptTag();
																}, that.scope[that.panelName], true);
				
				// Gestion du callback avant l'affichage du panel
				that.scope[that.panelName].beforeShowEvent.subscribe(that._beforeShow, that.scope[that.panelName], true);
				// Gestion du callback après l'affichage du panel
				that.scope[that.panelName].showEvent.subscribe(that._afterShow, that.scope[that.panelName], true);
				// Gestion du callback avant la fermeture du panel
				that.scope[that.panelName].beforeHideEvent.subscribe(that._beforeHide, that.scope[that.panelName], true);
				// Gestion du callback après la fermeture du panel
				that.scope[that.panelName].hideEvent.subscribe(that._afterHide, that.scope[that.panelName], true);
				
				// Si le panel utilise des call embedswf() pour ajouter des flash, le fixedCenter doit être retiré au moment du show
				// pour laisser l'overlay scrollay avec la fenêtre pour ne pas laisser le flash sortir du overlay.
				// Le fixedCenter est rétablie à la valeur de config une fois la fenêtre fermé, pour qu'elle se repositionne correctement à la prochaine ouverture.
				if(that.cfg.useSWFObject) {
					//Événement qui doit être activer lorsque le panel est affiché
					that.scope[that.panelName].showEvent.subscribe(function() {arguments[2].cfg.setProperty('fixedCenter', false);}, that.scope[that.panelName], true);
					//Événement qui doit être activer lorsque le panel est fermé
					that.scope[that.panelName].hideEvent.subscribe(function() {arguments[2].cfg.setProperty('fixedCenter', that.cfg.fixedCenter);}, that.scope[that.panelName], true);
				}

				// Suppression des ul.skiplink dans le code chargé				
				/*****
					::: TO DO ::: 
					Déplacer cette fonctionnalité dans un extend de la fonction. Cette gestion est spécifique au porjet Vidéotron
				*****/
				var container = document.getElementById(that.cfg.renderTarget);
				testContainer = document.getElementById(that.cfg.renderTarget);
				
				//FIX pour redraw dans safari Mac seulement, si YUI est à la version est inférieur a 2.7.0
				var ua = navigator.userAgent;
				var version = parseInt(YAHOO.env.getVersion('container').versions[0].replace(/\.*/g,''));

				if ( version < 270 && ua.match(/AppleWebKit\/([^\s]*)/)){
					var	forceRedraw = function (e, s,container){ 
						container.style.opacity = "0.99";
						setTimeout(function(){ 	container.style.opacity = "1" ;},100);
					}
					YAHOO.widget.Overlay.windowScrollEvent.subscribe(forceRedraw,container);
				}

				var skip = YAHOO.util.Dom.getElementsByClassName('skiplink', 'ul', container);
				if(skip) {
					for(var i=0;i<skip.lenght;i+=1) {
						container.removeChild(skip[i]);
					}
				}
				// Gestion du useColapsedList				
				/*****
					::: TO DO ::: 
					Déplacer cette fonctionnalité dans un extend de la fonction. Cette gestion est spécifique au porjet Vidéotron
					Il faut aussi altérer l'utilisation du id "collapse" cette utilisation peut créer un conflit si la page principal
					utilise aussi un id "callapse"
				*****/
				if(that.cfg.useColapsedList) {
					var div = document.getElementById(that.cfg.renderTarget);
					if(div) {
						//var collapsedList = document.getElementById("collapse");
						var collapsedList = YAHOO.util.Dom.getElementsByClassName("collapse-list");
						for (var i = 0; i < collapsedList.length; i++){
							collapseUncollapseDataList(collapsedList[i]);
						}
					}
				}

				
				// Highjack des liens et formulaire dans le paneau lui même 
				// (Cette méhode est récursive lorsque les panel sont chargé. Donc un nombre X de panel peuvent souvrir en suivant
				// une séquence de traitement par exemple. 
				// Ex.: Un formulaire à remplir dans un overlay, lors du submit, la confirmation peut s'afficher dans un overlay aussi.

				that.scope[that.panelName].subPanel = new VIDEOTRON.widget.remoteLoad({	root: container, 
																						overlayBaseName: that.panelName.substr(7) + "-", 
																						effect: false});

				panelObj = that.scope[that.panelName].subPanel.getThat();
				panelObj
				
				that.scope[that.panelName].subPanel.parentOverlay = that;
				
				// Ajoute le panel au manager
				this.scope.manager.register(that.scope[that.panelName]);
				that.scope[that.panelName].isVisible = false;
			
			//}


			// Affichage du panel
			that.displayPanel();
			
		};

		/**
		 * hideAllPanels est la méthode utilisée pour fermer tous les panneaux
		 *
		 * @return void
		 */
		this.hideAllPanels = function (){
			// Boucle pour fermer tous les panel qui pevent être ouvert. Principalement utilisé pour 
			// les sous-panel qui s'ouvre à partir d'un lien ou d'un form à l'intérieur d'un panel
			for(var i in that.scope) {
				if(/^Panel /.test(that.scope[i].toString()) && that.scope[i].isVisible && i != that.panelName) {
					that.scope[i].hide();
					that.scope[i].isVisible = false;
				}
			}
		}
		/**
		 * emptyForm()
		 * S'assure de vider les valeurs du formulaire à l'exception des champs
		 * qui ont la classe "KeepValue"
		 **/
		this.emptyForm = function(){

				panelElement = that.scope[that.panelName].element;
				inputs  = panelElement.getElementsByTagName("input");
				selects = panelElement.getElementsByTagName("select");
				textarea = panelElement.getElementsByTagName("textarea");
				controls = Array(inputs, selects, textarea);
				
				for (var i = 0 ; i < controls.length; i++){
					for (var j = 0 ; j < controls[i].length; j++){
						if (controls[i][j].type != "hidden" && controls[i][j].className.indexOf("keepValue") == -1)
							controls[i][j].value = "";
					}
				} 
		}
		/**
		 * displayPanel est la méthode utilisée pour afficher le panel
		 *
		 * @return void
		 */
		this.displayPanel = function() {
			that.hideAllPanels();

			if(!that.scope[that.panelName].isVisible) {
				var cliReg = YAHOO.util.Dom.getClientRegion();
				//that.scope.wrapper.style.top = cliReg.top + 'px'; ////////// ----------> Temp, for test focus !
				
				that.scope[that.panelName].isVisible = true;
				//console.debug('zindex = ' + that.scope[that.panelName].cfg.getProperty('zIndex'));				
				that.scope[that.panelName].show();	
				that.emptyForm();
				
				that.scope.manager.focus([that.panelName]);

			}
		};
		
		/**
		 * _enumProps est une méthode utilisé pour le débugage et permet d'afficher un alert avec toutes les propriétés d'un objet
		 *
		 * @return void
		 */
		this._enumProps = function(obj) {
			if(console && console.dir) {
				console.dir(obj);
			} else {
				var res = '';
				try {
					for(var i in obj) {
						res += i + ' : ' + typeof(obj[i]) + "\n";
					}
				} catch(e) {res += i + ' : error';}
				alert(res);
			}
		};
		
		/**
		 * _loadConent est la méthode utilisée pour charger le contenue du panel
		 *
		 * @return void
		 */
		this._loadContent = function() {
			if(typeof that.cfg.contentType == 'string' && that.cfg.contentType == 'remote') {
				var src = ((that.hookedElement.tagName == 'A')||(that.hookedElement.tagName == 'AREA')) ? that.hookedElement.href : that.hookedElement.action;
				if(src) {
					if((that.hookedElement.tagName == 'A')||(that.hookedElement.tagName == 'AREA')) {
						that.conn = YAHOO.util.Connect.asyncRequest("get", src, {success: that._loadCallback_success, failure: that._loadCallback_failure});
					} else {
						that.conn = YAHOO.util.Connect.asyncRequest(that.hookedElement.method, src, {success: that._loadCallback_success, failure: that._loadCallback_failure});
					}
				}
			} else {
				/*****
					::: TO DO ::: 
					Ajouter la fonctionnalité d'un callback pour exécuter une fonction au lieu du call AJAX pour préparer le contenue
				*****/
				alert('_loadConent function callback not implemented yet!');
			}
		};
		

		/**
		 * _loadCallback_succes est la méthode appelé suite à un call AJAX avec un status 'success'
		 * Cette méthode privé permet de traiter le résultat XML reçus par le REQUEST
		 *
		 * @param {Response Object} o Reçois l'objet response retournée par le YAHOO.connection
		 *
		 * @return void
		 */
		this._loadCallback_success = function(o){
			// Récupère le contenue XML du response
			//console.dir(o);
			var doc = o.responseXML;
			var res = '';

			// Conserve le contenue XML original
			that.contentXML = doc.documentElement;

			// Si le panel utilise la configuration par méta, cherche les configuration dans le dom
			if(that.cfg.useMetaConfig) that._metasConfigFromXML(doc.documentElement);
			
			// Récupère les contenus du Head, Body et footer du panel
			// Si le DOM récupéré supporte le getElementById, utilise cette fonctionnalité
			if(doc.getElementById) {
				var pHead = that.cfg.remoteSourceElements.header ? doc.getElementById(that.cfg.remoteSourceElements.header) : '';
				var pBody = that.cfg.remoteSourceElements.content ? doc.getElementById(that.cfg.remoteSourceElements.content) : '';
				var pFoot = that.cfg.remoteSourceElements.footer ? doc.getElementById(that.cfg.remoteSourceElements.footer) : '';

			} else { // Hack pour le DOM IE qui ne supporte pas toutes les fonctionnalités des autres browser au niveau du DOM XML
				var pHead = that.cfg.remoteSourceElements.header ? that.getElementsByAttribute(doc, 'id', that.cfg.remoteSourceElements.header, 1) : '';
				var pBody = that.cfg.remoteSourceElements.content ? that.getElementsByAttribute(doc, 'id', that.cfg.remoteSourceElements.content, 1) : '';
				var pFoot = that.cfg.remoteSourceElements.footer ? that.getElementsByAttribute(doc, 'id', that.cfg.remoteSourceElements.footer, 1) : '';
			}

			// Récupère les contenus HTML de chaque section du overlay
			if(pHead && pHead.innerHTML) that._headerContent = pHead.innerHTML;
			if(pBody && pBody.innerHTML) that._bodyContent = pBody.innerHTML;
			if(pFoot && pFoot.innerHTML) that._footerContent = pFoot.innerHTML;
			
			// Si le panel utilise l'affichage du preloader et que le preloader existe et qu'il est visible, cache le preloader
			if(that.cfg.useRemotePreLoader && that.scope.preloader && that.scope.preloader.isVisible) {
				that.scope.preloader.hideMask();
				if(that.scope.preloader.loaderImage) that.scope.preloader.loaderImage.style.display = 'none';
				if(that.scope.preloader.loaderLabel) that.scope.preloader.loaderLabel.style.display = 'none';
				that.scope.preloader.isVisible = false;
			}
			// Indique que le panel a été chargé, donc au prochains affichage, aucune chargement nécessaire, affichage direct du panel
			//that._isLoaded = true;

			// Méthode exécuté avant le rendering du panel / après le chargement des données
			that._afterLoad();

		};

		/**
		 * _loadCallback_failure est la méthode appelé suite à un call AJAX avec un status 'failled'
		 * Cette méthode privé permet de gérer les requête AJAX qui sont en erreur
		 *
		 * @param {Response Object} o Reçois l'objet response retournée par le YAHOO.connection
		 *
		 * @return void
		 */
		this._loadCallback_failure = function(o) {
			that._isLoaded = false;
			/*****
				::: TO DO ::: 
				Définir quoi faire lors d'un failled par défaut. Ajouter la possibilité d'étendre cette fonctionnalité pour
				une gestion personnalisé des erreur pour l'application courrante.
			*****/
			// force le bouton fermer 
			that.cfg.addCloseLink = true; 
			var error_text = (rl.lang.lang != "en") ? "Une erreur s'est produite, s.v.p. réessayer plus tard." : "An error has occured, please try again later"; 
			that._bodyContent = "<h2>"+error_text+"</h2>"; 
			// Si le panel utilise l'affichage du preloader et que le preloader existe et qu'il est visible, cache le preloader 
			if(that.cfg.useRemotePreLoader && that.scope.preloader && that.scope.preloader.isVisible) { 
					that.scope.preloader.hideMask(); 
					if(that.scope.preloader.loaderImage) that.scope.preloader.loaderImage.style.display = 'none'; 
					if(that.scope.preloader.loaderLabel) that.scope.preloader.loaderLabel.style.display = 'none'; 
					that.scope.preloader.isVisible = false; 
			} 
			// Indique que le panel a été chargé, donc au prochains affichage, aucune chargement nécessaire, affichage direct du panel 
			//that._isLoaded = true; 
			
			// Méthode exécuté avant le rendering du panel / après le chargement des données 
			that._afterLoad();
		};
				

		/**
		 * _metasConfigFromXML est la méthode utilisé pour récupérer les configuration défini dans les métas du
		 * document chargé avec un call AJAX (remote).
		 * Configuration des metas disponibles :
		 * overlay-title : Permet de définir le titre du overlay (default = '')
		 * overlay-width : Défini la largeur du Panel (default = 50em)
		 * overlay-height : Défini la hauteur du Panel (default = 'auto')
		 * overlay-addCloseLink : Indique si un lien fermé doit être ajouté dans le footer du overlay (default : true)
		 * overlay-useSWFObject : Indique si le overlay utilise des objet flash - DEPRECATED pour la version 2, détection automatique intégré
		 * overlay-useTooltips: Indique l'utilisation de tooltip dans le panel (default : false) - DEPRECATED pour la version 2, ajouté un ID sur le script contenant le code
		 * overlay-useColapsedList: Indique l'utilisate de table calapse dans le panel - ajouté dans le cadre du projet Vidéotron (default : false)
		 *
		 * @param {DOMXml Object} oXML DOM Xml à utiliser pour le traitement. Normalement le documentElement du 
		 *							   responseXML de l'objet YAHOO.connection
		 *
		 * @return void
		 */
		this._metasConfigFromXML = function(oXML) {
			// Récupère les élements 'meta' dans le dom
			var metas = oXML.getElementsByTagName('meta');
			var metas_conf = [];
			var attrName = new String();
			var attrContent = new String();
			
			// Boucle pour récupérer les configurations
			for(var i=0; i<metas.length; i+=1) {
				// Récupère le name et le content du tag meta
				attrName = metas[i].getAttribute('name');
				attrContent = metas[i].getAttribute('content');
				// Si le name débute par overlay-
				if(/^overlay-/i.test(attrName)) {
					// Récupère la section pertinante du nom de la config à setter
					attrName = attrName.substring(8);
					// Si la configuration existe
					if(this.cfg.hasOwnProperty(attrName)) {
						// Assure une conversion propre en boolean pour les valeur "true" et "false"
						attrContent = (attrContent == "true") ? true : (attrContent == "false" ? false : attrContent);
						this.cfg[attrName] = attrContent;
					}
				}
			}
		};
	
		/**
		 * _testSWFScript est la méthode utilisé pour déterminé si le script swfobject.js est chargé et le chargé s'il ne l'est pas
		 *
		 * @return void
		 */
		this._testSWFScript = function () {
			if(typeof(swfobject) == 'undefined' || typeof(swfobject) != 'object') {
				// swfobject n'est pas défini ou n'est pas un objet, il faut donc charger le script
				var script = document.createElement("script");
				/*****
					::: TO DO ::: 
					Permettre la personnalisation du chemin d'accès du script swfobject.js
				*****/
				script.src = "/service/static/residentiel/js/swfobject.js";
				script.type = "text/javascript";
				script.onload = function (event) {
					that._parseForScriptTag();
				}
				// Récupère le header du document
				var hd = document.getElementsByTagName("head")[0];
				// Ajoute le script
				hd.appendChild(script);
			} else {
				that._parseForScriptTag();
			}
		};
		
		/**
		 * _parseForScriptTag est la méthode utilisé rechercher des script dans le document chargé et les ajoutés 
		 * au document courrant.
		 * Pour qu'un tag script soit tenue en compte et ajouté au document courant il doit avoir un id débutant 
		 * par extend-overlay- suivi d'un numréo N. i.e.: extend-overlay-1, extend-overlay-2, ..., extend-overlay-N
		 * 
		 * @return void
		 */
		this._parseForScriptTag = function () {
			// Si les script ont déjà été ajouté, retourne
			/*if(that._scriptIsWrited) {
				//console.log('script allready writted for this overlay!');
				//return true;
			}*/
			// Récupère les tag script
			var scripts = that.contentXML.getElementsByTagName('script');
			var container = document.getElementById(that.cfg.renderTarget);
			
			/**
			 * _hackEmbedSWF est une méthode utilisé pour tester si le script courrant utilise un swfobject.embedSWF
			 * Si le script utilise un embedSWF(), la script sera modifié pour utiliser un createSWF() puisque le
			 * embedSWF est exécuté uniquement sur le document.onload.
			 *
			 * ATTENTION : Pour que cette procédure fonctionne correctement, le call au embedSWF doit avoir tous les
			 * paramètre requis et optionnel du call. Au total 9 paramètre sont nécessaire pour reconstruire le createSWF()
			 * 
			 * @param {String} text Script à tester et à modifier si nécessaire
			 *
			 * @return {String} script altéré ou non
			 */
			var _hackEmbedSWF = function(text) {
				// Regular Expression qui permet de définir si un embedSWF est appellé dans le script
				var reg = /swfobject\.embedSWF\(([\s\S]*)\);/im;
				var matches = text.match(reg); // Test la RegExp et récupère tous les match
				var endObject = false;
				var curScript = false;
				// S'il y un call au emebedSWF le matches devrait contenir dans le [0] le script original et dans le [1] les paramètres du call
				if(matches && matches.length == 2) {
					curScript = matches[0];
					matches = matches[1].split(','); // Sépare les paramètres dans un array
					// Gestion des paramètre fesant parti d'un objet dans les paramètres
					for(var i=0;i<matches.length;i+=1) {
						matches[i] = matches[i].trim(); //Supprime les espaces innutiles
						// Si le paramètre débute par un { il s'agit de la déclaration d'un objet. Il faut donc trouver la fin de cet objet dans les paramètres qui suivent
						if(matches[i].substr(0,1) == '{') {
							var curI = i, endObject = false;
							// Gère le cas ou la fin de l'objet est dans la même valeur. Donc un seul paramètre passé à l'objet
							if(/\}$/.test(matches[i])) endObject = true;
							// Boucle pour trouver la fin de l'objet
							while(!endObject && i<matches.length) {
								i+=1;
								matches[i] = matches[i].trim(); // Supprime les espaces innutile
								// Si le paramètre courrant fini par }, la fin de l'objet a été trouvé
								if(/\}$/.test(matches[i])) endObject = true;
								// Ajoute le paramètre à la déclaration de l'objet
								matches[curI] += ',' + matches[i];
								// Marque le paramètre courrant comme étant supprimé
								matches[i] = '[[deleted]]';
								// Si la boucle tire à sa fin, arrêt forcé
								if(i ==  matches.length-1) break;
							}
						}
					}
					// Boucle pour récupérer seulement les 9 paramètres du embedswf bien structuré
					var result = [];
					for(var i=0; i<matches.length; i+=1) {
						matches[i] = matches[i].trim();
						if(matches[i] !== '[[deleted]]') result.push(matches[i]);
					}
					
					// Tous les paramètres du swfebmed() sont requis pour le bon fonctionnement de la conversion. Donc 9 au total. 
					// Si un paramètre est manquant, le traitement n'a pas lieu
					if(result.length == 9) {
						/*
							Séquence des informations passé au embedSWF et récupéré dans le result
							0 = swfUrlStr, 
							1 = replaceElemIdStr, 
							2 = widthStr, 
							3 = heightStr, 
							4 = swfVersionStr, 
							5 = xiSwfUrlStr, 
							6 = flashvarsObj, 
							7 = parObj, 
							8 = attObj
						*/
						// Construit la conversion du embedSWF en createSWF
						var replaceOutput = 'var _fvars = \'\'; for(var i in ' + result[6] + ') { _fvars += i + \'=\' + ' + result[6] + '[i] + \'&\';}';
						replaceOutput += 'if(swfobject.hasFlashPlayerVersion(' + result[4] + ')) {'; // Gestion de la version du plugin
						replaceOutput += 'var flashAttributes = ' + result[8] + ' || {};';
						replaceOutput += 'flashAttributes.data = ' + result[0] + ';';
						replaceOutput += 'flashAttributes.width = ' + result[2] + ';';
						replaceOutput += 'flashAttributes.height = ' + result[3] + ';';
						replaceOutput += 'flashAttributes.flashvars = _fvars;';
		
						replaceOutput += 'var flashParams = ' + result[7] + ';';
						replaceOutput += 'flashParams.flashvars = _fvars;';
						replaceOutput += 'var replaceContentId = ' + result[1] + ';';
						
						replaceOutput += 'var myObject = swfobject.createSWF(flashAttributes, flashParams, replaceContentId);';
						replaceOutput += '}';
						
						if(curScript) {
							that.cfg.effect = false; // Pas d'effet sur le overlay s'il contient un flash.
							// Assure que la config qui indique l'utilisation du embedswf est à true et que les évents sont associé au show - hide
							if(!that.cfg.useSWFObject) {
								that.cfg.useSWFObject = true;
								//Événement qui doit être activer lorsque le panel est affiché
								that.scope[that.panelName].showEvent.subscribe(function() {arguments[2].cfg.setProperty('fixedCenter', false);}, that.scope[that.panelName], true);
								//Événement qui doit être activer lorsque le panel est fermé
								that.scope[that.panelName].hideEvent.subscribe(function() {arguments[2].cfg.setProperty('fixedCenter', that.cfg.fixedCenter);}, that.scope[that.panelName], true);
								that.scope[that.panelName].cfg.setProperty('fixedCenter', false);
							}
							// Remplace la déclaration du embedSWF par le createSWF généré
							text = text.replace(curScript, replaceOutput);
						}
					}
				}
				// Retourne le script altéré ou non
				return text;

			};
			
			/**
			 * _hackEventListener est une méthode utilisé pour récupérer les Listener normalement ajouté à un Event.addListener de YAHOO
			 *
			 * ATTENTION : Pour que cette procédure fonctionne correctement, le call au addListener doit avoir au moins les 3 premiers
			 * paramètres. 1- l'objet, 2- L'event et 3- La fonction à exécuter
			 * 
			 * @param {String} code Script à tester et à modifier si nécessaire (i.e.: window)
			 * @param {String} ev Nom de l'événement à récupérer (i.e.: load)
			 *
			 * @return {String} script altéré ou non
			 */
			var _hackEventListener = function (code, ev) {
				// Regular Expression qui permet de définir si un embedSWF est appellé dans le script
				var reg = /YAHOO\.util\.Event\.addListener\(([^\)]*)\);/im;
				var matches = code.match(reg); // Test la RegExp et récupère tous les match
				var curScript = false;
				// S'il y un call au emebedSWF le matches devrait contenir dans le [0] le script original et dans le [1] les paramètres du call
				if(matches && matches.length == 2) {
					curScript = matches[0];
					matches = matches[1].split(','); // Sépare les paramètres dans un array
					
					if(matches.length >= 3) {
						for(var i=0;i<matches.length;i+=1) {
							matches[i] = matches[i].trim(); //Supprime les espaces innutiles
						}
						var re = new RegExp("('|\")" + ev + "\\1", "i");
						if(re.test(matches[1])) {
							var replaceOutput = matches[2] + '();';
							code = code.replace(curScript, replaceOutput);
						}
					}
				}
				return code;
			};
			
			// Si des scripts ont été trouvé et que le container (div du overlay) est défini 
			if(scripts && container) {
				// Boucle dans tous les éléments scripts trouvé
				for(var i=0; i < scripts.length; i++) {
					var id = scripts[i].getAttribute('id');
					// Test le ID, s'il débute par extend-overlay- suivi d'un numéro N, le script doit être ajouté au overlay
					if(id && typeof id == 'string' && /^extend-overlay-\d+$/i.test(id)) {
						// Ajoute le script au document dans le overlay
						var s = document.createElement("script");
						s.type = "text/javascript";
						s.text = _hackEmbedSWF(scripts[i].innerHTML || scripts[i].text);
						s.text = _hackEventListener(s.text, "load");
						
						container.appendChild(s);
						
					}
				}
			}
			// Indique que les scripts ont été traité pour l'overlay courrant
			that._scriptIsWrited = true;
		};
		
		
	/**********
		Public member
	**********/
			
		return {
			
			// Indique si le panel a déjà été chargé
			isLoaded: function() { return that._isLoaded;},
			// Définition du scope contenant tous les overlay, le wrapper, le manager, etc.
			scope: function() { return that.scope},
			
			/**
			 * Conf - Propriété (get|set) pour les différentes conffigurations du panel
			 *
			 * @param {String}  attr  Proprié (attribut) à configurer ou récupérer
			 * @param {String} value Valeur ou fonction a assigner à l'attribut 
			 * 						 (optionel) Si le value est défini, la méthode
			 *						 set sera utilisé et true sera retourné.
			 */
			conf: function(attr, value) {
				// GET
				if(!value) {
					if (typeof that.cfg[attr] != 'undefine') {
						var m = that.cfg[attr];
						if(m.call) {
							return m.call();
						} else if (window[that.cfg[attr]] && window[that.cfg[attr]].call) {
							return window[that.cfg[attr]].call();
						} else {
							return that.cfg[attr];
						}
					} else {
						return;
					}
				// SET
				} else {
					that.cfg[attr] = value;
					return true;
				}
			},

			/**
			 * show Méthode utilisé pour afficher le panel
			 *
			 * @return void
			 */
			show: function() {
				// Si le panel n'a pas encore été chargé
				
				if(!this.isLoaded() || that.hookedElement.tagName == "FORM") {
					that.hideAllPanels();
					// Si le type est remote et que le preloader doit être affiché
					if(this.conf('contentType') == 'remote' && this.conf('useRemotePreLoader')) {
						// Méthode exécuté avant le chargement extérieur du contenue
						that._beforeRemoteLoad();
					} else {
						// Méthode exécuté avant l'exécution de la fonction de récupération du contenue (sans AJAX)
						that._beforeLoad();
					}
					
				// Le panel est déjà chargé et en mémoire, affiche le panel
				} else {

					that.displayPanel();
				}

			},
			
			
			/**
			 * toString Méthode utilisé pour identifer l'objet
			 *
			 * @return {String} identifiant du prototype de l'objet
			 */
			toString: function() {
				return "Object widget.overlay";
			},
			
			setSubmittedId: function(id){
				that.submittedId = id;
			}
			
			
		};

};


// ------[ WIDGET REMOTE LOAD V2 ]------------------------------------------------- //
/**
 * Remote Load creates a YUI panel whose contents are drawn from an
 * anchor's target page. The target page is expected to have one form
 * within it. The code hooks into all anchors on a page
 * with a given class name and overrides their default behaviour by
 * loading the contents of their target page into a YUI panel instead.
 *
 * @param {Object}  UserConfig  An object containing values that will
 *                              override Remote Load's default 
 *                              config values
 */
VIDEOTRON.widget.remoteLoad = function (userConfig) {

	/**********
		Private member
	**********/
		// Définie une variable global pour garder une référence à tous les liens qui sont géré par tous les objets remoteLoad
		if(typeof window.__remoteLoadRef__ == 'undefined') window.__remoteLoadRef__ = [];
		
		var that = this; //Référence à l'object lui même
		// Ajoute une référence à cette objet dans les références global
		window.__remoteLoadRef__.push(this);

		this._lnks = []; // Collection des liens/form remoteLoad

		/* Défini les configs initial */
	    this.cfg = {
	        hookClassName: ['remoteLoad'], // Class recherché par défaut
	        hookNodeName: ['a','area','form'],    // TagName recherché par défaut
	        root: document.body,		   // Node à root pour la recherche des nodes
			defaultLang: null, 			   // Langue par défaut à utiliser (null = détection auto || fr || en)
			overlayBaseName: 'overlay-panel-', // Base des id qui sont généré pour les overlays
			effect: {effect:YAHOO.widget.ContainerEffect.FADE,duration:0.5}
			
	    };
		// Récupère les configs initial passé en paramètre
	    for (var key in userConfig) {
	        if (userConfig.hasOwnProperty(key)) {
	            this.cfg[key] = userConfig[key];
	        }
	    }
		
		// Si la langue par défaut n'est pas définie ou différent de fr et en, définie la langue à partir de l'attribut lang du tag <html>
		if(!this.cfg.defaultLang || this.cfg.defaultLang !== 'fr' || this.cfg.defaultLang !== 'en') this.cfg.defaultLang = document.documentElement.lang;
			
		/* Récupère la langue de la page courante */
		var curDocLang = document.body.className.substring(0,2);

		// Définition des labels initiaux pour le français
		this.fr = {
			'xCloseLabel': 'Fermer',
			'xCloseTitle': 'Fermer',
			'btnCloseCaption': 'Fermer',
			'titlePreloader': 'Chargement...'
		};

		// Définition des labels initiaux pour l'anglais
		this.en = {
			'xCloseLabel': 'Close',
			'xCloseTitle': 'Close',
			'btnCloseCaption': 'Close',
			'titlePreloader': 'Loading...'
		};

		// Définition de l'objet dictionnaire lang
		this.lang = {
			lbl: ((that.cfg.defaultLang === 'en') ? this.en : this.fr), // Initilise les libellé en fonction de la langue par défaut
			lang: that.cfg.defaultLang,
			/**
			 * addLabel permet d'ajouter des libellé au dictionnaire
			 *
			 * @param {String} name Nom du libellé à ajouter
			 * @param {String} value Valeur du libellé
			 *
			 * @return void
			 */
			addLabel: function(name, value) {
				this.lang[name] = value;
			}
		};

		// Collections des overlays qui sont chargé
		this.overlays = [];
		
		// Gestion du browser history
		
		if(typeof this._defaultState === 'undefined') {
		    this._defaultState = 'none'; // Le targetIs est utilisé pour le state du panel (none = toute fermé, un id ouvre le panel qui si ratache)
		    this._bookmarkedState = YAHOO.util.History.getBookmarkedState("cpnl");
		    this._initialState = this._bookmarkedState || this._defaultState;
	
			this.manageLinks = function (state)  {
				//console.debug("in manageLinks " + state);
		        // This is called after calling YAHOO.util.History.navigate, or after the user
		        // has trigerred the back/forward button. We cannot discrminate between
		        // these two situations.
				// console.debug("StateChange to : " + state);
				var rl = arguments[1];
		        // Show the right overlay according to the "state" parameter:
				for(var i=0; i<rl._lnks.length; i+=1) {
					if(rl._lnks[i].targetId == state) {
						if(typeof rl._lnks[i].overlay == 'undefined') {
							// Crée un nouveau panel pour le lien/form
							rl._lnks[i].overlay = new VIDEOTRON.widget.Overlay(rl.cfg, rl._lnks[i], rl);
							// Ajoute le panal à la collection de overlay
							rl.overlays.push(rl._lnks[i].overlay);
						}
						rl._lnks[i].overlay.show();
						break;
					} else {
						//console.debug("else");
						/*if(rl._lnks[i].overlay ){
							console.dir(rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId].subPanel.getThat());
						}*/
						if(rl._lnks[i].overlay){// && rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId].isVisible) {
							//if(console) console.debug(rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId]);
							//alert(rl._lnks[i].overlay.hide);
							that.hideAllSubPanel(rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId]);
							
							if (rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId].isVisible)
								rl._lnks[i].overlay.scope()['_panel_' + rl._lnks[i].targetId].hide();
						}
					}
				}
		    };
		 
			this.hideAllSubPanel = function (overlay){
//				console.debug ("hide subpanels ");
				subPanel = overlay.subPanel.getThat();
				for (var spln = 0 ; spln < subPanel._lnks.length ; spln++){
					if (subPanel._lnks[spln].overlay && subPanel.overlays[spln] && subPanel.overlays[spln].isLoaded()){
						that.hideAllSubPanel(subPanel._lnks[spln].overlay.scope()['_panel_' + subPanel._lnks[spln].targetId])
					}
				}
				if (overlay.isVisible){
					overlay.hide();
					
				}
			}

		    // Use the Browser History Manager onReady method to initialize the application.
		    this.manageOnReady = function () {
		        var currentState;
				//alert('onReady trigered!');
		        currentState = YAHOO.util.History.getCurrentState("cpnl");
				if(currentState !== 'none') {
					var rl = arguments[2];
					for(var i=0; i<rl._lnks.length; i+=1) {
						if(rl._lnks[i].targetId == currentState) {
							if(typeof rl._lnks[i].overlay == 'undefined') {
								// Crée un nouveau panel pour le lien/form
								rl._lnks[i].overlay = new VIDEOTRON.widget.Overlay(rl.cfg, rl._lnks[i], rl);
								// Ajoute le panal à la collection de overlay
								rl.overlays.push(rl._lnks[i].overlay);
							}
							rl._lnks[i].overlay.show();
							break;
						}
					}
				}
		    }
		    
		    // Register le module des overlay sous le nom de cpnl
		    YAHOO.util.History.register("cpnl", this._initialState, that.manageLinks, that,true);
		    // Initialize the browser history management library.
		    YAHOO.util.History.onReady(that.manageOnReady, that);

			
		}		
	   
	/**********
		Public member
	**********/
		return {
			getThat: function (){
				return that;
			},
			// Référence au dictionnaire privé
			lang: that.lang,
			// Référence à la collection de overlay
			overlays: function() { return that.overlays},

			/**
			 * init Exécution automatique pour initialisé les fonctionnalité du remoteLoad.
			 *
			 * @return true
			 */
			init: (function() {
				
				/**
				 * displayOverlay event Onclick ajouté à tous les liens/form .remoteLoad
				 *
				 * @return {Function} click event
				 */
				var displayOverlay = function(rl) {
					return function(e) {
						var overlayForceNav = false;
						// Annule les fonctionnalité par défaut du lien ou le submit du form
			            YAHOO.util.Event.preventDefault(e);
						// Si l'overlay pour se lien/form n'a pas encore été chargé
						if(typeof this.overlay == 'undefined') {
							// Cherche si un autre overlay a précédement été définie pour le même lien que celui ci
							var curOverlay;
							//console.group('current _lnks');
							for(var o = 0; window.__remoteLoadRef__[o]; o+=1) {
								if(window.__remoteLoadRef__[o]._lnks.length) {
									for(ln = 0; window.__remoteLoadRef__[o]._lnks[ln]; ln+=1) {
										if(window.__remoteLoadRef__[o]._lnks[ln].href && window.__remoteLoadRef__[o]._lnks[ln].href == this.href) {
											//console.debug('href = ' + window.__remoteLoadRef__[o]._lnks[ln].href);
											this.targetId = window.__remoteLoadRef__[o]._lnks[ln].targetId;
											this.overlay = window.__remoteLoadRef__[o]._lnks[ln].overlay;
											//console.debug('found - break the loop');
											break;
										}
									}
								}
								if(typeof this.overlay != 'undefined') break;
								//console.debug('loop ' + o);
								//console.dir(window.__remoteLoadRef__[o]._lnks);
							}
							//console.groupEnd();
							if(typeof this.overlay == 'undefined') {
								// Crée un nouveau panel pour le lien/form
								this.overlay = new VIDEOTRON.widget.Overlay(that.cfg, this, rl);
								// Ajoute le panel à la collection de overlay
								rl.overlays.push(this.overlay);
							}
						}

				        var newState = this.targetId;
						
						if(e.type !== 'submit' && !newState.match(/(-[0-9]+){2,}$/)) {
					        try {
					            var currentState = YAHOO.util.History.getCurrentState("cpnl");
					            // The following test is crucial. Otherwise, we end up circling forever.
					            // Indeed, YAHOO.util.History.navigate will call the module onStateChange
					            // callback, which will call createCalendar, which will call calendar.render(),
					            // which will end up calling handleCalendarBeforeRender, and it keeps going
					            // from here...
					            if (newState !== currentState) {
					                YAHOO.util.History.navigate("cpnl", newState);
					            } else {
									this.overlay.show();
								}
					        } catch (e) {
					            this.overlay.show();
					        }
						} else {
							this.overlay.show();
							//this.overlay.setSubmittedId (newState);
						//	rl.manageLinks(newState, rl);
						}
					};
				};
				
				// Boucle dans tous les class à gérer comme étant remoteLoad
				for(var cn=0; that.cfg.hookClassName[cn]; cn+=1) {
					// Boucle dans tous les types de tag à appliquer un remoteLoad
					for(var nn=0; that.cfg.hookNodeName[nn]; nn+=1) {
						// Récupère les éléments avec correspondant au class et au tagname
					    var tmpLnks = YAHOO.util.Dom.getElementsByClassName(that.cfg.hookClassName[cn], that.cfg.hookNodeName[nn], that.cfg.root);
						// Boucle pour ajouter les éléments à la collection d'objet géré
						for(var l=0; tmpLnks[l]; l+=1) that._lnks.push(tmpLnks[l]);
					}
				}
				//console.dir(window.__remoteLoadRef__);
				// Boucle dans tous les objets géré pour ajouter les événement onclick ou onsubmit
			    for (var i = 0; that._lnks[i]; i += 1) {
					that._lnks[i].targetId = that.cfg.overlayBaseName + i;	
					var ev = ((that._lnks[i].tagName == 'A')||(that._lnks[i].tagName == 'AREA')) ? 'click' : 'submit';
					// Ajoute un event listener pour l'objet
			        YAHOO.util.Event.on(that._lnks[i], ev, displayOverlay(that));
			    }
				return true;
			})(),
			
			/**
			 * toString Méthode utilisé pour identifer l'objet
			 *
			 * @return {String} identifiant du prototype de l'objet
			 */
			toString : function() {
				return '[Object widget.remoteLoad]';
			}
		};
};

// ------[ WIDGET DIALOG ]------------------------------------------------- //
/**********
	***** VIDEOTRON.widget.Dialog PAS ENCORE UTILISÉ N'Y COMPLÉTÉ *****
**********/
/**
 * Remote Load creates a YUI panel whose contents are drawn from an
 * anchor's target page. The target page is expected to have one form
 * within it. The code hooks into all anchors on a page
 * with a given class name and overrides their default behaviour by
 * loading the contents of their target page into a YUI panel instead.
 *
 * @param {Object}  UserConfig  An object containing values that will
 *                              override Remote Load's default 
 *                              config values
 */
VIDEOTRON.widget.Dialog = function (dialogConfig) {

	/**********
		Private member
	**********/
		var that = this; //Référence à l'object lui même

		// Crée le Namespace de travail (scope global à tous les dialogs)
		if(!YAHOO.custom || !YAHOO.custom.dilogs) {
			this.scope = YAHOO.namespace('custom.dialogs');
		} else {
			this.scope = YAHOO.custom.dialogs;
		}

		// Crée un div qui sert de wrapper au différent overlay du scope
		if(!this.scope.wrapper) {
			this.scope.wrapper = document.createElement('div');
			this.scope.wrapper.id='custom-dialogs-wrapper';
			document.body.appendChild(this.scope.wrapper);
		}

		// Configuration initial par défaut
		this.cfg = {
			/**
			 * ID {String} Identifiant du container du dialog
			 * Optionnel : Identifiant par défaut du dialog.
			 * Défaut : simple-dialog
			 **/
	        id: "simple-dialog",

			/**
			 * renderTarget {Object} Noeud du DOM qui sert de point d'origine pour le rendering du dialog et la recherche des éléments
			 * Optionnel : Le noeud sert de point d'origine pour l'insertion du code.
			 * Défaut : document.body
			 **/
	        renderTarget: document.body,
			
			/**
			 * title {String} Titre du dialog
			 * Optionnel
			 * Défaut : ""
			 **/
			title: "",
			
			/**
			 * Text {String} Texte à afficher dans le dialog
			 * Optionnel
			 * Défaut : ""
			 **/
			text: "",
			
			/**
			 * width {Integer} largeur total du dialog
			 * Optionnel
			 * Défaut : 40em - Éviter les mesures en pourcentage (%).
			 **/
			width: "40em",
			
			/**
			 * height {Integer} hauteur total du dialog
			 * Optionnel
			 * Défaut : auto - Éviter les mesures en pourcentage (%).
			 **/
			height: 'auto',
			
			/**
			 * fixedCenter {Boolean} Indique si le dialog doit être centré
			 * Optionnel : Positionne le dialog au centre de l'espace visible à l'écran et le conserve centré même si l'utilisateur scroll le contenue
			 * Défaut : true
			 **/
			fixedCenter: true,
			
			/**
			 * dragable {Boolean} Indique si le dialog peut être déplacé par l'utilisateur
			 * Optionnel : Permet à l'utilisateur de déplacer la fenêtre avec la souris
			 * Défaut : false
			 **/
			dragable: false,
			
			/**
			 * showCloseX {Boolean} Permettre la fermeture du panel
			 * Optionnel : Fait référence à la propriété 'close' du panel.
			 * Défaut : true
			 **/
			showCloseX: true, 
			
			/**
			 * modal {Boolean} Indique si le dialog est modal ou pas
			 * Optionnel : Ajoute un mask qui couvre tout le contenue et gère les click pour prévenir toute action sur le contenu 
			 *             à l'extérieur du dialog lorsqu'il est affiché.
			 *			   Lorsque définie à true, le code en cours d'exécution est interompu jusqu'a la fermeture du dialog.
			 * Défaut : true
			 **/
			modal: true,
			
			/**
			 * listener {Object} Objet contenant l'information pour l'ajout du listener pour l'affichage du dialogue
			 * Requis : Information pour l'ajout du listener sur l'événement et l'objet qui affichera le dialog
			 *			L'objet contient 5 propriétés qui indentifi le(s) élements affecté, le type d'évéenement à gérer, 
			 *			la méthode pour le callback de l'événement, l'objet à passer en paramètre à la méthode et l'override
			 *			Structure de l'objet :
			 *			el {String | HTMLElement | Array | NodeList} Un Id, une référence à un élément, une collection de Id et/ou d'élément à appliquer.
			 *			   Requis
			 *			sType {String} Le type d'événement à appliquer
			 *			   Requis
			 *			fn {Function} Méthode qui sera invoqué en callback de l'événement.
			 *			   Requis
			 *			obj {Object} Un objet qui sera passé en paramètre au gestionnaire.
			 *			   Optionnel
			 *			override {Boolean | object} Si true, obj devient le scope d'exécution du listener. Si un objet, l'objet devient le scope d'exécution.
			 *			   Optionnel
			 *			   Défaut : false
			 * Défaut : N/A
			 **/
			listener: {
				 el: '',
				 sType: '',
				 fn: function(){},
				 obj: {},
				 override: false
			},
			
			/**
			 * buttons {Boolean | Array} Indique les boutons à afficher dans le 
			 * Optionnel : Ajoute un mask qui couvre tout le contenue et gère les click pour prévenir toute action sur le contenu 
			 *             à l'extérieur du dialog lorsqu'il est affiché.
			 *			   Lorsque définie à true, le code en cours d'exécution est interompu jusqu'a la fermeture du dialog.
			 * Défaut : true
			 **/
			buttons: 0
		};

		// Récupère les configs initial passé en paramètre
	    for (var key in dialogConfig) {
	        if (dialogConfig.hasOwnProperty(key)) {
	            this.cfg[key] = dialogConfig[key];
	        }
	    }
		
	/**********
		Public member
	**********/
		return {
		};
};
// Mode d'affichage des dialogs
VIDEOTRON.widget.Dialog.DMODE_YES_NO = 0;
VIDEOTRON.widget.Dialog.DMODE_OK = 2;
VIDEOTRON.widget.Dialog.DMODE_OK_CANCEL = 4;

