// Recherche dans input box
// Eric Quillévéré 2008

/*-jsl:import 2-fonctionsDiverses.js */
/*-jsl:import 4-Ajax.js */
/*jsl:import ../../charte/js/js_rewrite.js */
/*jsl:import ../../charte/js/js_rewrite_1-02.js */

// Affecte la recherche temps réel sur un objet
// [String] OPT_paramAffiches : nom du champ à afficher (indicé si vide)
// [String] OPT_paramCle : nom du champ servant de clé (=param si vide)
// [String] nomObjetCle : nom du champ  inputText stockant la clé (souvent de type hidden)
// [Array] prefixeAutreParamsRech : tableau pointant sur des id d'objets pour lesquelles les valeurs sont aussi à rechercher en Ajax
function rechTempsReel(nomObjet, pagePHP, paramPagePHP,
	classeListe, classePasReponse,
	OPT_paramAffiches, OPT_paramCle, 
	nomObjetCle, OPT_prefixeAutreParamsRech, 
	OPT_nbCarMiniAvantRecherche,
	OPT_fonctionSiValidation,
	OPT_retraitGauche, OPT_objPositionRelative, OPT_objParent)
	{
	if (nonDef(OPT_paramAffiches)) OPT_paramAffiches=null;
	if (nonDef(OPT_paramCle)) OPT_paramCle=null;
	if (nonDef(OPT_nbCarMiniAvantRecherche)) OPT_nbCarMiniAvantRecherche=3;
	if (nonDef(OPT_fonctionSiValidation)) OPT_fonctionSiValidation=null;
	if (nonDef(OPT_prefixeAutreParamsRech)) OPT_prefixeAutreParamsRech='';
	if (nonDef(OPT_retraitGauche)) OPT_retraitGauche=0;
	
	var objTxt=obj(nomObjet);
	if (objTxt)
		{
		objTxt.nbCarMiniAvantRecherche=OPT_nbCarMiniAvantRecherche;
		objTxt.pagePHP=pagePHP;
		objTxt.paramPagePHP=paramPagePHP;
		objTxt.focusPris=false;
		objTxt.setAttribute('autocomplete','off');
		objTxt.derniereRecherche='';
		var nomFenReponse=nomObjet+'_reponse';
		objTxt.classeListe=classeListe;
		objTxt.classePasReponse=classePasReponse;
		objTxt.retraitGauche=OPT_retraitGauche;
		objTxt.fenReponse=null;
		objTxt.fonctionSiValidation=OPT_fonctionSiValidation;

		objTxt.fenAucuneRep=null;
		
		objTxt.paramAffiches=OPT_paramAffiches;
		objTxt.paramCle=OPT_paramCle;
		objTxt.nomObjetCle=nomObjetCle;
		objTxt.prefixeAutreParamsRech=OPT_prefixeAutreParamsRech;
		
		objTxt.timeout=null; // timeout clavier
		
		objTxt.onkeyup=function(evenmt)
			{
			rechTempsReel_CaptureTouches(evenmt,1,objTxt,true);
			};		
			
		objTxt.onblur=function()
			{rechTempsReel_FocusFin(this);};	

		if (nonDef(OPT_objParent))
			objTxt.objParent=document.body;
		else
			objTxt.objParent=OPT_objParent;
		if (nonDef(OPT_objPositionRelative))
			objTxt.objPositionRelative=objTxt;
		else
			objTxt.objPositionRelative=obj(OPT_objPositionRelative);
		}

	}

	
function rechTempsReel_ListeVisibleFin(objTxt)
	{
	if (objTxt.fenReponse)
		{
		obj_Detruit(objTxt.fenReponse);
		objTxt.fenReponse=null;
		}
	}

