
//Partie propre aux variables et fonctions utilisées pour la gestion des Cookies des mots clés de rercherche

// Variables globales
var cookieQueries = new Array();
var isKonqueror = (navigator.vendor == 'KDE')
var isIE6 = ((window.ActiveXObject && !window.XMLHttpRequest) ? true : false);
var adHiders = [false, false, false];
var _nameidx, _lastbold;

var separator = "#"; //séparateur dans les différentes valeurs présentes dans le même cookie ayant la clé = cleCookie
var cleCookie = "recherchesFullText"; //clé du cookie contenant les valeurs de recherche FullText
var dateExpireDefaut = new Date (); //Par défaut, on initialise la durée de vie du cookie = 1 an
dateExpireDefaut.setFullYear(dateExpireDefaut.getFullYear()+1);

//Définition des constantes que les variables sugboxAcc, sugboxHaut et searchfieldBas auront comme valeur
cteListeSuggestionRecherches = "listeSuggestionRecherches";
cteListeSuggestionRecherchesHaut = "listeSuggestionRecherchesHaut";
cteListeSuggestionRecherchesBas = "listeSuggestionRecherchesBas";

var searchfieldAcc ; //initialisé dans la fonction "creerListeSuggestion" pour la page d'accueil
var sugboxAcc ; //initialisé dans la fonction "creerListeSuggestion" pour la page d'accueil
var searchfieldHaut ; //initialisé dans la fonction "creerListeSuggestion" pour le bandeau Haut
var sugboxHaut ; //initialisé dans la fonction "creerListeSuggestion" pour le bandeau Haut
var searchfieldBas ; //initialisé dans la fonction "creerListeSuggestion" pour le bandeau Bas
var sugboxBas ; //initialisé dans la fonction "creerListeSuggestion" pour le bandeau Bas

var queries = new Array();
var suggestions = new Array();
var searchValue;
var hoveredSuggestion = -1;





// Fonction qui calcule les valeurs offsets des éléments
function realOffset(el, offsetType) {
    var offset = 0;
    while(el) {
        offset += el[offsetType];
        el = el.offsetParent;
        if (el.id == "site")
        	return offset;
    }
    return offset;
}


// Array.indexOf fix
if(!Array.indexOf) {
    Array.prototype.indexOf = function(elValue) {
    for(var i=0; i<this.length; i++) {
        if(this[i] === elValue)
        return i;
    }
    return -1;
    };
}







//Fonction qui construit le "bloc de recheche"
function buildSearch(topQueries,varSearch, varSugg) {
    if(document.cookie.indexOf('lastsearches=') != -1) { // On "check" les anciennes recherches
        var temp = document.cookie.substring(document.cookie.indexOf('lastsearches=')+13) + ';';
        var cookie = temp.substring(0, temp.indexOf(';'))

        cookieQueries = cookie.split('|'); // on met le cookie dans un tableau (variable globale)
    }

    for(var i=0; i<cookieQueries.length; i++) {
        cookieQueries[i] = unescape(cookieQueries[i]); // on décode la valeur du cookie avec la fonction "unescape"
        var duplicateIndex = topQueries.indexOf(cookieQueries[i]); // on "check" les recherches dupliquées
        if(duplicateIndex != -1) { topQueries.splice(duplicateIndex, 1); }
    }

    queries = cookieQueries.concat(topQueries); // on "merge" les recherches dans un seul tableau


    // Partie propre à la recherche des settings des champs
    varSearch.setAttribute('autocomplete', 'off');

    varSearch.onkeydown = function(ev) {
        try { searchKeyDown(event.keyCode,varSearch, varSugg); }
        catch(e) { searchKeyDown(ev.keyCode,varSearch, varSugg); }
    };

    varSearch.onkeyup = function(ev) {
        try { searchKeyUp(event.keyCode,varSearch, varSugg); }
        catch(e) { searchKeyUp(ev.keyCode,varSearch, varSugg); }
    };


    varSearch.onblur = function() {
        //setTimeout(hideSugbox, 250);
        setTimeout('hideSugboxById(' + "'" + varSugg.id + "'" + ')', 250);  //on utilise la fonction hideSugboxById et non pas hideSugbox parce qu'il y un pb lorsqu'on passe l'objet HTML varSugg en paramètre !!!
    };
}


function hoverSuggestion(sug,varSugg) {
    for(var i=0; i<suggestions.length; i++) {
        varSugg.getElementsByTagName('a')[i].className = '';
    }

    if(sug != -1) {
        varSugg.getElementsByTagName('a')[sug].className = 'hovered';
        hoveredSuggestion = sug;
    }
}


function hoverSuggestionById(sug,varSuggId) { //idem que la fonction hoverSuggestion, avec la différence que le deuxième paramètre est l'id de l'objet HTML et non pas l'objet HTML lui même
    for(var i=0; i<suggestions.length; i++)
        document.getElementById(varSuggId).getElementsByTagName('a')[i].className = '';

    if(sug != -1) {
        document.getElementById(varSuggId).getElementsByTagName('a')[sug].className = 'hovered';
        hoveredSuggestion = sug;
    }
}


