//Parametres globaux
var _cookieName = "erepServ" ;
var _client = "ITOOL" ;

var _EREPO1 = "/erep1" ;
var _EREPO2 = "/erep2" ;
var _EREPO3 = "/erep3" ;
var _EREPO4 = "/erep4" ;

var THIRD_KIND_CENTRAL = "15" ;
var THIRD_KIND_STORE = "7" ;
var THIRD_KIND_SITE = "-1" ;

var SWITCH_KIND_SITE="-1";
var SWITCH_KIND_STORE="7";

var _SERVICE_SWITCH = "switch" ;
var _SERVICE_THIRD = "third";

var _urlErep = "" ;
var _context = "" ; //adresse du serveur eRep, ex : _EREPO1 ;
var _urlSite = "" ; //adresse du site internet, ex : http://www.decathlon.fr ;

var _serviceSwitchContextId = ""; // ID contexte du service switch

var isOxyCallWithSwitch = "true"; //permet de controler l affichage des fonctions Oxylane

//## SPECIFIQUE Marques : URL du site courant
var urlSiteCourant = document.location.href ; //get the site URL

//Liste des serveurs eRep
var serverList = new ArrayList() ;
serverList.add(_EREPO1) ;
serverList.add(_EREPO2) ;
serverList.add(_EREPO3) ;
serverList.add(_EREPO4) ;

var indexTestServer = getRandomServerIdToCheck(serverList.length()) ; 
var numTentative = 0 ; //Numero de la tentative
var maxTentatives = (serverList.length())*2 ; //Nb max de tentatives => on va verifier pour chaque serveur 2 fois au max si ils ne repondent pas

// Determination du codePays grace a l url
var urlRoot = getRootUrl(urlSiteCourant);
var site;

if (urlSiteCourant.indexOf('www.decathlon.')!=-1){    
    site = urlRoot.substr(urlRoot.length - 2,2);
}
else if (urlSiteCourant.indexOf('preprod')!=-1) {
    site = 'fr';
}
else if (urlSiteCourant.indexOf('127.0.0.1')!=-1 || urlSiteCourant.indexOf('localhost')!=-1) {
    site = 'fr';
}
else {
    site = urlRoot.substr(0,2);
}

//Initialisation de tous les sites et les serveurs associes
var siteFr = new SiteServer("fr", _EREPO1) ;
var siteEs = new SiteServer("es", _EREPO2) ;
var siteCn = new SiteServer("cn", _EREPO2) ;
var siteIt = new SiteServer("it", _EREPO3) ;
var siteDe = new SiteServer("de", _EREPO3) ;
var sitePt = new SiteServer("pt", _EREPO3) ;
var siteRu = new SiteServer("ru", _EREPO3) ;
var siteNl = new SiteServer("nl", _EREPO3) ;
var siteHu = new SiteServer("hu", _EREPO4) ;
var sitePl = new SiteServer("pl", _EREPO4) ;
var siteBe = new SiteServer("be", _EREPO4) ;
var siteUk = new SiteServer("uk", _EREPO4) ;
var siteBr = new SiteServer("br", _EREPO4) ;


var siteServerObjList = new ArrayList() ;
siteServerObjList.add(siteFr) ;
siteServerObjList.add(siteEs) ;
siteServerObjList.add(siteCn) ;
siteServerObjList.add(siteIt) ;
siteServerObjList.add(siteDe) ;
siteServerObjList.add(sitePt) ;
siteServerObjList.add(siteRu) ;
siteServerObjList.add(siteNl) ;
siteServerObjList.add(siteHu) ;
siteServerObjList.add(sitePl) ;
siteServerObjList.add(siteBe) ;
siteServerObjList.add(siteUk) ;
siteServerObjList.add(siteBr) ;

// Dedie a la recherche predictive
var preSearchDisplayed = false;
var preSearchQueryLaunched = false;
var preSearchLaunchTrigger = 2;
var preSearchTimerDelay = 900;

/**********************************************************************************
*                                            GENERIC FUNCTIONS
**********************************************************************************/

// Gestionnaire d evenement du document sur l action onclick
function documentOnclickEventHandler() {
    // Recherche predictive
    if (preSearchDisplayed) preSearchClose(document.getElementById('preSearch'));
}

