var arrayListes = Array();
function getObjetListe(idInput)
{
	return arrayListes[idInput];	
}

var arrayChar = new Array("\\", ".", "$", "[", "]", "(", ")", "{", "}", "^", "?", "*", "+", "-");
function getRegExp(strRegExp)
{
	for (var i = 0; i < arrayChar.length; ++i)
		strRegExp = strRegExp.replace(new RegExp("\\" + arrayChar[i]), "\\" + arrayChar[i]);
	return new RegExp(".*" + strRegExp + ".*", "gi");
}

function ListeRecherche(idInput, largeur)
{
	// Configuration
	this.borderWidth = 1;
	
	// Varibles
	arrayListes[idInput] = this;
	this.initialise = false;
	this.mouseOver = false;
	this.input = document.getElementById(idInput);
	this.timer = null;
	
	// Div principale
	this.div = document.createElement("div");
	this.div.onmouseover = function() { getObjetListe(idInput).mouseOver = true; }
	this.div.onmouseout = function() { getObjetListe(idInput).mouseOver = false; }
	this.div.id = "div_" + idInput;
	this.div.onclick = function() { getObjetListe(idInput).masquer(true); }
	this.div.className = "div_recherche";
	this.div.style.borderWidth = this.borderWidth;
	if (largeur)
		this.div.style.width = (largeur - this.borderWidth * 2) + "px";
	
	// Textes de la div principale
	this.span_liste_vide = document.createElement("span");
	this.span_liste_vide.className = "liste_vide";
	this.span_liste_vide.innerHTML = "Liste vide";
	this.div.appendChild(this.span_liste_vide);
	this.span_aucun_resultat = document.createElement("span");
	this.span_aucun_resultat.className = "aucun_resultat";
	this.span_aucun_resultat.style.display = "none";
	this.span_aucun_resultat.innerHTML = "Aucune correspondance avec les appellations existantes";
	this.div.appendChild(this.span_aucun_resultat);
	
	this.divs = null;
	
	/*2008-10-06 : optimisation de la fonction de recherche*/
	this.old_input_value = '';
	
	/*2008-10-06 : ajout de la contrainte taille minimum pour recherche*/
	this.minCharNumber = 1;
	
	/*2008-10-07 : ajout de la notion de groupe pour filtrer*/
	this.group_selected = null;
	
	/*2008-10-07 : si onfocus pointe déjà vers une fonction, l'ajouter à celle-ci*/
	this.input.onfocusOld = this.input.onfocus;
	this.input.onfocus = function() {
		obj = getObjetListe(idInput);
		
		if (obj.input.onfocusOld)
			obj.input.onfocusOld();
			
		obj.afficher();
	}
	
	this.setMinCharNumber = function (nb) {
		this.minCharNumber = nb;
	}
	
	this.setGroupSelection = function (groupe) {
		this.group_selected = groupe;
		
		this.divs = this.div.getElementsByTagName("div");
		
		if (this.group_selected) {
			for(var i = 0; i < this.divs.length; ++i)
				this.divs[i].style.display = (this.divs[i].groupe == this.group_selected ? "block" : "none");
		}
		else {
			for(var i = 0; i < this.divs.length; ++i)
				this.divs[i].style.display = "block";
		}
	}
	
	this.initialiser = function()
	{
		this.masquer();
		var objbody = document.getElementsByTagName("body").item(0);
		objbody.appendChild(this.div);
		this.input.onblurOld = this.input.onblur;
		this.input.onblur = function() {
			obj = getObjetListe(idInput);
		
			if (obj.input.onblurOld)
				obj.input.onblurOld();
				
			obj.masquer();
		}
		this.input.onkeyup = function() {
			getObjetListe(idInput).rechercherElements();
		}
		return true;
	}
	
	this.ajouterElement = function(libelle, id_groupe)
	{
		this.span_liste_vide.style.display = "none";
		var div_a = document.createElement("div");
		div_a.className = "div_element";
		
		if (id_groupe)
			div_a.groupe = id_groupe;
		
		var a = document.createElement("a");
		a.innerHTML = libelle;
		a.href = "#";
		a.onclick = function() { return getObjetListe(idInput).remplirInput(libelle); }
		div_a.appendChild(a);
		this.div.appendChild(div_a);
		
		return true;
	}
	
	this.afficher = function()
	{
		if (!this.initialise)
			this.initialise = this.initialiser();
		this.rechercherElements();
		position = this.getInputPosition();
		this.div.style.top = position[0] + 20 + "px";
		this.div.style.left = position[1] + "px";
		if (navigator.appName == "Microsoft Internet Explorer"
			&& !navigator.appVersion.match(new RegExp("7\.0.*", "gi")))
			return false;
		this.div.style.display = "block";
		
		return true;
	}
	
	this.masquer = function(force)
	{
		if (!this.mouseOver || force)
			this.div.style.display = "none";
		return true;
	}
	
	this.rechercherElements = function()
	{
		if (this.timer)
			window.clearTimeout(this.timer);
		this.timer = window.setTimeout("getObjetListe(\"" + this.input.id + "\").recherche()", 150);
		return true;
	}
	
	this.recherche = function()
	{
		// Si inférieur à nb caractère mini, faire tout afficher et sortir
		if (this.minCharNumber > this.input.value.length && this.input.value != '') {
			for(var i = 0; i < this.divs.length; ++i)
				this.divs[i].style.display = "block";
			this.span_aucun_resultat.style.display = (this.divs.length ? "none" : "block");
			return true;
		}
		this.span_aucun_resultat.style.display = "none";
		
		isNotContentOf = (this.old_input_value == '' || !(this.old_input_value.match (getRegExp (this.input.value))));
		// Si l'ancienne valeur n'est pas comprise dans la nouvelle, nouvelle recherche à zéro (long!)
		if (isNotContentOf)	
			this.divs = this.div.getElementsByTagName("div");
		
		this.old_input_value = this.input.value;
		
		nbDisplay = 0;
		reg = getRegExp(this.input.value);

		for(var i = 0; i < this.divs.length; ++i)
		{
			if (this.group_selected) {
				if (this.divs[i].groupe == this.group_selected)
				{
					texte_a = this.divs[i].getElementsByTagName("a").item(0).innerHTML;
					if (texte_a.match(reg))
					{
						this.divs[i].style.display = "block";
						++nbDisplay;
					}
					else
						this.divs[i].style.display = "none";	
				}
				else
					this.divs[i].style.display = "none";
			}
			else {
				texte_a = this.divs[i].getElementsByTagName("a").item(0).innerHTML;
				if (texte_a.match(reg))
				{
					this.divs[i].style.display = "block";
					++nbDisplay;
				}
				else
					this.divs[i].style.display = "none";
			}
		}
		if(nbDisplay == 0)
			this.span_aucun_resultat.style.display = "block";
		//this.span_aucun_resultat.style.display = this.divs.length && nbDisplay ? "none" : "block";
		return true;	
	}
	
	this.remplirInput = function(texte)
	{
		this.input.value = texte;
		this.recherche();
		this.mouseOver = false;
		return false;
	}
	
	this.getInputPosition = function()
	{
		var x = y = 0;
		var obj = this.input;
		for(; obj; obj = obj.offsetParent)
		{
			x += obj.offsetTop;
			y += obj.offsetLeft;
		}
		return new Array(x, y);
	}
}
