var NOMBRE_LETTRES = 4; // Nombre de lettres attentues pour la compl�tion automatique
var surLaListe = false;

/*********************************************************/
function liste_termes(_terme, _id, _domaine)
{
	var vide = this;
	var adresse = "liste_termes.html?STA_ID=6&";
	
	if (_domaine>0)
	{
		adresse = adresse + "DOM_ID=" + _domaine + "&";
	}	
	
	if (_id == '')
	{
		AutoSuggest2(document.getElementById(_terme),
				document.getElementById(_terme),
				vide,
				adresse + "MOT=");
	}
	else
	{
		AutoSuggest2(document.getElementById(_terme),
				document.getElementById(_terme),
				document.getElementById(_id),
				adresse + "MOT=");
	}
}



//SBI CORRECTION DU BUG 0011811 19 NOUVEMBRE 2008
function lienDomaine()
{
	var valeur = document.getElementById('ID_DOM').value; // Contient la valeur de l'<input />
	window.open(valeur);
	if (document.history != null)
		return document.history.go(0);
}

//JLA 0012411: mettre une liste déroulante pour choisir le domaine 
function urlencode(str) {
    return escape(str.replace(/%/g, '%25').replace(/\+/g, '%2B')).replace(/%25/g, '%');
}

function ajouteDomaine(lien, domaine)
{
	document.getElementById('ID_DOM').value = lien + urlencode(domaine);
}

/*********************************************************/

