/***************************/
/* JavaScript Select (JSS) */
/***************************/

/* GLOBALES */
var g_arrSelects = new Array();
var g_bolListeActive = false;

/* FONCTIONS */

/* Recherche des balises select */
function remplacerSelects() {
	var g_arrSelects = document.getElementsByTagName("select");
	var intZIndex = g_arrSelects.length + 900;
	var elementBody = document.getElementsByTagName("body");
	//Événement de fermeture des listes
	elementBody = elementBody[0];
	elementBody.onclick = function () {
		if(g_bolListeActive == false) {
			fermerTout();
			fermerTout2();
		}
		else {
			g_bolListeActive = false;
		};
	};
	//Remplacement des selects
	for(var intCpt = 0 ; intCpt < g_arrSelects.length ; intCpt++) {
		//alert("01 calss name: " + g_arrSelects[intCpt].className + "; \n result of indexOf (tool_box):" + g_arrSelects[intCpt].className.indexOf("tool_box"))
		if(g_arrSelects[intCpt].className.indexOf("tool_box") != -1)
		{
			
			remplacerBaliseSelect(g_arrSelects[intCpt],intZIndex);
		}
		intZIndex--;
	};
};

/* Remplacement des éléments delect par des éléments HTML */
function remplacerBaliseSelect(baliseSelect,intZIndex) {
	var elementContainer = baliseSelect.parentNode;
	var elementDiv = document.createElement("div");
	var elementUl = document.createElement("ul");
	var elementAOuvrir = document.createElement("a");
	var elementLi;
	var elementSpan = document.createElement("span");
	var nodeTexte;
	var bolPremierOption = true;
	var baliseActuelle;
	var strNomBaliseActuelle;
		
	//On place un div et on cache le select
	if (baliseSelect.id != "")
	{
		elementDiv.id = baliseSelect.id + "_jss";
		
	}
	
	if (elementDiv.id != "")
	{
		if(document.getElementById(elementDiv.id))
		{
			document.getElementById(elementDiv.id).parentNode.removeChild(document.getElementById(elementDiv.id));
		}
	}

	elementDiv.className = jsfSettings.jss.container_className;
	elementDiv.style.zIndex = intZIndex;
	baliseSelect.style.display ="none";
	elementContainer.insertBefore(elementDiv,baliseSelect);
	g_arrSelects.push(elementDiv);
	
	elementAOuvrir.className = jsfSettings.jss.lienOuverture_className;
	elementAOuvrir.appendChild(elementSpan);
	//Événement pour ouvrir la liste
	if (!baliseSelect.disabled) {
		elementAOuvrir.href = "#"; 
		elementAOuvrir.onclick = function() {
			ouvrirFermerListe(this);
			return false;
		};
	}
	else {	
		elementDiv.className = jsfSettings.jss.containerDisabled_className;	
	};
	
	if(baliseSelect.childNodes.length > 0) {
		//Si on a des options, on append la liste
		elementDiv.appendChild(elementAOuvrir);
		elementDiv.appendChild(elementUl);
		
		for(var intCpt = 0 ; intCpt < baliseSelect.childNodes.length ; intCpt++) {
			baliseActuelle = baliseSelect.childNodes[intCpt];
			strNomBaliseActuelle = baliseActuelle.nodeName.toLowerCase();
			switch(strNomBaliseActuelle) {
				case "optgroup":
					//Si on a un optgroup, on doit placer un span indicateur et boucler sur ses enfants pour générer les options.
					elementLi = document.createElement("li");
					elementSpan = document.createElement("span");
					nodeTexte = document.createTextNode(baliseActuelle.label);
					elementSpan.appendChild(nodeTexte);
					elementLi.appendChild(elementSpan);
					elementUl.appendChild(elementLi);
					for(var intCpt2 = 0 ; intCpt2 < baliseActuelle.childNodes.length ; intCpt2++) {
						if(baliseActuelle.childNodes[intCpt2].nodeName.toLowerCase() == "option") {
							creerOption(baliseActuelle.childNodes[intCpt2], elementUl , bolPremierOption, elementAOuvrir, baliseSelect, true);
							bolPremierOption = false;
						};
					};
				break;
				case "option":
					creerOption(baliseActuelle, elementUl , bolPremierOption, elementAOuvrir, baliseSelect, false);
					bolPremierOption = false;
				break;
			};
		};
	};
};

/* Création d'une option */
function creerOption(baliseActuelle, elementUL, bolPremierOption, elementAOuvrir, baliseSelect, bolOptGroup) {
	var elementLI = document.createElement("li");
	var elelementsLI;
	var nodeTexte = document.createTextNode(baliseActuelle.firstChild.nodeValue);
	var elementA = document.createElement("a");
	var elementsA;
	var elementSpan = elementAOuvrir.childNodes[0];
	var bolTrouve = false;
	var bolActif = !baliseSelect.disabled;
	var intCpt = 0;
	
	elementA.name = baliseActuelle.value;
	elementA.href = "#";
	
	if(bolOptGroup) {
		elementLI.className = jsfSettings.jss.optgroup_className;
	};
	
	//Lien d'ouverture de la liste
	if(bolPremierOption == true || baliseActuelle.selected == true) {
		//On présélectionne le bon élément
		if (elementSpan.childNodes.length > 0) {
			elementSpan.removeChild(elementSpan.childNodes[0]);
		}
		elementA.className = jsfSettings.jss.optionSelectionnee_className;
		//On désélectionne l'autre s'il y a lieu
		if (bolPremierOption == false) {
			elementsA = elementUL.getElementsByTagName("li");
			while (intCpt < elementsA.length && bolTrouve == false) {
				if (elementsA[intCpt] != elementsA && elementsA.className == "selected") {
					elementsA[intCpt].className = "";
					bolTrouve = true;
				};
				intCpt++;
			};
		};
		elementSpan.appendChild(nodeTexte);
	};
	
	//Événement de sélection
	nodeTexte = document.createTextNode(baliseActuelle.firstChild.nodeValue);
	elementA.appendChild(nodeTexte);
	if (bolActif) {
		elementA.onclick = function() {
			selectionner(this.parentNode,this.name, baliseSelect, elementAOuvrir);
			ouvrirFermerListe(elementAOuvrir);
			
			// Exécute les évènements du select
			if(baliseSelect.onclick != null)
			{
				baliseSelect.onclick();
			}
			if (baliseSelect.onchange != null)
			{
				baliseSelect.onchange();
			}

			return false;
		};
	};
	
	//Insertion
	elementLI.appendChild(elementA);
	elementA.appendChild(nodeTexte);
	elementUL.appendChild(elementLI);
};

