﻿var urlSiteS=document.location.href.split('/');
var urlSearch='/nettools/presearch.search'
var urlSite=urlSiteS[0]+"/"+"/"+urlSiteS[2];
var urlLang="/"+urlSiteS[3];
var premier=false;
var fermer="";
var rechercheCourante="";

/** ##############################################
* Gets the browser specific XmlHttpRequest Object
*/
function getXmlHttpRequestObject() {
    if (window.XMLHttpRequest) {
        return new XMLHttpRequest();
    } else if(window.ActiveXObject) {
        return new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        alert("Your browser doesn't support XMLHTTPRequest objects..."); 
    }
}

// Our XmlHttpRequest object to get the auto suggest
var searchReq = getXmlHttpRequestObject();

// Ensure not to send two GET request at the same time [0=ok, 1=in_progress, 2=recall search method]
var searchInProgressState = 0;

// constant
var predictiveSearchListDivName = 'search_suggest';

// form used for search query
var predictiveSearchForm;
var minLengthSearchFormText = 2;

// group by option
var GROUP_BY_FAMILY = 'FAMILY';
var GROUP_BY_DEPARTEMENT = 'DEP';
var groupByFilter = '';	

var xhtmlPredictiveResultList = '';

var DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI = 600;
var lastPredictiveSearchDelayHit = 0;


/** ##############################################
* Called from keyup on the search textbox.
*/


function searchSuggest(searchForm) {
    premier=true;  
    predictiveSearchForm = searchForm;
    lastPredictiveSearchDelayHit = new Date();
    setTimeout("executeSearchSuggestAjaxCall()", DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI);
}

/** ##############################################
* Starts the AJAX request.
*/
function executeSearchSuggestAjaxCall() {

    var tDate = new Date();
    var tDiff = tDate.getTime() - lastPredictiveSearchDelayHit.getTime();
    
    if( tDiff < DELAY_MINIMUM_BETWEEN_TWO_CALL_IN_MILLI-20 ) {
        return;
    }
    
    if (searchReq.readyState == 4 || searchReq.readyState == 0) {
        
        var str = escape(encodeUTF8(predictiveSearchForm.text.value));
        var urlSite=document.location.href.split('/');
        urlSite=urlSite[0]+"/"+"/"+urlSite[2];
        var idSite=predictiveSearchForm.siteId.value;
    
        // CONST !
        if( str.length > minLengthSearchFormText ) {
            // no search in progress !
    
            if(searchInProgressState == 0) {
                searchReq.open("GET", urlSite+urlSearch+'?'+'siteId='+idSite+'&language='+predictiveSearchForm.language.value+'&text='+str,true);
                searchReq.setRequestHeader("Content-Type", "text/xml; charset=utf-8");	
                searchReq.onreadystatechange = handleSearchSuggest; 
                searchReq.send(null);
    
                // search is in progress
                searchInProgressState = 1;
            }
        }
        else {
            // hide 
            hidePredictiveSearchList();
        }
    }
    else {
        // a new search to do after this one
        searchInProgressState++;	
    }	
}

/** ##############################################
* Show predictive search result list 
*/
function showPredictiveSearchList(htmlContent) {
    var searchSugestDiv = document.getElementById(predictiveSearchListDivName);
    if(htmlContent!=""){
        searchSugestDiv.innerHTML = htmlContent;
        document.getElementById("search_suggest").style.display="block";
        
    }
}

/** ##############################################
* Hide predictive search result list
*/
function hidePredictiveSearchList() {
    var searchSugestDiv = document.getElementById(predictiveSearchListDivName);
    if (searchSugestDiv){
        searchSugestDiv.innerHTML = '';
    }
    var searchsuggest = document.getElementById("search_suggest");
    if (searchsuggest){
        document.getElementById("search_suggest").style.display="none";
    }
}

/** ##############################################
* Reinitialisation de la liste
*/
function resetPredictiveResultList() {
    xhtmlPredictiveResultList = '';
}


/** ##############################################
* Affichage de la liste
*/
function finalisePredictiveResultList() {
    showPredictiveSearchList(xhtmlPredictiveResultList);
}

