/* JS Document pour les pages du Parlement europeen */
/* Scripts permettant differentes manipulations de l'affichage des balises */

/* ======================================================================================================== */
/* ACTIVATION DES SCRIPTS ================================================================================= */
/* ======================================================================================================== */
	var managetag_js			= true;

/* ======================================================================================================== */
/* SwitchClass ============================================================================================ */
/* ======================================================================================================== */
/* Classe JS permettant le changement de classes CSS suite a une action de "clic" */

	function SwitchClass(CallbackAfterInit){
		// Parametres autorises lors de la creation de la classe JS:
			//	CallbackAfterInit			:Function		>> fonction a appeler apres que la modification soit effectuee
		// Parametres autorises lors de l'ajout d'evenement JS (addEventFct):
			// 	IDlink						:String/Object	>> id de la balise "bouton" cible ou reference directe de la balise
			//	IDtarget					:Array			>> liste d'id de balises "contenu" cibles ou de la reference directe aux balises et classes a associer
			//	INITApply					:Boolean		>> autorisation du lancement du changement d'affichage apres l'initialisation
			//	ACTIVATEinside				:Boolean		>> autorisation du lancement du changement d'affichage si le focus est dans une zone de contenu concerne
			//	EraseDefaultAction			:Boolean		>> indicateur du blocage de l'action du lien par defaut
			//	CallbackBefore				:Function		>> fonction a appeler avant que la modification soit effectuee
			//	CallbackAfter				:Function		>> fonction a appeler apres que la modification soit effectuee
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Classe utilisee
			// HTManager					>> htmanager.js
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Exemple d'utilisation
			//	var s = new SwitchClass(true);
			//	s.addEventFct("ID bouton", [{id:"ID balise cible", csstarget:"CSS a utiliser pour la cible"}], true, false, false, null, null);
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Variables
		var This;
		var Html;
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant l'action aux boutons
		this.addEventFct = function(IDlink, IDtarget, INITApply, ACTIVATEinside, EraseDefaultAction, CallbackBefore, CallbackAfter){
			bKeyEvent = false;
			if(typeof(htmanager_js) == "boolean" && htmanager_js){
				// Sauvegarde des references
				This		= this;
				Html		= new HTManager();
				// Analyse du type d'identification choisi
				IDlink		= (typeof(IDlink) == "string")? document.getElementById(IDlink) : IDlink;
				// Verification de l'existence du lien demande et du nombre de balises associees
				if(Html.check(IDlink) && IDtarget.length > 0){
					// Traitement des ID des blocs associes
					var A				= new Array();
					var m				= IDtarget.length;
					for(var i = 0; i < m; i++){
						IDtarget[i].id	= (typeof(IDtarget[i].id) == "string")? document.getElementById(IDtarget[i].id) : IDtarget[i].id;
						if(Html.check(IDtarget[i].id)) A.push(IDtarget[i]);
					}
					// Verification de la quantite de liens valide
					if(A.length > 0){
						// Ajout de l'action sur le lien
						Html.addEvent(IDlink, "click", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter); }, EraseDefaultAction);
						// Ajout des fonctionnalites pour l'ouverture interne
						m					= 0;
						if(ACTIVATEinside){
							var r;
							var n;
							var j;
							var a			= new Array();
							m				= A.length;
							for(i = 0; i < m; i++){
								r			= A[i].id.getElementsByTagName("a");
								n			= r.length;
								for(j = 0; j < n; j++){	a.push(r[j]);	}
								r			= A[i].id.getElementsByTagName("input");
								n			= r.length;
								for(j = 0; j < n; j++){	a.push(r[j]);	}
								r			= A[i].id.getElementsByTagName("select");
								n			= r.length;
								for(j = 0; j < n; j++){	a.push(r[j]);	}
								r			= A[i].id.getElementsByTagName("textarea");
								n			= r.length;
								for(j = 0; j < n; j++){	a.push(r[j]);	}
								r			= A[i].id.getElementsByTagName("button");
								n			= r.length;
								for(j = 0; j < n; j++){	a.push(r[j]);	}
							}
							m				= a.length;
							for(i = 0; i < m; i++){
								Html.addEvent(a[i], "focus", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter); }, false);
							}
						}
						if((!ACTIVATEinside || m <= 0) && String(IDlink.tagName).toLowerCase() != "a" && String(IDlink.tagName).toLowerCase() != "input"){
							// Ajout du lien dans la liste des tabulations
							IDlink.tabIndex	= 0;
							// Ajout de l'action sur le lien
							Html.addEvent(IDlink, "keypress", function(e){	
								var nK	= Html.getKey(e);	
								if(nK == 13 || nK == 32) This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter);
							}, EraseDefaultAction);
						}
						// Verification de la demande d'initialisation de la classe
						if(typeof(INITApply) == "boolean" && INITApply == true) This.launchSwitch(IDlink, IDtarget, null, CallbackAfterInit);
					}
				}
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction initialisant la demande
		this.launchSwitch = function(ThisLink, aIDtarget, fCallbackBefore, fCallbackAfter){
			// Appel de l'action callback
			var bF		= (fCallbackBefore != null && typeof(fCallbackBefore) == "function")? fCallbackBefore(ThisLink) : true;
			// Lancement de l'action changement de classe
			if(bF) bF	= This.switcher(aIDtarget);
			// Appel de l'action callback
			if(!bF && fCallbackAfter != null && typeof(fCallbackAfter) == "function") fCallbackAfter(ThisLink);
			// Envoi du retour
			return(false);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction modifiant l'affichage des balises
		this.switcher = function(A){
			var m		= A.length;
			var bOk		= true;
			for(var t = 0; t < m; t++){
				if(typeof(A[t]) == "object" && A[t] != null){
					bOk					= false;
					A[t].id.className 	= A[t].csstarget;
				}
			}
			return(bOk);
		};
	};