/* Sélection des options du select */
function selectionner(elementLI,strValeur,elementSelect,elementAOuvrir) {
	var elementUL = elementLI.parentNode;
	var elementsLI = elementUL.getElementsByTagName("li");
	var elementSpan = elementAOuvrir.childNodes[0];
	
	//On sélectionne la bonne valeur dans les options
	var balisesOptions = elementSelect.getElementsByTagName("option");
	var nodeTexte = document.createTextNode(elementLI.childNodes[0].firstChild.nodeValue);
	var intCpt = 0;
	while (intCpt < balisesOptions.length) {
		if (balisesOptions[intCpt].value == strValeur) {
			balisesOptions[intCpt].selected = true;
		}
		else {
			balisesOptions[intCpt].selected = false;
		};
		intCpt++;
	};
	
	//On met les classes pour élément sélectionné
	intCpt = 0;
	while (intCpt < elementsLI.length) {
		if (elementsLI[intCpt] == elementLI) {
			elementsLI[intCpt].childNodes[0].className = jsfSettings.jss.optionSelectionnee_className;
		}
		else {
			elementsLI[intCpt].childNodes[0].className = "";
		};
		intCpt++
	};
	elementSpan.removeChild(elementSpan.childNodes[0]);
	elementSpan.appendChild(nodeTexte);
};

/* Ouverture / fermeture de la liste */
function ouvrirFermerListe(elementAOuvrir) {
	g_bolListeActive = true;
	var divListe = elementAOuvrir.parentNode;
	var elementUL = divListe.getElementsByTagName("ul");
	var elementA;
	//On cache ou montre la liste
	elementUL = elementUL[0];
	if (divListe.className == jsfSettings.jss.container_className) {
		divListe.className = jsfSettings.jss.containerOuvert_className;
		//Redimensionnement dépendamment du texte
		if (jsfSettings.jss.autoAjuster && elementUL.style.width == "") {
			elementUL.style.width = ajusterGrandeurListe(elementUL) + "px"; 
		};
		if (jsfSettings.jss.hauteurListe != "auto" && elementUL.style.height == "") {
			elementUL.style.height = ajusterHauteurListe(elementUL) + "px";
		};
	}
	else {
		divListe.className = jsfSettings.jss.container_className;
	};
	for(var intCpt = 0 ; intCpt < g_arrSelects.length ; intCpt++) {
		if (g_arrSelects[intCpt] != divListe) {
			if (g_arrSelects[intCpt].className != jsfSettings.jss.container_className && g_arrSelects[intCpt].className != jsfSettings.jss.containerDisabled_className) {
					g_arrSelects[intCpt].className = jsfSettings.jss.container_className;
			};
		};
	};
};

/* Tout fermer */
function fermerTout() {
	for(var intCpt = 0 ; intCpt < g_arrSelects.length ; intCpt++) {
		if (g_arrSelects[intCpt].className != jsfSettings.jss.container_className && g_arrSelects[intCpt].className != jsfSettings.jss.containerDisabled_className) {
				g_arrSelects[intCpt].className = jsfSettings.jss.container_className;
		};
	};
};

/* Ajuste la grandeur de la liste dépendamment de la grosseur du plus gros élément */
function ajusterGrandeurListe(elementUL) {
	var elementsLI = elementUL.getElementsByTagName("li");
	var intGrandeurMin = elementUL.parentNode.offsetWidth;
	elementUL.parentNode.style.position = "static";
	//Pour IE...
	var intGrandeur = elementUL.parentNode.offsetWidth;
	for(var intCpt = 0 ; intCpt < elementsLI.length ; intCpt++) {
		if (elementsLI[intCpt].offsetWidth > intGrandeurMin) {
			intGrandeur = elementsLI[intCpt].offsetWidth;
			intGrandeurMin = intGrandeur;
		};
	};
	elementUL.parentNode.style.position = "relative";
	return intGrandeur;
};

/* Ajuste la hauteur des listes pour bien gérer l'overflow avec IE6 ca il n'a pas de max-height. */
function ajusterHauteurListe(elementUL) {
	var intHauteur = elementUL.offsetHeight;
	if (intHauteur > jsfSettings.jss.hauteurListe) {
		intHauteur = jsfSettings.jss.hauteurListe;
		elementUL.style.overflow = "auto";
	};
	return intHauteur;
};

/* Reconstruit les listes (pratique pour les scripts AJAX qui modifient les select) */
function regenListes() {
	for(var intCpt = 0 ; intCpt < g_arrSelects.length ; intCpt++) {
		g_arrSelects[intCpt].parentNode.removeChild(g_arrSelects[intCpt]);
	};
	remplacerSelects();
};