//**********************************************************************************//
var _POST_FUNC_CHECK_SERV = function(httpstatus){
    // Si la reponse du service switch n est pas correct : pb erep --> mode degrade
   if(httpstatus == "200" && _validateSwitchServiceReponse(_serviceSwitchContextId)){
        setUrlErep(typeService, urlErep, client, kind1, number1, subNumber1, kind2, number2, subNumber2, localFunc) ;
    }
    else{
        if(numTentative < maxTentatives){
            var isResponse = checkOtherServer(typeService, _urlSite, _context, client, kind1, number1, subNumber1, kind2, number2, subNumber2, localFunc) ;
            numTentative++; //on incremente le numero de la tentative de connexion a un autre serveur
        }
        else {
            //ATTENTION : specifique a l enseigne, a faire quand aucun serveur eRep ne repond !!
            if(!isResponse){
                loadedSwitches = true;
                switchStatusError = true;
                // Non affichage des prix page modele
                hideBloc('blocPrixTpsReel');
            }
         }         
    }
}

/**********************************************************************************
*                                            Framework javascript eRepository
**********************************************************************************/
/*
 * Permet de stocker le serveur eRep dans un cookie et de lancer la fonction de retour
 * @param :
 *     _typeService : SERVICE_SWITCH
 *     _client : client ITOOL
 *     _kind1 : type de tiers 1, par exemple tier Site
 *     _number1 : numero du tiers 1, par exemple id du site
 *     _subNumber1 : sous numero du tiers 1, par exemple id du site
 *     _kind2 : type de tiers 2, par exemple tier Site
 *     _number2 : numero du tiers 2, par exemple id du site
 *     _subNumber2 : sous numero du tiers 2, par exemple id du site
 *     _localFunc : Fonction de retour
*/
function getUrlErep(_typeService, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, _localFunc){        
    //on doit recuprer du cookie l url eRep      
    var eRepServer = getCookie(_cookieName) ;
   
    //Si celui-ci est null, on va checker le serveur associe au site
    if(eRepServer == null){
        getServer() ;        
        checkServer(_typeService, _urlSite, _context, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, _localFunc) ;
    }
    //sinon, on retourne le serveur eRep qui lui est associe
    else{            
        return eRepServer;
    }
}

/*
 * Permet de stocker le serveur eRep dans un cookie et de lancer la fonction de retour
 * @param :
 *     _typeService : SERVICE_SWITCH
 *     urlErep : url eRep a stocker
 *     _client : client ITOOL
 *     _kind1 : type de tiers 1, par exemple tier Site
 *     _number1 : numero du tiers 1, par exemple id du site
 *     _subNumber1 : sous numero du tiers 1, par exemple id du site
 *     _kind2 : type de tiers 2, par exemple tier Site
 *     _number2 : numero du tiers 2, par exemple id du site
 *     _subNumber2 : sous numero du tiers 2, par exemple id du site
 *     _localFunc : Fonction de retour
 * @return :
 *    urlErep
*/
function setUrlErep(_typeService, urlErep, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, _localFunc){    
    if(urlErep != ""){
        _urlErep = urlErep ; //on stocke le serveur eRep dans la constante _urlErep       
        setCookie(_cookieName, urlErep, null, '/') ; //on sette le cookie        
     
        //Pour la premire recupration, on va charger les switchs
        if(_typeService == _SERVICE_SWITCH){
            _serviceSwitchContextId = _initAndExecuteSwitchService(_urlErep,getErepLanguageCode( _language), _number1, _centralNumber, _number2,_kind1,_number1,_subNumber1,_kind2,_number2,_subNumber2,_localFunc);
        }
       //Pour la premiere recupration, on va charger les thirds
        if(_typeService == _SERVICE_THIRD){
                var oContext = new JoServiceContext(_urlErep,getErepLanguageCode( _language), null, null, null);
                oContext.setThirdChildren(_kind, _number, _subNumber);
                var oService = new JoService(oContext);
                oService.execute(_localFunc);
        }
        return urlErep ;
    }
    else{
        return "" ;
    }
}

/*
 * Permet de recuprer l urlSite et le context en fonction du document.href courant
 * Permet de setter _urlSite et _context
*/
function getServer(){
    //on recupere le root de l'url courante
    var currentRootUrl = "" ;
    if(urlSiteCourant && urlSiteCourant != ""){
        currentRootUrl = getRootUrl(urlSiteCourant) ;
    }
    
    //on va recuperer le serveur eRepo associ a ce site
    if(currentRootUrl){
        for(var i=0 ; i<siteServerObjList.length(); i++){
            var siteServer = siteServerObjList.get(i);
            if(siteServer.getSite() == site){
                _urlSite = "http://"+currentRootUrl ;
                _context = siteServer.getERepoUrl();
            }
        }
    }    
}