/* ======================================================================================================== */
/* DisplayControl ========================================================================================= */
/* ======================================================================================================== */
/* Classe JS permettant l'ouverture et la fermeture d'elements via un bouton [+]/[-] */

	function DisplayControl(){
		// Parametres autorises lors de l'ajout d'evenement JS (addEventFct):
			// 	IDlink						:Object			>> id de la balise "bouton" cible ou reference directe de la balise et classes a associer
			//	IDtarget					:Array			>> liste d'id de balises "contenu" cibles ou de la reference directe aux balises et classes a associer
			//	AUTOclose					:Boolean		>> autorisation du lancement du changement d'affichage apres l'initialisation
			//	OPENinside					:Boolean		>> autorisation de l'ouverture du panneau si le focus entre dans les balises de contenu
			//	EraseDefaultAction			:Boolean		>> autorisation d'ecrasement des fonctions initiales
			//	BLURclose					:Boolean		>> autorisation de la fermeture du panneau si la balise perd le focus
			//	CallbackBefore				:Function		>> fonction a appeler avant que la modification soit effectuee
			//	CallbackAfter				:Function		>> fonction a appeler apres que la modification soit effectuee
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Classe utilisee
			// HTManager					>> htmanager.js
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Exemple d'utilisation
			//	var s = new DisplayControl(true);
			//	s.addEventFct(	{id:"ID bouton", cssopen:"CSS pour le [-]", cssclose:"CSS pour le [+]"}, 
			//					[{id:"ID balise cible", cssopen:"CSS developpe", cssclose:"CSS reduit"], 
			//					false, true, false, false, null, null);
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Variables
		var This;
		var Html;
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant l'action aux boutons
		this.addEventFct = function(IDlink, IDtarget, AUTOclose, OPENinside, EraseDefaultAction, BLURClose, CallbackBefore, CallbackAfter){
			if(typeof(htmanager_js) == "boolean" && htmanager_js){
				// Sauvegarde des references
				This		= this;
				Html		= new HTManager();
				// Verification des informations envoyees
				if(typeof(IDlink) == "object" && IDtarget.length > 0){
					// Analyse du type d'identification choisi
					IDlink.id				= (typeof(IDlink.id) == "string")? document.getElementById(IDlink.id) : IDlink.id;
					if(Html.check(IDlink.id)){
						// Traitement des ID des blocs associes
						var A					= new Array();
						var m					= IDtarget.length;
						var i;
						for(i = 0; i < m; i++){
							IDtarget[i].id		= (typeof(IDtarget[i].id) == "string")? document.getElementById(IDtarget[i].id) : IDtarget[i].id;
							if(Html.check(IDtarget[i].id)) A.push(IDtarget[i]);
						}
						// Verification de la quantite de liens valide
						if(A.length > 0){
							// Suppression des liens internes du bouton
							var j;
							var n;
							var a				= IDlink.id.getElementsByTagName("a");
							if(a.length > 0){
								m				= a.length;
								for(i = 0; i < m; i++){
									j			= Html.createNode("span", {className:a[i].className}, Html.cleanText(a[i].innerHTML));
									n			= a[i].parentNode;
									n.insertBefore(j, a[i]);
									n.removeChild(a[i]);
								}
							}
							// Initialisation du design
							IDlink.id.className	+= (String(IDlink.id.className).length > 0)? " " + IDlink.cssopen: IDlink.cssopen;
							// Ajout de l'action sur le lien
							Html.addEvent(IDlink.id, "click", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter, -1); }, EraseDefaultAction);
							// Ajout des fonctionnalites pour l'ouverture interne
							m					= 0;
							if(OPENinside){
								var r;
								a				= new Array();
								m				= A.length;
								for(i = 0; i < m; i++){
									r			= A[i].id.getElementsByTagName("a");
									n			= r.length;
									for(j = 0; j < n; j++){	a.push(r[j]);	}
									r			= A[i].id.getElementsByTagName("input");
									n			= r.length;
									for(j = 0; j < n; j++){	a.push(r[j]);	}
									r			= A[i].id.getElementsByTagName("select");
									n			= r.length;
									for(j = 0; j < n; j++){	a.push(r[j]);	}
									r			= A[i].id.getElementsByTagName("textarea");
									n			= r.length;
									for(j = 0; j < n; j++){	a.push(r[j]);	}
									r			= A[i].id.getElementsByTagName("button");
									n			= r.length;
									for(j = 0; j < n; j++){	a.push(r[j]);	}
								}
								m				= a.length;
								if(BLURClose){
									for(i = 0; i < m; i++){
										Html.addEvent(a[i], "focus", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter, 1); }, false);
										Html.addEvent(a[i], "blur", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter, 0); }, false);
									}
								}else{
									for(i = 0; i < m; i++){
										Html.addEvent(a[i], "focus", function(){ This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter, 1); }, false);
									}
								}
							}
							if((!OPENinside || m <= 0) && String(IDlink.id.tagName).toLowerCase() != "a" && String(IDlink.id.tagName).toLowerCase() != "input"){
								// Ajout du lien dans la liste des tabulations
								IDlink.id.tabIndex	= 0;
								// Ajout de l'action sur le lien
								Html.addEvent(IDlink.id, "keypress", function(e){	
									var nK	= Html.getKey(e);	
									if(nK == 13 || nK == 32) This.launchSwitch(IDlink, A, CallbackBefore, CallbackAfter, -1);
								}, EraseDefaultAction);
							}else if(OPENinside && BLURClose && m > 0){
								// Suppression de la tabulation
								IDlink.id.tabIndex	= -1;
							}
						}
						// Verification de la demande de fermeture automatique
						if(typeof(AUTOclose) == "boolean" && AUTOclose == true) This.launchSwitch(IDlink, IDtarget, null, null, 0);
						else This.launchSwitch(IDlink, IDtarget, null, null, 1);
					}
				}
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction initialisant la demande
		this.launchSwitch = function(ThisLink, aIDtarget, fCallbackBefore, fCallbackAfter, e){
			// Appel de l'action callback
			var bF		= (fCallbackBefore != null && typeof(fCallbackBefore) == "function")? fCallbackBefore(ThisLink.id) : true;
			// Lancement de l'action changement de classe
			if(bF) bF	= This.switcher(ThisLink, aIDtarget, e);
			// Appel de l'action callback
			if(!bF && fCallbackAfter != null && typeof(fCallbackAfter) == "function") fCallbackAfter(ThisLink.id);
			// Envoi du retour
			return(false);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction modifiant l'affichage des balises
		this.switcher = function(L, A, e){
			// Analyse du type d'affichage > ouverture du contenu ?
			var bO		= (e != -1)? Boolean(e) : Boolean(String(L.id.className).match(L.cssclose));
			// Traitement des blocs de contenu
			var m		= A.length;
			var bOk		= true;
			for(var t = 0; t < m; t++){
				if(typeof(A[t]) == "object" && A[t] != null){
					bOk				= false;
					if(Html.check(A[t].id)){
						A[t].id.className 			= String(A[t].id.className).replace((A[t].cssopen.length > 0)? " " + A[t].cssopen : "", "").replace(A[t].cssopen, "").replace(" " + A[t].cssclose, "").replace(A[t].cssclose, "");
						A[t].id.className 			= String(A[t].id.className).replace((A[t].cssclose.length > 0)? " " + A[t].cssclose : "", "").replace(A[t].cssclose, "");
						if(bO) 	A[t].id.className	+= (String(A[t].id.className).length > 0)? " " + A[t].cssopen : A[t].cssopen;
						else	A[t].id.className 	+= (String(A[t].id.className).length > 0)? " " + A[t].cssclose : A[t].cssclose;
					}
				}
			}
			// Traitement du lien
			if(!bOk){
				L.id.className 			= String(L.id.className).replace((L.cssopen.length > 0)? " " + L.cssopen : "", "").replace(L.cssopen, "")
				L.id.className 			= String(L.id.className).replace((L.cssclose.length > 0)? " " + L.cssclose : "", "").replace(L.cssclose, "");
				if(bO) 	L.id.className 	+= (String(L.id.className).length > 0)? " " + L.cssopen: L.cssopen;
				else	L.id.className 	+= (String(L.id.className).length > 0)? " " + L.cssclose: L.cssclose;
			}
			// Envoi de l'autorisation sur la suite du processus
			return(bOk);
		};
	};