//	Fonction controlant les actions a faire en fonction de la valeur du code de l'event "KeyUp" 
function rechTempsReel_CaptureTouches(evenmt, numRecherche, objTxt, autosubmit)
	{
	var txtRecherche = objTxt.value;

	if (txtRecherche.length<1)
		{
		rechTempsReel_ListeVisibleFin(objTxt, false);
		rechTempsReel_PasReponseFin(objTxt);
		objTxt.derniereRecherche='';
		if (objTxt.nomObjetCle) obj(objTxt.nomObjetCle).value='';
		if (objTxt.fonctionSiValidation) objTxt.fonctionSiValidation();
		}
	else
		{
		var characterCode=clavier_Touche(evenmt) ;
		switch (characterCode)
			{
			// Flèche bas
			case 40 :
				if (objTxt.fenReponse)
					{
					(objTxt.fenReponse.childNodes[0]).focus();
					objTxt.fenReponse.childNodes[0].childNodes[0].selected=true;
					}
				break;
				
			// Entrée
			case 13:
				rechTempsReel_ListeVisibleFin(objTxt);
				if (objTxt.fonctionSiValidation) objTxt.fonctionSiValidation();
				break;

			// Autres touches
			default :
			
				if (txtRecherche!=objTxt.derniereRecherche)
					{
					// Efface la clé
					if (objTxt.nomObjetCle)
						{
						var objDesti=obj(objTxt.nomObjetCle);
						if (objDesti) objDesti.value='';
						}
						
					rechTempsReel_PasReponseFin(objTxt);
					objTxt.derniereRecherche=txtRecherche;
					
					if (txtRecherche.length>=objTxt.nbCarMiniAvantRecherche)
						{
						if (objTxt.timeout)
							{
							clearTimeout(objTxt.timeout);
							objTxt.timeout=null;
							}
						objTxt.timeout=setTimeout('rechTempsReel_Ajax(\'' + objTxt.id+ '\')',500);
						}
					else
						rechTempsReel_ListeVisibleFin(objTxt);
					}
				break;
			}
		}
	}	

// Effectue la recherche Ajax	
function rechTempsReel_Ajax(nomObjet)
	{
	var objTxt=obj(nomObjet);
	if (objTxt)
		{
		objTxt.timeout=null;
		var params= Array();
		if (objTxt.paramPagePHP!='') params.push(objTxt.paramPagePHP);
		
		
		params['valeur']=objTxt.value;
		// Paramètres supplémentaires
		if (objTxt.prefixeAutreParamsRech)
			{
			for (var i=0;i< objTxt.prefixeAutreParamsRech.length;i++)
				{
				var valeur='';
				var objet=obj(objTxt.prefixeAutreParamsRech[i]);
				if (objet) valeur=objet.value;
				
				params[objTxt.prefixeAutreParamsRech[i]]=valeur;
				}
			}
		
		
		AJAX_Appel({page:objTxt.pagePHP, paramsEntree:params, 
			opt_coderAppel:true, 
			opt_fonctionRetour:rechTempsReel_RetourAjax, opt_asynchrone:true, opt_paramsRetour:nomObjet}, true );		
		
		}
	}
	