/*
 * Permet de checker le serveur eRep associe au site
 * @param :
 *     _typeService : SERVICE_SWITCH
 *     thisUrlSite : url courante du site
 *     thisContext : le contexte courant du site
 *     _client : client ITOOL
 *     _kind1 : type de tiers 1, par exemple tier Site
 *     _number1 : numro du tiers 1, par exemple id du site
 *     _subNumber1 : sous numro du tiers 1, par exemple id du site
 *     _kind2 : type de tiers 2, par exemple tier Site
 *     _number2 : numro du tiers 2, par exemple id du site
 *     _subNumber2 : sous numro du tiers 2, par exemple id du site
 *     _localFunc : Fonction de retour
*/
function checkServer(_typeService, urlSite, context, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, _localFunc){    
    if(urlSite != "" && context != ""){
        //parametres qui vont servir a la fonction de retour
        typeService = _typeService ;
        client = _client ; 
        kind1 = _kind1;
        number1 = _number1;
        subNumber1 = _subNumber1;
        kind2 = _kind2 ;
        number2 = _number2 ;
        subNumber2 = _subNumber2 ;        
        localFunc = _localFunc ;
        urlErep = urlSite + context ;        
        indexServ = 0 ;
        
        _serviceSwitchContextId = _initAndExecuteSwitchService(urlErep,getErepLanguageCode( _language), _number1, null, null,_kind1,_number1,_subNumber1,null,null,null,_POST_FUNC_CHECK_SERV);
    }
}

/*
 * Permet de checker tous les serveurs eRep jusqu a ce que un serveur reponde
 * @param :
 *     _typeService : SERVICE_SWITCH
 *     indexServer : index du serveur courant  tester
 *     thisUrlSite : url courante du site
 *     thisContext : le contexte courant du site
 *     _client : client ITOOL
 *     _kind1 : type de tiers 1, par exemple tier Site
 *     _number1 : numero du tiers 1, par exemple id du site
 *     _subNumber1 : sous numero du tiers 1, par exemple id du site
 *     _kind2 : type de tiers 2, par exemple tier Site
 *     _number2 : numero du tiers 2, par exemple id du site
 *     _subNumber2 : sous numero du tiers 2, par exemple id du site
 *     _localFunc : Fonction de retour
*/
function checkOtherServer(_typeService, thisUrlSite, thisContext, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, _localFunc){    
    var currentERepoServer = serverList.get(indexTestServer) ; //on recupere le serveur a tester
    
    //parametres qui vont servir a la fonction de retour
    typeService = _typeService ;
    client = _client ; 
    kind1 = _kind1;
    number1 = _number1;
    subNumber1 = _subNumber1;
    kind2 = _kind2 ;
    number2 = _number2 ;
    subNumber2 = _subNumber2 ;        
    localFunc = _localFunc ;
    indexTestServer = (indexTestServer + 1) % 4 ;
    
    //Si le serveur a tester est le serveur associe au site, on va recuperer le prochain serveur a tester de la liste si celui-ci existe
    if(currentERepoServer == thisContext){                
        if(serverList.get(indexTestServer) != ""){
            currentERepoServer = serverList.get(indexTestServer) ;
        }
        indexTestServer = (indexTestServer + 1) % 4 ;
    }
    
    if(currentERepoServer != ""){   
        urlErep = thisUrlSite + currentERepoServer ;
        
        _serviceSwitchContextId = _initAndExecuteSwitchService(urlErep,getErepLanguageCode( _language), _number1, null, null,_kind1,_number1,_subNumber1,null,null,null,_POST_FUNC_CHECK_SERV);
        
        return true ;
    }
    else{
        return false ;
    }
}


/*
 * Permet de retourner l'url root du site
 * @param : urlHref doit tre du type http://www.aptonia.com ou http://aptonia.preview.dktetrix.net ou http://www.decathlon.fr ou http://fr.preview.dktetrix.net
 * @return : www.aptonia.com ou aptonia.preview.dktetrix.net ou decathlon.fr ou fr.preview.dktetrix.net
*/
function getRootUrl(urlHref){
    if(urlHref){
        var rootUrl = "" ;
        var urlSplit = urlHref.split("/") ;
        if(urlSplit.length > 1 && urlSplit[2]){
            rootUrl = urlSplit[2] ;
        }
        return rootUrl ;
    }
    else{
        return "" ;
    }
}