/** ##############################################
* Function called when the AJAX response is returned.
*/
function handleSearchSuggest() {
    if (searchReq.readyState == 4) {
        // reset result list
        resetPredictiveResultList();
	
        // some search are waiting
        if( searchInProgressState > 1 ) {
            searchSuggest(predictiveSearchForm);
        }
        // clear progress flag
        searchInProgressState = 0;
        
        // SEARCH RESULT <pre-search>
        var xmlResponse = searchReq.responseXML;
        if( xmlResponse == null )return;
        
        var lang = xmlResponse.getElementsByTagName('language');	        
        var root = xmlResponse.getElementsByTagName('pre-search');
        
        /*Recupereation des resultats*/
        if (root!=null && root.length>0) {
            var params = xmlResponse.getElementsByTagName('params');
            if (params!=null && params.length>0) {
                rechercheCourante = params[0].getElementsByTagName('text')[0].firstChild.nodeValue;
            }
            var expressions = root[0].getElementsByTagName('expressions'); 
            if (expressions!=null && expressions.length>0) {
                listeNoeud=expressions[0].getElementsByTagName('expression');
                
                /*Traitement des résultats*/
                if( listeNoeud != null ) {
                    for (var i = 0; i < listeNoeud.length; i++) {
                        var productData = listeNoeud[i].firstChild.nodeValue;
                        appendProduct(lang == null ? 'FR' : lang.nodeValue,productData);
                    }
                }
                finalisePredictiveResultList();
            }
        } 
        else{
            premier=false;
            hidePredictiveSearchList();
        }
    }
}

/** ##############################################
/* Get a value from a node
*/
function getNodeValuePredictiveSearch(masterNode, dataNodeName) {
    var dataNodeList = masterNode.getElementsByTagName(dataNodeName);
    if( dataNodeList[0] == null )return '';
    
    var nodeValue = dataNodeList[0].firstChild;
    if( nodeValue != null )return nodeValue.nodeValue;

    // check attribute then
    var attribute = masterNode.getAttribute(dataNodeName);
    return attribute != null ? attribute : '';
}

/** ##############################################
* transformation HTML des résultats
*/

function appendProduct(lang, label) {

    if(label!=""){
        label=label.replace(new RegExp("\""),'&quot;');
        label=label.replace(new RegExp("\'\'"),'&quot;');
        label=label.replace(new RegExp("\'"),'&#146;');

        var labelDef=label;
        /*mise en minuscule du mot saisie */
        var rechercheCouranteMin=rechercheCourante.toLowerCase();
        
        /*séparation du mot saisie */
        var rechercheCouranteSplit=rechercheCouranteMin.split(' ');
        /*mise en minuscule et suppression des accent du mot retourné par le MDR */
        var labelMin=label.toLowerCase();
        
        for(i=0;i<rechercheCouranteSplit.length;i++){    
            /*recherche du mot saisie dans le résultat retourné par le MDR*/
            positionRecherchLabel=labelMin.indexOf(rechercheCouranteSplit[i]);              
            if(positionRecherchLabel!=-1){
                
                /*mise entre crochet du mot saisie*/
                labelDeb=label.substring(0,positionRecherchLabel);
                labelMid='['+label.substring(positionRecherchLabel,positionRecherchLabel+rechercheCouranteSplit[i].length)+']';
                labelEnd=label.substring(positionRecherchLabel+rechercheCouranteSplit[i].length,label.length);
                
                /*reconstitution de la chaine retourner par le MDR*/
                label=labelDeb+labelMid+labelEnd;
                
                 /*preparation de la variable pour le mot suivant*/
                labelMin=label.toLowerCase();
                
            }
        }
        
        /*formatage du mot retourné par le MDR*/
        while(new RegExp("[[]").test(label)){
            label=label.replace(new RegExp("[[]"),'<span>');
            label=label.replace(new RegExp("\]"),'</span>');
        }
        
        /*transformation de la chaine en HTML*/
         var funcBtnPrix =  setLinkTag(tagHeader+'predictive-search', 'setSearch(\''+labelDef+'\');return false;');
        xhtmlPredictiveResultList += '<div class="suggest_link"><a href="" onclick="'+funcBtnPrix+'"';
        xhtmlPredictiveResultList += 'class="suggest_link">&nbsp;&nbsp;' + label + '</a></div>';
        
        premier=false;
    }       
}

/** ##############################################
* Click function: set search input text
*/
function setSearch(value) {
    document.getElementById('entree').value = value;
    hidePredictiveSearchList();
    document.getElementById('searchForm').submit();	
}

/** ##############################################
*    encodage UTF8
*/
function encodeUTF8(str) {
     var resultat = "";
     for (i = 0; i < str.length; i++) {
         var caractere = str.charCodeAt(i);
         if (caractere < 128) {
             resultat += String.fromCharCode(caractere);
         }
         
         else if((caractere > 127) && (caractere < 2048)) {
             resultat += (String.fromCharCode((caractere >> 6) | 192) + 
                 String.fromCharCode((caractere & 63) | 128));
        }
        
        else {
            resultat += (String.fromCharCode((caractere >> 12) | 224) + 
                String.fromCharCode(((caractere >> 6) & 63) | 128) + 
                String.fromCharCode((caractere & 63) | 128));
        }
    }
     return resultat;
 }