function rechTempsReel_RetourAjax(reponse, nomObjet)
	{
	var objTxt=obj(nomObjet);
	rechTempsReel_ListeVisibleFin(objTxt);
	if (objTxt.fenReponse) 
		{
		obj_Detruit(objTxt.fenReponse);
		objTxt.fenReponse=null;
		}
	var tabReponse=Array();
	eval(reponse);
	try {eval(reponse);	}
	catch(e)
		{return;}	
	
	var taille=(objTxt.objPositionRelative).taille_Lire();
	var positionObjAbs=(objTxt.objPositionRelative).posAbs_Lire();
	var posGauche=positionObjAbs.gauche;
	var posHaut=positionObjAbs.haut;
	if (tabReponse.length===0)
		{
		// Crée l'objet "aucune réponse"
		var objAucuneRep=obj_CreeDiv(objTxt.objParent, null, objTxt.classePasReponse);	
		//var taille=obj_Taille_Renvoie(objTxt);
		//var posAbs=obj_PosAbs_Renvoie(objTxt);
		obj_Pos_Fixe(objAucuneRep, posGauche, posHaut +taille.hauteur);

		objAucuneRep.innerHTML='Aucune proposition trouvée.';
		
		objTxt.fenAucuneRep=objAucuneRep;
		rechTempsReel_ListeVisibleFin(objTxt);
		}
	else
		{
		// Crée une liste et la rattache à l'objet parent
		var objFen=obj_CreeDiv(objTxt.objParent, null, objTxt.classeListe);
		objFen.style.zIndex=100;
		
		//taille=obj_Taille_Renvoie(objTxt);
		//posAbs=obj_PosAbs_Renvoie(objTxt);
		//alert(posGauche + '/' + (posHaut +taille.hauteur));
		obj_Pos_Fixe(objFen, posGauche, posHaut +taille.hauteur);
		objTxt.fenReponse=objFen;
			
		
		var objCombo=obj_Cree('select', objFen);		
		objCombo.setAttribute('size',5);
		objFen.style.width=objTxt.offsetWidth+'px';
		objCombo.style.width=objTxt.offsetWidth+'px';
		
		for (var i=0;i<tabReponse.length;i++)
			{
			var objElem=obj_Cree('option', objCombo);
			var afficheTxt=tabReponse[i];
			var afficheCle=tabReponse[i];
			if (objTxt.paramAffiches) afficheTxt=afficheTxt[objTxt.paramAffiches];
			if (objTxt.paramCle) afficheCle=afficheCle[objTxt.paramCle];
			
			objElem.innerHTML=afficheTxt;
			objElem.value=afficheCle;
			
		
			objElem.onclick=function()
				{
				rechTempsReel_ListeSelection(objTxt, this, true);
				objTxt.focus();
				if (objTxt.fonctionSiValidation) objTxt.fonctionSiValidation();
				};
			// Si correspond, effectue la sélection
			if (objTxt.value==objElem.innerHTML || tabReponse.length==1)
				{
				rechTempsReel_ListeSelection(objTxt, objElem, false);
				objCombo.selectedIndex=i;
				//objElem.focus();
				//objCombo.focus();
				}
			}
			
		objCombo.onclick=function()
			{
			this.options[this.selectedIndex].onclick();
			};
			
		// Focus passe dans la liste
		objCombo.onfocus=function()
			{
			rechTempsReel_FocusDeb(objTxt);
			};
			
		// Appui de touche
		objCombo.selectionPreced=-1; // sélection avant appui de touche
		objCombo.onkeyup=function(evenmt)
			{
			var characterCode=clavier_Touche(evenmt) ;
			
			if (characterCode==13)
				{
				// Entrée
				rechTempsReel_ListeSelection(objTxt, this.options[this.selectedIndex], true);
				if (objTxt.fonctionSiValidation) objTxt.fonctionSiValidation();
				}
			else if (characterCode==38)
				{
				// Haut
				if (objCombo.selectionPreced===0)
					objTxt.focus();
				}
			objCombo.selectionPreced=this.selectedIndex;
			};
			
		}
	
	}

// Sélection d'un élément de la liste
function rechTempsReel_ListeSelection(objTxt, objSource, selectionFinale)
	{
	if (objTxt.nomObjetCle)
		{
		var objDesti=obj(objTxt.nomObjetCle);
		if (objDesti)
			objDesti.value=objSource.value;	
		}
	if (selectionFinale)
		{
		objTxt.value=objSource.innerHTML;
		rechTempsReel_ListeVisibleFin(objTxt);
		}
	}

	

// Focus pris
function rechTempsReel_FocusDeb(objTxt)
	{
	objTxt.focusPris = true;
	}

// Cache
function rechTempsReel_FocusFin(objTxt)
	{
	objTxt.focusPris = false;
	setTimeout('rechTempsReel_FocusFin2(\'' + objTxt.id +'\')',1000);
	}

// Cache définitivement
function rechTempsReel_FocusFin2(nomObjet)
	{	
	var objTxt=obj(nomObjet);
	if (objTxt)
		{
		if (!objTxt.focusPris)
			{
			rechTempsReel_ListeVisibleFin(objTxt);
			rechTempsReel_PasReponseFin(objTxt);
			}
		}
	}
	
function rechTempsReel_PasReponseFin(objTxt)
	{
	if (objTxt.fenAucuneRep)
		{
		obj_Detruit(objTxt.fenAucuneRep);
		objTxt.fenAucuneRep=null;
		}
	}
	

	