/*
* Permet de retourner aleatoirement l indice d un serveur eRep a tester dans le tableau serverList
* @param : nbServer est le nombre de serveurs dans le tableau des serveurs eRep (serverList) 
* @return : nombre entier aleatoire de 0 a nbServer (=indice aleatoire du tableau serverList)
*/
function getRandomServerIdToCheck(nbServer){
    var randomId = Math.ceil(Math.random()*nbServer) ;
    return (randomId - 1) ;
}

/*############################################################################################## */
/* Retourne le code langue eRep correspondant au code langue itool passe en parametre : utile pour le Bresil */
function getErepLanguageCode(itoolLanguageCode) {
    if (itoolLanguageCode=='FR') return 'FR';
    else if (itoolLanguageCode=='NL') return 'NL';
    else if (itoolLanguageCode=='ES') return 'ES';
    else if (itoolLanguageCode=='CA') return 'CA';
    else if (itoolLanguageCode=='DE') return 'DE';
    else if (itoolLanguageCode=='PT') return 'PT';
    else if (itoolLanguageCode=='ZH') return 'ZH';
    else if (itoolLanguageCode=='HU') return 'HU';
    else if (itoolLanguageCode=='IT') return 'IT';
    else if (itoolLanguageCode=='PL') return 'PL';
    else if (itoolLanguageCode=='RU') return 'RU';
    else if (itoolLanguageCode=='EN') return 'EN';    
    // Cas particulier du Bresil
    else if (itoolLanguageCode=='BR') return 'B6';
    // FR par defaut
    else return 'FR';
}

/** ############################
 * EXEMPLE
 */
 /*
function loadSwitches(_client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2) {	
    _urlErep = getUrlErep(_SERVICE_SWITCH, _client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, POST_LOAD_SWITCH_SERVICE_FUNCTION) ;
    
    if(_urlErep != ""){
        _initSwitchService(_urlErep);
        _loadSwitches(_client, _kind1, _number1, _subNumber1, _kind2, _number2, _subNumber2, POST_LOAD_SWITCH_SERVICE_FUNCTION);
    }
}
*/


/*
 * Permet d ouvrir la popup spécifique à Nanterre
 */
function launchNanterrePopup(myTarget){
    var myCookieMagasin = getCookie('decathlon');
    if (myCookieMagasin != null) {
            if (getEltFromUrl(myCookieMagasin, "magSubst") == '1')  {
                if (myTarget == 'cnx') openNewWindow('/FR/popup-nanterre-msg-connexion-90218699/index.html', 'Nanterre', 'width=550,height=400, ,menubar=no,toolbar=no, scrollbars=no, resizable=no', false);
                else openNewWindow('/FR/popup-nanterre-msg-eresa-90220721/index.html', 'Nanterre', 'width=550,height=400, ,menubar=no,toolbar=no, scrollbars=no, resizable=no', false);
            }
        }
}

/**********************************************************************************
*                                            Predictive search functions
**********************************************************************************/

// Gere la recherche predictive
function preSearchQuery(engineUrl, timerExpire) {
    // Test du switch d activation
    if (!getSwitchSite('SAISIE_PREDICTIVE')) return false;

    // Timer pour ne pas solliciter le service a chaque appui rapproche des touches
    if (!timerExpire) {
        if (preSearchQueryLaunched) return true;
        window.setTimeout("preSearchQuery('"+engineUrl+"', "+true+")", preSearchTimerDelay);
        preSearchQueryLaunched = true;
        return true;
    }
    else preSearchQueryLaunched = false;

    var sQuery = document.getElementById('text');
    if (sQuery != 'undefined' && engineUrl != '') {
        if (sQuery.value.length > preSearchLaunchTrigger) {
            // Lancement requete
            _preSearchQuery(sQuery.value, engineUrl, POST_LOAD_PRESEARCH_FUNCTION);
        }
        else preSearchClose();
    }
    
    return true;
}

// Ferme la liste des propositions
function preSearchClose() {
    // Masquer la liste
    hideBloc("preSearch");
    // Vider la liste
    _preSearchClear(document.getElementById('preSearchList'));
    // Positionne le flag d affichage
    preSearchDisplayed = false;
}

// Place dans le champs de saisi le terme selectionne
function preSearchSelectProposal() {
    // Suppression surlignage
    var sTxt = _preSearchLightTxtRemove(this.innerHTML);

    // Inscription de la proposition dans le champ de saisie
    document.getElementById('text').value = sTxt;
    
    // Fermeture de la liste
    preSearchClose();
    
    // Soumission du formulaire
    document.mdrech.onsubmit();
}