/* ======================================================================================================== */
/* FieldMessage =========================================================================================== */
/* ======================================================================================================== */
/* Classe JS gerant l'affichage du message par defaut des balises "input" et "textarea" */

	function FieldMessage(){
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant l'action aux boutons
		this.addEventFct = function(ID){
			// Verification a l'acces aux scripts de gestion et creation
			if(typeof(htmanager_js) == "boolean" && htmanager_js){
				// Sauvegarde des references
				This		= this;
				Html		= new HTManager();
				// Identification du menu
				var m		= (typeof(IDselect) == "string")? document.getElementById(ID) : ID;
				if(Html.check(m)){
					if((String(m.tagName).toLowerCase() == "input" && m.type == "text") || String(m.tagName).toLowerCase() == "textarea"){
						// Ajout des evenements
						Html.addEvent(m, "click", function(){ 	This.removetext(m); });
						Html.addEvent(m, "focus", function(){ 	This.removetext(m); });
						Html.addEvent(m, "blur", function(){ 	This.addtext(m); 	});
						// Lancement automatique
						This.addtext(m);
					}
				}
			};
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant le texte au champ si le contenu est vide
		this.addtext = function(tag){
			// Nettoyage du style
			tag.className		= String(tag.className).replace(" ep_default", "").replace("ep_default", "");
			// Analyse du texte
			if(tag.value == "" || tag.value == tag.title){
				// Ajout de la classe
				tag.className	+= (tag.className.length > 0)? " ep_default" : "ep_default";
				// Integration du texte
				(String(tag.tagName).toLowerCase() == "input")? tag.value = tag.title : tag.innerHTML = tag.title;
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction supprimant le texte par defaut si le contenu est vide
		this.removetext = function(tag){
			// Nettoyage du style
			tag.className		= String(tag.className).replace(" ep_default", "").replace("ep_default", "");
			// Analyse du texte
			if(tag.value == "" || tag.value == tag.title){
				(String(tag.tagName).toLowerCase() == "input")? tag.value = "" : tag.innerHTML = "";
			}
		};
	};

/* ======================================================================================================== */
/* SelectConvert ========================================================================================== */
/* ======================================================================================================== */
/* Classe JS gerant la convertion des balises <select> pour la suppression du bouton d'envoi et le redesign de la liste */

	function SelectConvert(){
		// Parametres autorises lors de l'ajout d'evenement JS (addEventFct):
			// 	IDmenu						:String/Object	>> id de la balise "formulaire" contenant le selecteur
			//	IDselect					:String/Object	>> id de la balise "select" a traiter
			//	IDbutton					:String/Object	>> id du bouton "submit" du formulaire
			//	AUTOsubmit					:Boolean		>> autorisation de suppression du bouton submit et lancement du formulaire
			//	IDindex						:Array			>> liste des balises a qui attribuer un index pour l'affichage
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Classe utilisee
			// HTManager					>> htmanager.js
			// DisplayControl				>> managetag.js
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Exemple d'utilisation
			//	var s = new SelectConvert();
			//	s.addEventFct("ID formulaire", "ID balise <select>", "ID balise du bouton <submit>", "Lancement de l'action du formulaire", liste des balises dont le z-index doit etre mis a jour);
			//	Si le champ "select" a la classe CSS "ep_empty", le champ sera vide par defaut
			//	Si le champ "select" a comme premiere option la valeur "select_defaultvalue", qu'aucune option n'est selectionnee, le texte de l'option sera affiche
			// - - -
			// Pour reinitialiser le conteneur
			// 	s.reset("ID du champ cache")
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Utilisation avancee (
			// Tous les parametres sont passes via un 6e argument de type "Array"
			// Dans les presentations si dessous, seul les parametres utiles sont remplis et specifies
			// - - -
			// 		Si la balise <select> a été générée entièrement depuis un autre script JS
			// 			ajouter un 6e parametre de type tableau contenant la valeur : [true]
			//			s.addEventFct("ID formulaire", "ID balise <select>", "ID balise du bouton <submit>", "Lancement de l'action du formulaire", liste pour les z-index, [true]);
			// - - -
			// 		Pour appeler une fonction JS lors du choix d'un element
			// 			ajouter un 6e parametre de type tableau contenant les valeurs : [	false, 
			//																				fct à appeler (type Function),  
			//																				autorisation de l'appel d'une fonction JS au lieu du submit (type Boolean)]
			//			s.addEventFct("ID formulaire", "ID balise <select>", "ID balise du bouton <submit>", "Lancement de l'action du formulaire", liste pour les z-index, [false, "Fonction a appeler lors du clic", true]);
			// - - -
			// 		Pour appeler une fonction JS avant l'ouverture du selecteur
			// 			ajouter un 6e parametre de type tableau contenant les valeurs : [	false, 
			//																				null,  
			//																				null,
			//																				fct à appeler (type Function)]
			//			lors du changement d'affichage (ouverture et fermeture), la fonction est appelee et possede comme parametre le noeud du bouton activant le clic
			//			la fonction a appeler doit obligatoirement posseder un "return(true)" a la fin de la fonction afin de permettre au script d'affichage de poursuivre
			//			s.addEventFct("ID formulaire", "ID balise <select>", "ID balise du bouton <submit>", "Lancement de l'action du formulaire", liste pour les z-index, [false, null, false, "Fonction a appeler lors de l'ouverture"]);
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Variables
		var This;
		var Html;
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant l'action aux boutons
		this.addEventFct = function(IDmenu, IDselect, IDbutton, AUTOsubmit, IDindex){
			// Verification a l'acces aux scripts de gestion et creation
			if(typeof(htmanager_js) == "boolean" && htmanager_js){
				// Sauvegarde des references
				This							= this;
				Html							= new HTManager();
				// Identification des elements
				var f							= (typeof(IDmenu) 	== "string")? document.getElementById(IDmenu) 	: IDmenu;
				var s							= (typeof(IDselect) == "string")? document.getElementById(IDselect) : IDselect;
				var b							= (typeof(IDbutton)	== "string")? document.getElementById(IDbutton) : IDbutton;
				// Verification de l'existence des balises
				if(Html.check(f) && Html.check(s)){
					var i;
					var t;
					var l;
					var m;
					var p;
					var a;
					var am;
					var bs;
					var h;
					var o;
					var os;
					var c						= new Object();
					// Analyse du type de selecteur demande : creer entierement en JavaScript ou non (utile pour identifier l'option selectionnee)
					var JSselector				= [false, null, false, null];
					if(typeof(arguments[5]) == "object"){
						if(arguments[5].length > 0){
							JSselector			= [	(typeof(arguments[5][0]) == "boolean" && 	arguments[5][0] == true),
													(typeof(arguments[5][1]) == "function")? 	arguments[5][1] : null,
													(typeof(arguments[5][2]) == "boolean")? 	arguments[5][2] : null,
													(typeof(arguments[5][3]) == "function")? 	arguments[5][3] : null];
						}
					}
					// Verification de la fonction "autosubmit"
					AUTOsubmit					= (AUTOsubmit && Html.check(b));
					// Verification des balises a modifier
					if(typeof(IDindex) == "object"){
						if(IDindex.length > 0){
							a					= new Array();
							am					= IDindex.length;
							for(i = 0; i < am; i++){
								l				= (typeof(IDindex[i]) == "string")? document.getElementById(IDindex[i]) : IDindex[i];
								if(Html.check(l)) a.push(l);
							}
							if(a.length > 0){
								a				= {list:a, max:a.length};
							}
						}else a					= null;
					}else a 					= null;
					IDindex						= a;
					// Identification du navigateur pour le choix de l'info bulle a assigner aux boutons
					var n						= (String(navigator.appName).match("Microsoft"))? "" : " ";
					// Recuperation des balises <option>
					a							= s.getElementsByTagName("option");
					am							= a.length;
					if(am > 0){
						// Creation du menu deroulant
							// Creation des balises : Champ visible/selection (affichant le choix du selecteur)
							os						= Html.createNode("span", {id:s.id  +"_ls"});
							o						= Html.createNode("div", {id:s.id  +"_l", className:"ep_selected"}, os);
							// Creation des balises : Champ cache (receptionant la valeur a transmettre au formulaire)
							h						= Html.createNode("input", {type:"hidden", id:s.id, name:s.name, className:"ep_hidden", title:Html.cleanText(s.title)});
							// Creation des balises : Conteneur de la liste
							m						= Html.createNode("fieldset", {id:s.id  + "_f"});
							bs						= Html.createNode("div", {id:s.id  + "_m", className:"ep_buttons"});
							m.appendChild(bs);
							// Analyse de la presence d'une valeur par defaut
							if(a[0].value.match("select_defaultvalue")){
								p					= a[0].innerHTML;
								i					= 1;
							}else{
								p					= null;
								i					= 0;
							}
							// Creation des balises : Elements de la liste
							var lb					= new Array();
							var u					= -1;
							for(i = i; i < am; i++){
								// Creation du bouton
								t					= Html.cleanText(a[i].innerHTML);
								t					= Html.createNode("input", {type:"button", id:s.id  + "_e" + i, name:a[i].value, value:t, title:t});
								bs.appendChild(t);
								lb.push({tag:t, value:a[i].value, text:Html.cleanText(a[i].innerHTML)});
								// Sauvegarde du bouton selectionne
								if(a[i].selected) u = i;
							}
							// Ajout de l'action aux boutons
							am						= lb.length;
							for(i = 0; i < am; i++){ addAction(f, i, {list:lb, max:am}, h, o, os, m, IDindex, (AUTOsubmit || (typeof(JSselector[2]) == "boolean" && JSselector[2] && typeof(JSselector[1]) == "function")), JSselector[1]); }
							// Analyse de l'etat du bouton selectionne
							i						= s.innerHTML;
							if(!JSselector[0] && (u <= 0 && String(s.className).match("ep_empty")) && p == null){	// --> Aucune selection & aucun message par defaut (affichage vide)
								o.className			= "ep_empty";
								o.innerHTML			= "&nbsp;";
							}else if(!JSselector[0] && (u < 0 || (p != null && u == 1) || !i.match(" selected"))){	// --> Aucune selection (affichage du message par defaut)
								o.className			= "ep_default";
								o.innerHTML			= p;
							}else{	// ----------------------------------------------------------------------------------> Option selectionnee (affichage de la valeur)
								// Si le selecteur est entierement cree en JS assignation automatique de l'option selectionnee
								if(JSselector[0] && String(s.className).match("ep_empty")){
									o.className		= "ep_empty";
									os.innerHTML	= "&nbsp;";
								}else{
									if(JSselector[0]) u = Math.max(0, s.selectedIndex);
									// Ajout de la classe de selection
									lb[u].tag.className	= "ep_selected";
									// Sauvegarde des donnees de selection
									h.value			= a[u].value;
									o.className		= "ep_selected";
									o.title 		= Html.cleanText(a[u].innerHTML);
									os.innerHTML	= Html.cleanText(a[u].innerHTML);
								}
							}
							// Recherche de la balise parente du selecteur
							p						= s.parentNode;
							// Recherche du libelle du formulaire associe au selecteur
							l						= f.getElementsByTagName("label");
							// Creation des balises : Libelle du formulaire
							if(l.length > 0){
								am					= l.length;
								for(i = 0; i < am; i++){
									if(l[i].htmlFor == IDselect){
										l			= l[0];
										t			= Html.createNode("div", {className:l.className}, Html.cleanText(l.innerHTML));
										p.insertBefore(t, s);
										break;
									}
								}
							}
							// Integration du champ visible
							p.insertBefore(o, s);
							// Integration de la liste
							p.insertBefore(m, s);
							// Integration du champ cache
							p.insertBefore(h, s);
							// Mise a jour du formulaire
							p.className				= "ep_menu";
							p.title					= s.title;
						// Recuperation de l'id du selecteur
						t							= s.id;
						// Suppression des elements initiaux du formulaire
						p.removeChild(s);
						if(Html.check(l)) l.parentNode.removeChild(l);
						if(AUTOsubmit) b.parentNode.removeChild(b);
						// Calcul de la largeur minimale des valeur d'option et assignation au menu
						m.className					= "";
						u							= 0;
						am							= lb.length;
						for(i = 0; i < am; i++){ u	= Math.max(u, lb[i].tag.offsetWidth);	}
						o.style.width				= u + "px";
						m.style.width				= u + "px";
						// Ajout des fonctionnalites du bouton d'affichage
						var C						= new DisplayControl(true);
						C.addEventFct({id:o, cssopen:"ep_open", cssclose:"ep_close"}, 
									  [{id:m, cssopen:"", cssclose:"ep_hidden"}], 
									  true, true, false, true, (JSselector[3] != null)? JSselector[3] : null, 
									  function(l){ This.manageDisplayAction(l, t, o, m, IDindex, AUTOsubmit);});
						// Suppression de l'acces au bouton d'ouverture via navigation clavier
						t.tabIndex					= -1;
					}
				}
			}
			return(true);
		};
		
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction ajoutant l'action a chaque bouton du selecteur
		function addAction(f, r, l, h, o, os, m, a, s){
			// Analyse de la presence d'une fonction JS remplacant la fonction submit
			var JSubmit					= (typeof(arguments[9]) == "function")? arguments[9] : null;
			// Ajout de l'action du formulaire au bouton
			Html.addEvent(l.list[r].tag, "click", function(){ 	
													// Assignation de la valeur selectionnee au champ cache
													h.value 		= l.list[r].value;
													// Mise a jour du champ visible
													o.className		= "ep_selected";
													os.innerHTML 	= l.list[r].text;
													o.title 		= l.list[r].text;
													// Fermeture du selecteur
													closePanel(o, m, a);
													// Assignation de la selection
													for(var i = 0; i < l.max; i++){ l.list[i].tag.className = ""; }
													l.list[r].tag.className		= "ep_selected";
													// Envoi du formulaire si demande
													if(s){
														// Analyse de l'action demandee (par defaut le "submit" du formulaire)
														(JSubmit == null)? f.submit() : JSubmit(h.value);
													}
												});
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction gerant l'ajout ou la suppression des evenements (appelee via la classe DisplayControl apres un changement d'etat)
		this.manageDisplayAction = function(l, t, o, m, a){
			// Analyse du type d'action demandee
			if(String(l.className).match("ep_open")){
				// Assignation des effets d'ouverture en decallage pour laisser le temps au script de fermeture d'autres panneaux de s'executer
				setTimeout(function(){ This.displaywidget(l, t, o, m, a); }, 10);
			}else{
				// Fermeture automatique
				closePanel(o, m, a); 
				// Suppression de la fermeture via clic exterieur
				if(window.removeEventListener)			window.removeEventListener("click", 	function(e){ This.launchActionWindow(e, t, o, m, a)}, false);
				else if(document.removeEventListener) 	document.removeEventListener("click", 	function(e){ This.launchActionWindow(e, t, o, m, a)}, false);
				else if(document.detachEvent)			document.detachEvent("onclick",			function(e){ This.launchActionWindow(e, t, o, m, a)});
			}
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction gerant l'ajout ou la suppression des evenements (appelee via la classe DisplayControl apres un changement d'etat)
		this.displaywidget = function(l, t, o, m, a){
				// Assignation des index
				if(a != null){	for(var i = 0; i < a.max; i++){	a.list[i].style.zIndex = 1000; } }
				// Ajout de la fermeture via clic exterieur
				if(window.addEventListener)			window.addEventListener("click", 	function(e){ This.launchActionWindow(e, t, o, m, a)}, false);
				else if(document.addEventListener) 	document.addEventListener("click", 	function(e){ This.launchActionWindow(e, t, o, m, a)}, false);
				else if(document.attachEvent)		document.attachEvent("onclick",		function(e){ This.launchActionWindow(e, t, o, m, a)});
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction analysant l'element click
		this.launchActionWindow = function(e, id, t, m, a){
			var b = false;
			// Identification de la balise en fonction du type de navigateur
			if(e.target){
				if(!String(e.target.id).match(id))  		b = true;
			}else if(!String(e.srcElement.id).match(id)) 	b = true;
			if(b) closePanel(t, m, a);
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction fermant automatiquement le panneau et supprimant les evenements associes
		function closePanel(t, m, a){
			// Gestion de la classe pour le texte affiche
			if(String(t.className).match("ep_empty")) 			t.className	= "ep_empty ep_close";
			else if(String(t.className).match("ep_default"))	t.className	= "ep_default ep_close";
			else 												t.className	= "ep_selected ep_close";
			// Disparition du menu
			m.className		= "ep_hidden";
			// Suppression des index ajoutes
			if(a != null){	for(var i = 0; i < a.max; i++){	a.list[i].style.zIndex = ""; } }
		};
		// - - - - - - - - - - - - - - - - - - - - - - - - - - - -
		// Fonction reinitialisant le selecteur
		this.reset = function(idhidden){
			// Identification du selecteur
			var h					= (typeof(idhidden) == "string")? document.getElementById(idhidden) : idhidden;
			if(Html.check(h)){
				// Verification que le champ est rempli
				if(h.value != ""){
					var t				= null;
					var b				= null;
					// Recherche des balises
					var p				= h.parentNode;
					var m				= p.childNodes.length;
					for(i = 0; i < m; i++){
						if(Html.check(p.childNodes[i])){
							// Recherche du texte affiche
							if(String(p.childNodes[i].tagName).toLowerCase() == "div") 				t = p.childNodes[i];
							// Recherche des boutons de choix
							else if(String(p.childNodes[i].tagName).toLowerCase() == "fieldset")	b = p.childNodes[i].getElementsByTagName("input");
						}
					}
					// Suppression des donnees
					if(t != null && b != null){
						// Suppression de la valeur du champ cache
						h.value			= "";
						// Suppression du texte affiche
						t.className		= String(t.className).replace("ep_selected", (String(h.title).length > 0)? "ep_default" : "ep_empty");
						t.innerHTML		= (String(h.title).length > 0)? h.title : "&nbsp;";
						// Suppression de la selection du bouton
						m				= b.length;
						for(var i = 0; i < m; i++){ b[i].className = ""; }
					}
				}
			}
		};
	};