function searchKeyDown(kc,varSearch, varSugg) {
    if(varSugg.style.display == 'block') {

        if(kc != 38 && kc != 40)
            hoveredSuggestion = -1;

        if(kc == 38 && hoveredSuggestion != -1) { // Le code 38 correspond à la touche "Up"
            hoveredSuggestion--;
            hoverSuggestion(hoveredSuggestion,varSugg);
            varSearch.value = suggestions[hoveredSuggestion];
        }

        if(kc == 40 && hoveredSuggestion < suggestions.length-1) { // Le code 40 correspond à la touche "Down"
            hoveredSuggestion++;
            hoverSuggestion(hoveredSuggestion,varSugg);
            varSearch.value = suggestions[hoveredSuggestion];
        }

        if(kc == 38 && hoveredSuggestion == -1)
            varSearch.value = searchValue; // on ré-appelle l'ancienne recherche

    }
}


function searchKeyUp(kc,varSearch, varSugg) {
    if(kc != 38 && kc != 40)
        searchValue = varSearch.value; // on enregistre la recherche

    if(varSearch.value != '' && kc != 13 && kc != 27 && kc != 38 && kc != 40) // Le code 13 correspond à la touche "Entrée" le code 27 à la touche "Escape"
        giveSuggestions(varSearch, varSugg);

    if((varSearch.value == '' || kc == 27) && varSugg.style.display == 'block')
        hideSugbox(varSugg);
}




//Fonction qui propose au moment de l'écriture dans le champ de recherche FullText les valeurs déjà saisies
function giveSuggestions(varSearch, varSugg) {
    suggestions = new Array(); // on efface les valeurs dans e tableau

    for(var i=0; i<queries.length && suggestions.length<10; i++) {
        if(queries[i].indexOf(varSearch.value.toLowerCase()) == 0) // Les recherches qui commencent par la valeur du mot clé de recherche saisi
        suggestions.push(queries[i]);
    }

    /*
    for(var i=0; i<queries.length && suggestions.length<10; i++) {
        if(queries[i].indexOf(varSearch.value.toLowerCase()) > 0) // Les recherches qui incluent la valeur du mot clé de recherche saisi (en évitant les doublures)
        suggestions.push(queries[i]);
    }
    */


    // on initialiser la liste des suggestions avec les codes HTML correspondant
    varSugg.innerHTML = '';
    for (var i=0; i<suggestions.length; i++) {
       //on utilise la fonction hoverSuggestionById et non pas hoverSuggestion parce qu'il y un pb lorsqu'on passe l'objet HTML varSugg en paramètre !!!
       varSugg.innerHTML += '<a href="javascript:repmlirCaseRecherche(' + "'" + varSearch.form.name + "','" + varSugg.id + "','" + suggestions[i] + "'" + ');" style="width:' + (varSearch.offsetWidth-6) + 'px;" onmouseover="javascript:hoverSuggestionById(' + i + ',' + "'" + varSugg.id + "'" + ');">' + suggestions[i] + '</a>';
    }


    if(suggestions.length == 0)
        hideSugbox(varSugg); //dans ce cas, on n'affiche pas la liste des suggestions (puisqu'il n'y a aucune ancienne recherche correspondant)

    else
        showSugbox(varSearch, varSugg); //donc on affiche la liste des suggestions

}


//Fonction qui remplie le champ de recherche FullText par la valeur passée en paramètre
function repmlirCaseRecherche(nomForm, varSugg, valeurChamp) {
    document.getElementById(nomForm).search.value = valeurChamp;
}


//Fonction qui affiche la liste de suggestion
function showSugbox(varSearch, varSugg) {
    //On intialise la postion de la liste de suggestion

    /*if (varSugg.id == cteListeSuggestionRecherches) {//donc on est dans la page d'accueil
        varSugg.style.top = (realOffset(varSearch, 'offsetTop') + varSearch.offsetHeight) + 'px';
        varSugg.style.left = realOffset(varSearch, 'offsetLeft') + 1 + 'px';
        varSugg.style.width = (varSearch.offsetWidth-2) + 'px';
    }
    else if (varSugg.id == cteListeSuggestionRecherchesHaut) {//donc on est dans le bandeau en Haut
        varSugg.style.top = (realOffset(varSearch, 'offsetTop') + varSearch.offsetHeight) + 'px';
        varSugg.style.left = realOffset(varSearch, 'offsetLeft') + 'px';
        varSugg.style.width = (varSearch.offsetWidth-2) + 'px';
    }
    else if (varSugg.id == cteListeSuggestionRecherchesBas) { //donc on est dans le bandeau en Bas*/

        //Pour le faire apparaitre en haut, il faut daire realOffset(varSearch, 'offsetTop') - height de l'element varSugg, mais pas de valeur pour celle-la!!!!
        //varSugg.style.top =  (realOffset(varSearch, 'offsetTop') - 200) + 'px';
		
	
		// Fonction générique quelquesoit le bloc de recherche
        varSugg.style.top = (realOffset(varSearch, 'offsetTop') + varSearch.offsetHeight) + 'px';
        varSugg.style.left = realOffset(varSearch, 'offsetLeft') + 'px';
        varSugg.style.width = (varSearch.offsetWidth-2) + 'px';
    //}

    adHiders[0] = true;
    varSugg.style.display = 'block';
}


