//############################################//
// Emmanuel GOURET - 07/02/2007 - 11h59.com   //
// Tous droits réservés ~ All rights reserved //
//############################################//

function objInputSuggest(id){

	var self=this;
	this.parent=null;

	this.eltInput=null;
	this.eltSuggest=null;
	this.urlSuggest='';
	this.onchange=function(){}
	this.requete=null;
	this.charge=false;
	this.autosubmit=false;

	var eltSelectionne=null;
	var ancienneValeur='';
	var SAkeyevent=true; /* hack pour appel double aux event key(press/down/up) sous safari */

	this.init=function(id){
		// Réglage du champs de recherche
		self.eltInput=document.getElementById(id);
		self.eltInput.className='objInputSuggest';
		self.eltInput.setAttribute('autocomplete','off');
		addEvent(self.eltInput,'keyup',self.affiche);
		addEvent(self.eltInput,'keydown',self.selectionne);
		addEvent(self.eltInput,'mouseup',self.affiche);
		addEvent(self.eltInput,'focus',self.affiche);
		// Réglage de la liste de suggestion
		self.eltSuggest=document.createElement('div');
		self.eltSuggest.setAttribute('id',id+'Suggest');
		self.eltSuggest.className='objInputSuggest';
		self.eltSuggest.style.display='none';
		//self.eltInput.parentNode.appendChild(self.eltSuggest);
		document.getElementsByTagName('body').item(0).appendChild(self.eltSuggest);
		addEvent(self.eltSuggest,'click',self.valide);
		// Réglage des sniffeurs d'évènement
		addEvent(document.getElementsByTagName('body').item(0),'mousedown',self.masque);
		addEvent(window,'resize',self.positionne);
	}
	
	this.focus=function(){
		self.eltInput.focus();
	}
	
	this.positionne=function(){
		var XY=fGetXY(self.eltInput);
		var left=XY[0];
		var top=XY[1]+eval(self.eltInput.offsetHeight);
		var width=eval(self.eltInput.offsetWidth)-2;
		self.eltSuggest.style.top=top+"px";
		self.eltSuggest.style.left=left+"px";
		self.eltSuggest.style.width=width+"px";
	}
	
	this.affiche=function(event){
		if(this.charge) return false;
		if(self.eltInput.value!=ancienneValeur && !(typeof event.keyCode != "undefined" && (event.keyCode==38 || event.keyCode==40))){
			self.onchange();
			t=new Date();
			self.requete=new objHTTP();
			self.requete.parent=self;
			var retour=self.requete.charger(self.urlSuggest+'&t='+t.getTime(),'rempli',true);
			if(retour){
				ancienneValeur=self.eltInput.value;
				self.positionne();
				self.eltSuggest.style.display="";
			}
		}
		else{
			if(self.eltSuggest.getElementsByTagName('a').length>0){
				self.eltSuggest.style.display="";
			}
			else{
				self.eltSuggest.style.display="none";
			}
		}
		// Repositionne le curseur en fin de chaine (bug sur déplacement avec fleche du haut sous firefox et safari
		if(typeof event.keyCode != "undefined" && event.keyCode==38){
			if(typeof self.eltInput.selectionStart != "undefined"){
				self.eltInput.setSelectionRange(self.eltInput.value.length, self.eltInput.value.length);
			}
		}
	}
	
	this.masque=function(event){
		if(event){
			var target = event.target ? event.target : event.srcElement;
			if(target && target.parentNode && target.tagName!='BODY' && target.parentNode.tagName!='BODY'){
				if(target==self.eltSuggest || target==self.eltInput){
					return false;
				}
				if(target.parentNode==self.eltSuggest){
					return false;
				}
				if(target.parentNode.parentNode && target.parentNode.parentNode==self.eltSuggest){
					return false;
				}
				if(target.parentNode.parentNode.parentNode && target.parentNode.parentNode.parentNode==self.eltSuggest){
					return false;
				}
			}
		}
		self.eltSuggest.style.display="none";
		if(eltSelectionne!=null){
			eltSelectionne.className='';
			eltSelectionne=false;
		}
	}
	
	this.selectionne=function(event){
		if(self.eltSuggest.style.display=="" && self.eltSuggest.getElementsByTagName('a').length>0){
			var eltSuivant=false;
			if(eltSelectionne!=null && (SAkeyevent || typeof event.keyCode == 'undefined' || event.keyCode==0)){
				eltSelectionne.className='';
			}
			// Déplace sur fleche du haut/du bas
			if(typeof event.keyCode != 'undefined' && event.keyCode!=0){
				if(SA){
					SAkeyevent=!SAkeyevent;
					if(SAkeyevent) return false;
				}
				if(event.keyCode==38){
					if(eltSelectionne!=null){
						if(eltSelectionne.previousSibling){
							eltSuivant=eltSelectionne.previousSibling;
						}
						else{
							eltSuivant=false;
							eltSelectionne=null;
							self.eltInput.value=ancienneValeur;
						}
					}
					else{
						eltSuivant=self.eltSuggest.firstChild;
						while(eltSuivant.nextSibling){
							eltSuivant=eltSuivant.nextSibling;
						}
					}
				}
				if(event.keyCode==40){
					if(eltSelectionne!=null){
						if(eltSelectionne.nextSibling){
							eltSuivant=eltSelectionne.nextSibling;
						}
						else{
							eltSuivant=false;
							eltSelectionne=null;
							self.eltInput.value=ancienneValeur;
						}
					}
					else{
						eltSuivant=self.eltSuggest.firstChild;
					}
				}
			}
			// Positionne au survol de la souris
			else{
				target=event.target?event.target:event.srcElement;
				if(target.parentNode && target.parentNode==self.eltSuggest || target.parentNode.parentNode && target.parentNode.parentNode==self.eltSuggest){
					if(target.nodeName=='SPAN') eltSuivant=target.parentNode;
					else eltSuivant=target;
				}
			}
			if(eltSuivant){
				eltSelectionne=eltSuivant;
				eltSelectionne.className='selected';
				self.eltInput.value=eltSelectionne.firstChild.innerHTML;
			}
			if(event.keyCode==13){
				self.valide();
			}
		}
	}
	
	this.valide=function(){
		if(eltSelectionne!=null){
			if(eltSelectionne.getAttribute('href')!=null && eltSelectionne.getAttribute('href')!=''){
				this.charge=true;
				window.location.href=eltSelectionne.getAttribute('href');
			}
			else if(self.autosubmit==true){
				eltForm=self.eltInput.parentNode;
				while(eltForm && eltForm.tagName!='FORM'){
					eltForm=eltForm.parentNode;
				}
				if(eltForm){
					eltForm.submit();
				}
			}
			self.masque();
		}
	}
	
	this.rempli=function(etat,xml){
		// Efface le contenu précédent
		self.eltSuggest.innerHTML='';
		// Ajoute chaque nouvelle proposition
		elts=xml.getElementsByTagName('suggest');
		if(elts.length>0){
			for(var i=0;i<elts.length;i++){
				a=document.createElement('a');
				if(elts.item(i).getElementsByTagName('link').length>0 && elts.item(i).getElementsByTagName('link').item(0).firstChild){
					if(elts.item(i).getElementsByTagName('link').item(0).firstChild.nodeValue!=''){
						a.setAttribute('href',elts.item(i).getElementsByTagName('link').item(0).firstChild.nodeValue);
					}
				}
				addEvent(a,'mouseover',self.selectionne);
				// libelle
				span=document.createElement('span');
				span.className='label';
				span.innerHTML=elts.item(i).getElementsByTagName('label').item(0).firstChild.nodeValue;
				a.appendChild(span);
				// commentaire
				span=document.createElement('span');
				span.className='comment';
				if(elts.item(i).getElementsByTagName('comment').length>0 && elts.item(i).getElementsByTagName('comment').item(0).firstChild){
					span.innerHTML=elts.item(i).getElementsByTagName('comment').item(0).firstChild.nodeValue;
				}
				a.appendChild(span);
				self.eltSuggest.appendChild(a);
			}
		}
		else{
			self.masque();
		}
	}

	this.init(id);

}
