///////////////////////////////////////////////////////////
// Classe principale du LiveSearch
//
// @param idForm        ID du formulaire
// @param urlsearch     URL du script php qui effectue la recherche et renvoie le resultat sous forme structuree
var oLiveSearch = Class.create();
oLiveSearch.prototype = {
    initialize: function( params, idForm, urlsearch ) 
    {
        this.params         = params
        this.idForm         = idForm;
        this.urlsearch      = urlsearch;
        
        // parametres
        this.idTextBox      = this.params.get('idTextBox');
        this.idDivRes       = this.params.get('idLSres');
        this.nbLetterMin    = (this.params.get('nbLetterMin')?this.params.get('nbLetterMin'):2);        
        this.idCache        = (this.params.get('idCache')?this.params.get('idCache'):'');
        this.modeLink       = (this.params.get('modeLink')?this.params.get('modeLink'):'SELF');
        this.activeLink     = (this.params.get('activeLink')=='1'?true:false);
        this.activeGetVal   = (this.params.get('activeGetVal')=='1'?true:false);
        this.activeGetLib   = (this.params.get('activeGetLib')=='1'?true:false);
        this.activePrefixOut= (this.params.get('activePrefixOut')=='1'?true:false);
        this.urldest        = (this.params.get('urldest')?this.params.get('urldest'):'');
        this.nbMaxLigne     = (this.params.get('nbMaxLigne')?this.params.get('nbMaxLigne'):10);
        this.affEnteteBloc  = (this.params.get('affEnteteBloc')=='1'?true:false);
        this.affLienSuivant = (this.params.get('affLienSuivant')=='1'?true:false);
        this.affNbResultat  = (this.params.get('affNbResultat')=='1'?true:false);
        this.urlsuivant     = (this.params.get('urlsuivant')?this.params.get('urlsuivant'):'');        
        this.prefixeVal     = (this.params.get('prefixeVal')?this.params.get('prefixeVal'):'');                
        this.txtLienSuivant = (this.params.get('txtLienSuivant')?this.params.get('txtLienSuivant'):'');
        this.txtNbResAucun  = (this.params.get('txtNbResAucun')?this.params.get('txtNbResAucun'):'');
        this.txtNbResPlusieurs = (this.params.get('txtNbResPlusieurs')?this.params.get('txtNbResPlusieurs'):'');
        
        if ( !this.idTextBox || !this.idDivRes ) return false;        
        
        // liaison avec d'autres champs externes        
        this.fieldlinked    = (this.params.get('fieldlinked')?('('+this.params.get('fieldlinked')+')').evalJSON():'');
        
        // mapping des paramètres
        this.globalParamMapping = (this.params.get('globalParamMapping')?('('+this.params.get('globalParamMapping')+')').evalJSON():'');        
        
        // parametre interne a la classe        
        this.Lng = "";
        this.vide = true; 
        this.indexEntrySelected = -1;        
        this.requestIdCount = 0;
        this.lastSearch = "";   
        this.textBox        = $(this.idTextBox);
        this.divRes         = $(this.idDivRes); 

        // detection si le navigateur est IE car celui-ci ne supporte pas complétement les optimisations AJAX 
        // bug reconnu par MS qui devrait le corriger dés IE8 en implémentant intégralement (ou presque) AJAX 
        // et en respectant les normes du protocole AJAX
        this.browserIsIE = (navigator.appName == "Microsoft Internet Explorer");              
        
        // div de resultat      
        this.divRes.style.position = 'absolute';
        //if (this.textBox.offsetHeight!=0) {            
            //Position.clone(this.textBox, this.idDivRes, {setWidth: false,setHeight: false, offsetTop: this.textBox.offsetHeight});
            //Element.clonePosition(this.idDivRes, this.textBox, {setWidth: false,setHeight: false,setTop: true,offsetTop: this.textBox.offsetHeight}); 
            //Element.clonePosition(this.idDivRes, this.textBox, {setWidth: false,setHeight: false,setTop: true}); 
        //}
        //else{
            // blindage IE car le offsetHeight n'est pas renseigne sur un element contenu dans un tableau ... encore une bizarerie d'IE
            //this.divRes.style.width = 300;
        //}
        Element.hide(this.divRes);  

        // textbox de recherche
        this.textBox.setAttribute('autocomplete','off');
        this.textBox.onkeyup = this.myKeyListenerMAJ.bindAsEventListener(this);
        this.textBox.onkeydown = this.myKeyListenerNAV.bindAsEventListener(this);
        
        // formulaire
        //$(this.idForm).onsubmit = this.mySubmit.bind(this);
    }
    ,
    myKeyListenerNAV: function(evt){                
        switch(evt.keyCode) {            
            case Event.KEY_RETURN:                
                if ( (ret=this.getEntrySelected())!=false ) {
                    this.textBox.value = ret;
                }
                Event.stop(evt);
                this.hide();
                return;
                
            case Event.KEY_ESC:
                this.hide();
                Event.stop(evt);
                return;
                                
            case Event.KEY_UP:
                this.selectEntry(-1);
                Event.stop(evt);
                return;
            case Event.KEY_DOWN:
                this.selectEntry(1);
                Event.stop(evt);
                return;
        } 
    }
    ,
    myKeyListenerMAJ: function(evt){        
        if ( this.textBox.value == "") {
            this.hide();            
        }
        else{
            var show = true;                        
            if (this.prefixeVal!="") 
            {
                var v = ""+this.textBox.value;
                // si la chaine commence par le prefixe on ne fait rien
                if (v.charAt(0)==this.prefixeVal) {
                    show = false;    
                    this.hide();
                }
            }
            
            if (show) {
                this.update(evt);
            }
        }
    }
    ,
    hide: function() {
        new Effect.Fade(this.divRes,{duration:0.50});
        this.vide = true;        
        
        // on arrete de faire tourner l'icone 
        this.textBox.setStyle({backgroundPosition: '100% -10%'});
    }
    ,
    update: function(evt) {
        if (evt.type=="keyup" && evt.keyCode!=Event.KEY_ESC && evt.keyCode!=Event.KEY_DOWN && evt.keyCode!=Event.KEY_UP && evt.keyCode!=Event.KEY_RETURN) {
            
            // si la chaine a rechercher est suffisament grande pour lancer les recherches
            if ( ((""+this.textBox.value).strip()).length >= this.nbLetterMin) {
                
                // on fait tourner l'icone 
                this.textBox.setStyle({backgroundPosition: '100% 80%'});
                
                // gestion du vidage des la liste precedente de resultats
                if (this.vide) {
                    Element.update(this.idDivRes,'');
                    this.vide = false;
                }            
                
                // lancement de la recherche (si plusieurs requetes a faire jouer avec les parametres afin que le travail 
                // soit fait en amont dans un et unique script)
                if (this.urlsearch!='') 
                {                    
            		var param = 'qry='+this.textBox.value;    		
            		
            		if ( this.fieldlinked!='' ) {
            		  var n = this.fieldlinked['field'].length;
            		  if ( n > 0 ) {
            		    for ( i=0 ; i < n ; i++ ) {
            		      param += '&'+this.fieldlinked['field'][i]['label']+'='+$F(this.fieldlinked['field'][i]['id']);
            		    }
            		  }
            		}
                    
                    this.requestIdCount++;                        
                    var requestID = this.requestIdCount;                    
                    
                    if ( this.browserIsIE ) 
                    {                            
                        new Ajax.Request( ''+this.urlsearch, {method: 'get', 
                                                                parameters: param, 
                                                                onCreate:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onLoading:this.onEnCours.bindAsEventListener(this,requestID),                                                                      
                                                                onSuccess:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onComplete:this.onCompleteSearch.bindAsEventListener(this,requestID)});
                    }
                    else{                                                                 
                        new Ajax.Request( ''+this.urlsearch, {method: 'get', 
                                                                parameters: param, 
                                                                onCreate:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onLoading:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onLoaded:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onInteractive:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onSuccess:this.onEnCours.bindAsEventListener(this,requestID), 
                                                                onComplete:this.onCompleteSearch.bindAsEventListener(this,requestID)});                                                                     
                    }
                }
            }
            else{
                // on arrete de faire tourner l'icone 
                this.textBox.setStyle({backgroundPosition: '100% -10%'});
                
                // reinitialisation du champ de cache
                $(this.idCache).value = '';
            }
        }
    } 
    ,
    onEnCours: function (originalRequest, requestID) {
        if ( this.requestIdCount > requestID ) {
            originalRequest.abort();
        }
    }
    ,
    onCompleteSearch: function (originalRequest,requestID) 
    {      
        if ( this.requestIdCount > requestID ) {
            return;
        }
        
        // on arrete de faire tourner l'icone 
        this.textBox.setStyle({backgroundPosition: '100% -10%'});
          
        var myLSres = this.params.get('idLSres');

        // insertion du resultat de la requete		
        Element.update(myLSres,'');		
        new Insertion.Bottom(myLSres,originalRequest.responseText);		
	
        // on formate et complete le contenu
        if ($(myLSres).innerHTML!='') 
        {
            var div_myResult = $(myLSres).firstChild;
            Element.cleanWhitespace(div_myResult);
            var nbBloc = div_myResult.childNodes.length;    
            if(nbBloc>0)
            {            
                // nombre de resultat total (il estpossible qu'il ne soit pas présent dans les données retournées)
                var nbresPresent = false;
                var nbRes = 0;
                var nb = -1;                
                if ( (div_myResult.childNodes[0].nodeName).toLowerCase()=='span' ) {                
                    nbresPresent = true;
                    nbRes = div_myResult.childNodes[0];                    
                    if ( (''+nbRes.innerHTML)!='' && !isNaN(nbRes.innerHTML) ) {
                        nb = parseInt(nbRes.innerHTML, 10);                        
                    }
                }                                
                
                // definition du container global
                var resPopup = new oContainer(myLSres,2,nb,this.txtNbResAucun,this.txtNbResPlusieurs,this.affNbResultat);
            
                // on parcourt les blocs
                var ideb1 = ( nbresPresent ? 1 : 0 );
                for ( var i=ideb1 ; i<nbBloc ; i++ ) 
                {                                                
                    var Dbloc = div_myResult.childNodes[i];     
                    Element.cleanWhitespace(Dbloc);
                    
                    if (Dbloc.childNodes[0]) 
                    {                                        
                        // libelle du bloc (il estpossible qu'il ne soit pas présent dans les données retournées)                       
                        var lib = '';
                        var libPresent = true;
                        var DblocTest = Dbloc.childNodes[0];
                        Element.cleanWhitespace(DblocTest);
                        if ( DblocTest.childNodes[0] ) {
                            if ( (DblocTest.childNodes[0].nodeName).toLowerCase()=='ul' ) {
                                libPresent = false;
                            }
                        }    
                        var lib = ( libPresent ? ''+Dbloc.childNodes[0].innerHTML : '');
                        var icn1 = ( libPresent ? 1 : 0 );                        
                    
                        // instance du bloc
                        var bloc = new oBloc(lib,this.nbMaxLigne,this.affEnteteBloc,this.affLienSuivant,this.urlsuivant,this.modeLink,this.idTextBox,i,this.txtLienSuivant,this.fieldlinked,this.globalParamMapping);                    
                        
                        // on boucle sur les lignes de donnees
                        if (Dbloc.childNodes[icn1]) {
                        
                            var DblocData = Dbloc.childNodes[icn1];
                            Element.cleanWhitespace(DblocData);
                        
                            if (DblocData.childNodes[0]) {
                            
                                var DblocData = DblocData.childNodes[0];
                                Element.cleanWhitespace(DblocData);
                            
                                var nbLig = DblocData.childNodes.length;
                            
                                for (var j=0;j<nbLig;j++) {
                                
                                    if (DblocData.childNodes[j].childNodes.length==2) {
                                    
                                        // valeur associee a la ligne
                                        var lval = ""+DblocData.childNodes[j].childNodes[0].innerHTML; 
                                    
                                        // libelle de la ligne
                                        var llib = ""+DblocData.childNodes[j].childNodes[1].innerHTML;                                    
                                                                        
                                        // ajout de la ligne au bloc
                                        bloc.add( new oLine(myLSres,llib,lval,this.prefixeVal,false,2,this.idTextBox,this.activeLink,this.activeGetLib,this.activeGetVal,this.activePrefixOut,this.urldest,this.modeLink,this.idCache,this.fieldlinked,this.globalParamMapping) );
                                    }
                                }                            
                            }                        
                        }
                    
                        // ajout du bloc au resultat
                        resPopup.add( bloc );   
                    }
                }

                // on met a jour l'affichage de la liste de resultat 
                resPopup.draw();        

                // affichage de la div qui contient la liste des resultats 
                Effect.Appear(myLSres,{duration:0.0});
            }
        }
debug($(myLSres).innerHTML);
    }
	,
    selectEntry: function(sens) {
        var eltSelected = document.getElementsByClassName("LStyp2selected",this.divRes);        
        //var eltSelected = $$('#'+this.idDivRes+' .LStyp2selected'); 
        
        if (eltSelected.length>0) {
            
            Element.removeClassName(eltSelected[0], "LStyp2selected");
            Element.addClassName(eltSelected[0], "LStyp2");
            
            var eltSelectedA = document.getElementsByClassName("LStyp2Aselected",eltSelected[0]);        
            if (eltSelectedA.length>0) {
                Element.removeClassName(eltSelectedA[0], "LStyp2Aselected");
                Element.addClassName(eltSelectedA[0], "LStyp2A");                
            }
            
            var eltSelectionnable = document.getElementsByClassName("LStyp2",this.divRes);
            
            if (eltSelectionnable.length>0) {
                if ( this.indexEntrySelected + sens >= eltSelectionnable.length ) {
                    this.indexEntrySelected = 0;    
                }
                else if ( this.indexEntrySelected + sens < 0 ) {
                    this.indexEntrySelected = eltSelectionnable.length-1;    
                }
                else{
                    this.indexEntrySelected += sens;
                }
            }
            
            Element.removeClassName(eltSelectionnable[this.indexEntrySelected], "LStyp2");
            Element.addClassName(eltSelectionnable[this.indexEntrySelected], "LStyp2selected");
            
            var eltSelectionnableA = document.getElementsByClassName("LStyp2A",eltSelectionnable[this.indexEntrySelected]);        
            if (eltSelectionnableA.length>0) {
                Element.removeClassName(eltSelectionnableA[0], "LStyp2A");
                Element.addClassName(eltSelectionnableA[0], "LStyp2Aselected");                
            }            
        }
        else{
            // initialisation de la selection
            var eltSelectionnable = document.getElementsByClassName("LStyp2",this.divRes);
            if (eltSelectionnable.length>0) {
                Element.removeClassName(eltSelectionnable[0], "LStyp2");
                Element.addClassName(eltSelectionnable[0], "LStyp2selected");
                this.indexEntrySelected = 0;
                
                var eltSelectionnableA = document.getElementsByClassName("LStyp2A",eltSelectionnable[this.indexEntrySelected]);        
                if (eltSelectionnableA.length>0) {
                    Element.removeClassName(eltSelectionnableA[0], "LStyp2A");
                    Element.addClassName(eltSelectionnableA[0], "LStyp2Aselected");                
                } 
            }
        }
    }
    ,
    getEntrySelected: function() {
        
        ret = false;
        
        var eltSelected = document.getElementsByClassName("LStyp2selected",this.divRes);
        //var eltSelected = $$('#'+this.idDivRes+' .LStyp2selected'); 
        
        var node;
        var node_cache;
       
        if (eltSelected.length>0) {            
            node = eltSelected[0];            
        }
        else{
            var eltSelectionnable = document.getElementsByClassName("LStyp2",this.divRes);
            //var eltSelected = $$('#'+this.idDivRes+' .LStyp2');        
            if (eltSelectionnable.length>0) {                
                node = eltSelectionnable[0];
            }            
        }                  
        
        if (node) {
        
            if (this.activeLink && this.urldest!='') {
                
                Element.cleanWhitespace(node);
                
                if (this.modeLink=="SELF") {
                    nbNode = node.childNodes.length; 
                    if (nbNode>0 && node.childNodes[0].href) {
                        myUrl = node.childNodes[0].href;
                        document.location = myUrl;
                        ret = this.textBox.value;
                    }                    
                }
                else if (this.modeLink=="PARENT") {                    
                    nbNode = node.childNodes.length; 
                    if (nbNode>0 && node.childNodes[0].href) {
                        myUrl = node.childNodes[0].href;                        
                        parent.location = myUrl.substr(28);
                        ret = this.textBox.value;                        
                    }                    
                }
                else if (this.modeLink=="OPENER") {
                    nbNode = node.childNodes.length; 
                    if (nbNode>0 && node.childNodes[0].href) {
                        myUrl = node.childNodes[0].href;
                        window.opener.location = myUrl.substr(35);
                        ret = this.textBox.value;
                    }                         
                }                
                else if (this.modeLink=="NEW") {                    
                    nbNode = node.childNodes.length;                     
                    if (nbNode>0 && node.childNodes[0].href) {
                        myUrl = node.childNodes[0].href;
                        name = '[Pxxo_Widget_Input_Livesearch_'+(new Date().getTime())+']';
                        window.open(myUrl,name, "");
                        ret = this.textBox.value;
                    }  
                }
                else {
                    nbNode = node.childNodes.length; 
                    if (nbNode>0 && node.childNodes[0].href) {
                        myUrl = node.childNodes[0].href;
                        document.location = myUrl;
                        ret = this.textBox.value;
                    }  
                }
            }
            else if(this.activeGetVal) {
                Element.cleanWhitespace(node);
                if (node.childNodes.length==3) {
                    ret = node.childNodes[0].innerHTML;
                    $(this.idCache).value = node.childNodes[1].innerHTML;
                }
            }
            else if(this.activeGetLib) {
                Element.cleanWhitespace(node);
                if (node.childNodes.length==3) {
                    ret = node.childNodes[0].innerHTML;
                    $(this.idCache).value = node.childNodes[1].innerHTML;
                }                
            }
        }  
       
        return ret;    
    }
    ,
    mySubmit: function() {
        return false;
    }
};

function debug(str) {
    if ( $('Pxxo_Widget_Input_Textarea_debug') && str ) {
        $('Pxxo_Widget_Input_Textarea_debug').innerHTML += str+'\n';
    }
}