//Fonction qui cache la liste de suggestion à partir de l'objet HTML passé en paramètre
function hideSugbox(varSugg) {
    varSugg.style.display = 'none';
    adHiders[0] = false;
}



//Fonction qui cache la liste de suggestion à partir de l'id de l'objet HTML
function hideSugboxById(varSuggId) {
    document.getElementById(varSuggId).style.display = 'none';
    adHiders[0] = false;
}



//Fonction qui crée la liste des suggestions de recherches effectuées par l'utilisateur (à partir d'un cookie contenant toutes les recherches effectuées par cet internaute)
function creerListeSuggestion(nomForm, nomListeSugg, varSearch, varSugg) {
    //Tout d'abord, on initialise les variables globales "searchfield" et "sugbox"  (en fonction de la apge appelant cette fonctions, ça sera: searchfieldAcc ou searchfieldHaut ou searchfieldBas, idem pour varSugg )
    varSearch = document.getElementById(nomForm).search;
    varSugg = document.getElementById(nomListeSugg);

    var listeRecherchesFullText = LireCookie(cleCookie);
    if (listeRecherchesFullText!=null) {
        var tabRechercheFullText = listeRecherchesFullText.split(separator);
        if (tabRechercheFullText!=null) {
             buildSearch(tabRechercheFullText,varSearch, varSugg);
        }
    }
}









//Fonction qui lie le couple clé=valeur d'un cookie
function getCookieCleValeur(offset) {
    var endstr=document.cookie.indexOf (";", offset);
    if (endstr==-1) endstr=document.cookie.length;
    return unescape(document.cookie.substring(offset, endstr));
}




//Fonction qui lie un cookie à partir de sa clé
function LireCookie(cle) {
    var arg=cle+"=";
    var alen=arg.length;
    var clen=document.cookie.length;
    var i=0;
    while (i<clen) {
        var j=i+alen;
        if (document.cookie.substring(i, j)==arg) return getCookieCleValeur(j);
        i=document.cookie.indexOf(" ",i)+1;
        if (i==0) break;
    }
    return null;
}



//fonction qui écrit un cookie à partir d'une clé, valeur et date d'expiration
function EcrireCookie(cle, valeur, dateExpire) {
    //on lit d'abord l'ancien couple clé=valeur attribué à cette clé de cookie
    var oldCookieValeur = LireCookie(cle);
    var newCookieValeur;
    if (oldCookieValeur!=null && valeur!=null) { //on veut mettre plusieurs valeurs dans le même cookie en utilisant le caractère # comme séparateur
        if (oldCookieValeur.indexOf(valeur) == -1 ) { //pour éviter d'ajouter des doublons
            newCookieValeur = oldCookieValeur + separator  + escape(valeur) ;
        }
        else {//si la nouvelle valeur existe déjà, alors on ne la rajoute pas
            newCookieValeur = oldCookieValeur;
        }
    }
    else {//donc c'est la première valeur à mettre dans le cookie ou bien c'est un cookie à supprimer (si valeur == null)
         newCookieValeur = escape(valeur) ;
    }
    
    
	//On initialise le sous domaine dans lequel le cookie sera valable (pour écrire le cookie dans le domaine général de l'application groupemoniteur.fr pour la recette, webmoniteur.net pour la preprod, et batiproduits.com pour la prod et donc pour ne pas perdre le cookie à cause des url-rewriting)
	var domaineCookie;
	var domaine = document.domain;
	var splitDomaine = domaine.split(".");
	if (splitDomaine && splitDomaine.length>= 2) {//donc il y a au moins un domaine (au moins deux '.' )
		var domaineZone = splitDomaine[splitDomaine.length-2]; // est égal à groupemoniteur OU webmoniteur OU batiproduits (en fonction de l'environnement)
		var domaineExt = splitDomaine[splitDomaine.length-1]; // est égal à fr OU net OU com (en fonction de l'environnement)
		domaineCookie = domaineZone + "." + domaineExt; // est égal à groupemoniteur.fr OU webmoniteur.net OU batiproduits.com (en fonction de l'environnement)
	}


    //On initialise ici le contenu du Cookie à sauvegarder
    var cookieToSave = cle + "=" + newCookieValeur + "; expires=" + dateExpire.toGMTString() + "; path=/"; //on utilise la fonction escape pour encoder la valeur du cookie ET on met path=/ pour que le cookie soit valable pour toutes les pages du site et donc pour ne pas perdre le cookie à cause des url-rewriting
    if (domaineCookie) {//donc il faut préciser le domaine du cookie (puisqu'il est initialisé)
    	cookieToSave = cookieToSave + " ;domain=" + domaineCookie ;	
    }
    
    //Enfin, on sauvegarde le cookie
    document.cookie = cookieToSave;
}



//Fonction qui efface un cookie en mettant sa date à une date antérieure
function EffacerCookie(cle) {
    date=new Date();
    date.setFullYear(date.getFullYear()-1);
    EcrireCookie(cle,null,date);
}