// Internal PreSearch functions - Do not access directly

// Envoi le requete vers le service de recherche predictive (ajax)
function _preSearchQuery(_sQuery, _engineUrl, _localFunc) {
    var aProps = new Array();

    var func = function (xmlHttp, httpStatus) {
        oGlobalXml = xmlHttp.responseXML;
        if(oGlobalXml!=null) {
            var oProposals = oGlobalXml.getElementsByTagName("expression");
            for (var i = 0; i < oProposals.length; i++) aProps[i] = getNodeValue(oProposals[i]);
        }

        if (_localFunc != null) {
            try {
                _localFunc(httpStatus,aProps,_sQuery);
            } catch (e) {
                return false;
            }
        }
        
    return true;
    }

    //Ajout des parametres a l url du service
    _engineUrl = _engineUrl + "?text=" + encodeURI(_sQuery) + "&language=" + _language + "&siteId=" + _siteNumber ;
    
    //Lancement du processus
    var oProcess = new IAjaxProcess(_engineUrl, func);
    oProcess.run();
    return true;
}

// Fonction de post traitement assurant l affichage des resultats de la recherche predictive
var POST_LOAD_PRESEARCH_FUNCTION = function postLoadPresearchFunction(httpStatus,aProposals,sSearch) {
    if(httpStatus != null && httpStatus==200)  {
        oDiv = document.getElementById('preSearchList');

        // Suppression liste precedente
        _preSearchClear(oDiv);
    
        // Des propositions existent
        if (aProposals.length > 0) {
            // Creation d une liste UL
            oUl = createElement_ul('preSearchList', '', oDiv);

            
            // On boucle sur les propositions pour creer les LI
            for (var i=0; i < aProposals.length; i++) {

                // Surlignage
                var sTxt = _preSearchLightTxtAdd(sSearch,aProposals[i]);

                // Creation LI avec son lien
                var oLi =  document.createElement('li');
                oA = document.createElement('a');
                oA.href = "#";
                oA.onclick = preSearchSelectProposal;
                oA.innerHTML = sTxt;
                
                oLi.appendChild(oA);
                oUl.appendChild(oLi);
            }
            // Affichage de la liste
            showBloc('preSearch');
            
            preSearchDisplayed = true;
            
            return true;            
        }
    }

    // Dans tous les autres cas, on ferme la boite
    preSearchClose();
    
    return false;
}

// Efface la liste des propositions
function _preSearchClear(oListe) {
        if (oListe.hasChildNodes()) while (oListe.childNodes.length > 0) oListe.removeChild(oListe.firstChild);
}

function _preSearchLightTxtAdd(sToLight,sTxt) {
    var reg = new RegExp("("+ sToLight +")", "gi");
    sTxt = sTxt.replace(reg,"<strong>$1</strong>");
    
    return(sTxt);
}

function _preSearchLightTxtRemove(sTxt) {
    var reg = new RegExp("(</?strong>)","gi");
    sTxt = sTxt.replace(reg, "");
    
    return(sTxt);
}

/*********************************************************************************************************************************************************/
// Recupere le code html de la page magasin _storeUrl
function getStoreInfos(_storeUrl, _localFunc) {
    var flow = "";
    
    var func = function (xmlHttp, httpStatus) {
        oGlobalText = xmlHttp.responseText;
        if(oGlobalText != null) {
            flow = xmlHttp.responseText;
        }

        if (_localFunc != null) {
            try {
                _localFunc(httpStatus, flow);
            } catch (e) {
                return false;
            }
        }

    return true;
    };

    var theUrl = "/" + _language + _storeUrl + "index.html"

    //Lancement du processus
    var oProcess = new IAjaxProcess(theUrl, func);
    oProcess.run();
    return true;
}

/*********************************************************************************************************************************************************/
// Page des avis oxylane - Permet d adapter le lien de fermeture de la page
function loadAvisOxylane() {
    var oDiv = document.getElementById("oxy-liens");
    if (!oDiv) return false;
    
    var oTxt;
    var oA = document.createElement('a');
    
    // On vient du site
    if (window.location.search == "?avis") {
        oTxt = document.createTextNode(oxyLibFermerPopup);
        oA.href = "#";
        oA.onclick = function(){window.close();}
    }
    // Tous les autres cas
    else {
        oTxt = document.createTextNode(oxyLibVoirProduit);
        oA.href = urlPageModele;
    }
    
    oA.appendChild(oTxt); 

    oDiv.appendChild(oA);
}