//JavaScript Select V1
var arrSelects = new Array();
var bolListeActive = false;

//Auto-ajuster les largeurs de listes?
var autoAjuster = true;

/* Recherche des balises select */
function remplacerSelects() {
	var arrSelects = document.getElementsByTagName("select");
	var intZIndex = arrSelects.length + 900;
	var elementBody = document.getElementsByTagName("body");
	//Événement de fermeture des listes
	elementBody = elementBody[0];
	elementBody.onclick = function () {
		if(bolListeActive == false) {
			fermerTout();
		}
		else {
			bolListeActive = false;
		};
	};
	//Remplacement des selects
	for(var intCpt = 0 ; intCpt < arrSelects.length ; intCpt++) {
		if(arrSelects[intCpt].parentNode.nodeName.toLowerCase() != "td") {
			remplacerBaliseSelect(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
	elementDiv.className = "jss_container";
	elementDiv.style.zIndex = intZIndex;
	baliseSelect.style.display ="none";
	elementContainer.appendChild(elementDiv);
	arrSelects.push(elementDiv);
	
	elementAOuvrir.className = "jss_openlink";
	elementAOuvrir.appendChild(elementSpan);
	//Événement pour ouvrir la liste
	if (!baliseSelect.disabled) {
		elementAOuvrir.href = "#";
		elementAOuvrir.onclick = function() {
			ouvrirFermerListe(this);
			return false;
		};
	}
	else {	
		elementDiv.className = "jss_container_disabled";	
	};
	
	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 = "optgroup";
	};
	
	//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 = "selected";
		//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);
			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 = "selected";
		}
		else {
			elementsLI[intCpt].childNodes[0].className = "";
		};
		intCpt++
	};
	elementSpan.removeChild(elementSpan.childNodes[0]);
	elementSpan.appendChild(nodeTexte);
};

/* Ouverture / fermeture de la liste */
function ouvrirFermerListe(elementAOuvrir) {
	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 == "jss_container") {
		divListe.className = "jss_container_ouvert";
		//Redimensionnement dépendamment du texte
		if (autoAjuster == true && elementUL.style.width == "") {
			elementUL.style.width = ajusterGrandeurListe(elementUL) + "px"; 
		};
	}
	else {
		divListe.className = "jss_container";
	};
	for(var intCpt = 0 ; intCpt < arrSelects.length ; intCpt++) {
		if (arrSelects[intCpt] != divListe) {
			if (arrSelects[intCpt].className != "jss_container" && arrSelects[intCpt].className != "jss_container_disabled") {
					arrSelects[intCpt].className = "jss_container";
			};
		};
	};
};

/* Tout fermer */
function fermerTout() {
	for(var intCpt = 0 ; intCpt < arrSelects.length ; intCpt++) {
		if (arrSelects[intCpt].className != "jss_container" && arrSelects[intCpt].className != "jss_container_disabled") {
				arrSelects[intCpt].className = "jss_container";
		};
	};
};

/* 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;
};

/* Reconstruit les listes (pratique pour les scripts AJAX qui modifient les select) */
function regenListes() {
	for(var intCpt = 0 ; intCpt < arrSelects.length ; intCpt++) {
		arrSelects[intCpt].parentNode.removeChild(arrSelects[intCpt]);
	};
	remplacerSelects();
};