function AutoSuggest2(elem, elemCp, elemId, adresseWeb)
{
	var me = this;
	
	// Initialise l'objet AutoSuggest
	this.page_url = adresseWeb;
	this.plus_de_dix = false;
	this.elem = elem;
	this.elemId = elemId;
	this.elemCp = elemCp;
	this.eligible = new Array();
	this.eligibleId = new Array();
	this.inputText = null;
	this.highlighted = -1;
	this.div = document.getElementById("autosuggest");
	
	// Code des entr�es clavier sp�cifiques
	var TAB = 9;
	var ESC = 27;
	var RET = 13;
	var KEYUP = 38;
	var KEYDN = 40;
	var SHIFT = 16;
	var BACKSPACE=8;
	
	// D�sactive l'autosuggestion du navigateur
	elem.setAttribute("autocomplete", "off");
	
	// Evenements du composant
	
	// onkeydown
	elem.onkeydown = function(ev)
	{
		var touche = me.getKeyCode(ev);
		switch (touche)
		{
			case TAB:
			me.useSuggestion();
			break;
			case RET:
			if (me.useSuggestion())
				me.cancelEvent(ev);
			break;
			case ESC:
			me.hideDiv();
			me.cancelEvent(ev);
			break;
			case KEYUP:
			me.highlighted = me.highlighted - 1;
			if (me.highlighted<0)
				me.highlighted = me.eligible.length - 1;
			me.changeHighlight(touche);
			break;
			case KEYDN:
			me.highlighted++;
			if (me.highlighted>= me.eligible.length)
				me.highlighted = 0;
			me.changeHighlight(touche);
			break;
		}
	};
	
	// onkeyup
	elem.onkeyup = function(ev)
	{
		var touche = me.getKeyCode(ev);
		
		me.elemId.value = '';
		switch (touche)
		{
			case TAB:
			case RET:
			case ESC:
			case KEYUP:
			case KEYDN:
				return;
			default:
			if (this.value != me.inputText)
			{
				me.inputText = this.value
				me.hideDiv();
				if (this.value.length >= NOMBRE_LETTRES)
					me.getEligible();
			}
			else
			{
				me.hideDiv();
				me.inputText = null;
			}
		}
	};
	
	// onblur
	elem.onblur = function(ev)
	{
		if (!surLaListe)
			me.hideDiv();
	}
	
	// M�thodes
	
	// useSuggestion : utiliser la suggestion
	this.useSuggestion = function()
	{
		// Si aucune suggestion n'est s�lectionn�e, s�lectionne la premi�re
		if (this.highlighted<0)
			this.highlighted = 0;
		
		// Si on peut utiliser une suggestion correspondant � la s�lection
		if (this.div.style.display == 'block' && this.eligible.length>this.highlighted && this.eligible[this.highlighted] != null)
		{
			item_selectionne = this.eligible[this.highlighted];
			// D�coupe la ville et le code postal, le cas �ch�ant
			pos1 = item_selectionne.indexOf("    [");
			pos2 = item_selectionne.indexOf("]");
			
			var taille = 5;
			if (elemCp.maxLength > 0 && elemCp.maxLength < 50)
				taille = elemCp.maxLength;
			else if (elemCp.size > 0 && elemCp.size < 50)
				taille = elemCp.size;
			if (pos1>0 && pos2>pos1)
			{
				this.elem.value = item_selectionne.substring(0, pos1);
				if (elemCp.maxLength<5)
					this.elemCp.value = item_selectionne.substring(pos1 + 5, pos1 + 5 + taille);
				else
					this.elemCp.value = item_selectionne.substring(pos1 + 5, pos2);
			}
			else
				this.elem.value = item_selectionne;
			
			// Id de la s�lection
			this.elemId.value = this.eligibleId[this.highlighted];
			
			this.hideDiv();
			// Replace le focus sur le champ HTML pour annuler une �ventuelle tabulation
			setTimeout("document.getElementById('" + this.elem.id + "').focus();", 0);
			return true;
		}
		return false;
	};
	
	// showDiv : Afficher la division
	this.showDiv = function()
	{
		// Pour un code postal 00 (�tranger), ne rien afficher
		if (this.elemCp == this.elem || (this.elemCp.value.length > 1 && this.elemCp.value != "00"))
		{
			// Affiche la division
			this.div.style.display = 'block'
			// Masque les combo
			dlcalendar_hideSelects(this.div);
			// S�lectionne le premier �l�ment de la liste
			/*pos1 = doGetCaretPosition(elem);
			this.elem.value = this.eligible[0];
			doSetCaretPositionSelection(elem, pos1);*/
		}
	};
	
	// hideDiv : Masquer la division
	this.hideDiv = function()
	{
		// Affiche les combo
		this.div.style.display = 'block';
		dlcalendar_showSelects(this.div);
		this.div.style.display = 'none';
		this.highlighted = -1;
	};
	
	// changeHighlight : Surligne la s�lection
	this.changeHighlight = function()
	{
		var lis = this.div.getElementsByTagName('LI');
		
		// Met � jour l'affichage de tous les LI
		for (var i=0; i<lis.length; i++)
		{
			if (this.highlighted == i)
				lis[i].className = "suggestion_selected";
			else if (i % 2 == 1)
				lis[i].className = "suggestion_impaire";
			else
				lis[i].className = "";
		}
	};
	
	// positionDiv : Positionne la division sous le contr�le
	this.positionDiv = function()
	{
		var el = this.elem;
		var x = 0;
		var y = el.offsetHeight;
	
		//Walk up the DOM and add up all of the offset positions.
		while (el.offsetParent && el.tagName.toUpperCase() != 'BODY')
		{
			x += el.offsetLeft;
			y += el.offsetTop;
			el = el.offsetParent;
		}

		x += el.offsetLeft;
		y += el.offsetTop;

		this.div.style.left = x + 'px';
		this.div.style.top = y + 'px';
	};
	
	// createDiv : Cr�e la division
	this.createDiv = function()
	{
		var ul = document.createElement('ul');
		
		for (var i=0; i<this.eligible.length; i++)
		{
			var li = document.createElement('li');
			var a = document.createElement('a');
			a.href = "javascript:false";
			a.innerHTML = this.eligible[i];
			li.appendChild(a);
			
			if (me.highlighted == i)
				li.className = "suggestion_selected";
			else if (i % 2 == 1)
				li.className = "suggestion_impaire";
			else
				li.className = "";
			
			ul.appendChild(li);
		}
		
		if (this.plus_de_dix)
		{
			var li = document.createElement('li');
			li.innerHTML = "...";
			ul.appendChild(li);
		}
		
		this.div.replaceChild(ul, this.div.childNodes[0]);
		
		this.div.className = "suggestion_list";
		this.div.style.position = 'absolute';
		
		// Evenements des UL
		
		// onmouseover
		ul.onmouseover = function(ev)
		{
			surLaListe = true;
			var target = me.getEventSource(ev);
			// Recherche le LI
			while (target.parentNode && target.tagName.toUpperCase() != 'LI')
				target = target.parentNode;
			
			// Parcoure tous les LI jusqu'� trouver celui � s�lectionner
			var lis = me.div.getElementsByTagName('LI');
			
			for (var i=0; i<lis.length; i++)
			{
				if (lis[i] == target)
				{
					me.highlighted = i;
					break;
				}
			}
			// Surligne la s�lection
			me.changeHighlight();
		};
		
		// onmouseout
		ul.onmouseout = function(ev)
		{
			surLaListe = false;
		}
		
		// onclick
		ul.onclick = function(ev)
		{
			me.useSuggestion();
			me.hideDiv();
			me.cancelEvent(ev);
			return false;
		};
	};
	
	// getEligible : Trouve les �l�ments correspondant � la saisie
	this.getEligible = function()
	{	
		if (elem.value.length == 0)
			return;

		this.plus_de_dix = false;
		
		if (window.XMLHttpRequest) // Firefox
			xhr = new XMLHttpRequest();
		else if (window.ActiveXObject) // Internet Explorer
			xhr = new ActiveXObject("Microsoft.XMLHTTP");
		else
			return;
		
		xhr.open("GET", this.page_url + this.inputText, true);
		
		xhr.onreadystatechange = function()
		{
			if (xhr.readyState == 4)
			{
				eval(xhr.responseText);
				
				me.eligible = new Array();
				me.eligibleId = new Array();
				
				if (typeof(suggestions) != undefined && suggestions != null && suggestions.length > 1)
				{
					for (var i=0; i<suggestions.length; i++) 
					{
						pos1 = suggestions[i].indexOf("{");
						pos2 = suggestions[i].indexOf("}");
						if (pos1>0 && pos2>pos1)
						{
							me.eligible[i] = suggestions[i].substring (0, pos1);
							me.eligibleId[i] = suggestions[i].substring (pos1 + 1, pos2);
						}
						if (suggestions[i] == '...')
							this.plus_de_dix = true;
					}
					me.createDiv();
					me.positionDiv();
					me.showDiv();
					
					/*if (suggestions.length == 2 )
						me.useSuggestion();*/
				}
				else
					me.hideDiv();
			}
		};
		
		xhr.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
		xhr.send(null);
	};
	
	// getKeyCode : D�termine la touche enfonc�e
	this.getKeyCode = function(ev)
	{
		if (ev) // Firefox
			return ev.keyCode;
		if (window.event) // Internet explorer
			return window.event.keyCode;
	};
	
	// getEventSource : D�termine la source d'un �v�nement
	this.getEventSource = function(ev)
	{
		if (ev) // Firefox
			return ev.target;
		if (window.event) // Internet Explorer
			return window.event.srcElement;
	};
	
	// cancelEvent : Annule la fonction provoqu�e automatiquement par un �v�nement
	this.cancelEvent = function(ev)
	{
		if (ev) // Firefox
		{
			ev.preventDefault();
			ev.stopPropagation();
			ev.returnValue = false;
		}
		if (window.event) // Internet Explorer
			window.event.returnValue = false;
	};
}

function supprimeAutoSuggest(_elem)
{
	// onkeydown
	_elem.onkeydown = function(ev) {};
	
	// onkeyup
	_elem.onkeyup = function(ev) {};
}

/*********************************************************/

//counter to help create unique ID's
var idCounter = 0;

