/*##############################################################################################
########################### JS DE GESTION DES PRODUITS DES MINIS BOUTIQUES ###################### 
/*############################################################################################## */

var nbMinProductsToDisplayBoutique = 2;        // Seuil min de modeles pour afficher la mb
var nbMaxOngletsToDisplayBoutique = 2;         // Seuil max d onglets MB a afficher sur la page rayon

var iMbNbItemsToDisplay = 0;                              // Nombre total d items a afficher
var aMbItems = null;                                                // Liste complete des items
var aMbItemsResume = new Array();                  // Liste resume des items, support pour le tri et filtrage (resume : id, marque, prix)
var aMbItemsToDisplay = new Array();                // Liste des items a afficher (apres filtrage et tri)

var iMbPagiMaxItemsPerPage = 16;                    // Nb max d items par page
var iMbPagiCurrentPage = 1;                                // Page courrante
var iNbMaxPages = 5;                                             // Nombres de pages maximum affichees dans la pagination (>= 5)

var nbPdtsPerLine = 4;                                           // Nombre de produits par ligne

var nivs = new Array();                                             // Tableau contenant les references produits de chaque niveau de l arbo
var modelsDisplayed = '';                                       // Liste des modeles affiches dans le niveau courant (permet de retrouver les modeles caches apres un filtre par marque)

var modeMosai = true;                                            // Mode d affichage -> mosaique par defaut

var tabModels = new Array();

/*############################################################################################## */
/*############################################################################################## */
/*##################################### MINI BOUTIQUE ########################################### */
/*############################################################################################## */
/*############################################################################################## */

// Recupere la liste des modeles a charger pour la boutique administrable
function addModelsShopToLoad() {
    if(sModels != '') {
        var sModel = '';
        var posDep = 0;
        
        sModels = sModels.substring(0, sModels.length - 1);
        nivs = sModels.split('/');
        for(var i = 0;i < nivs.length;i++) tabModels = tabModels.concat(nivs[i].split(';'));
        for(var i = 0;i < tabModels.length && i < MAX_LOAD_MODELS;i++) psiAddModelForService(tabModels[i]);
        
        // Si il y a plus de MAX_LOAD_MODELS, les autres modeles seront traites apres les premiers MAX_LOAD_MODELS
        tabModels = tabModels.slice(MAX_LOAD_MODELS,tabModels.length - 1);

        if(nivs.length > 1) {
            showBloc("middle-left");
            getDisplayIfArbo();
        }
        
        showBloc('titreBoutiqueBandeau', 'inline'); // Titre boutique administrable
    }
}

function loadArboMegaShop(cookieMagasin){
    if(typeBoutique == "mega-shop-sales") 
        if(!checkParamsForShopSales(cookieMagasin)) return false;
        
    var idMagasin = "null";
    if(cookieMagasin != null) idMagasin = getEltFromUrl(cookieMagasin, 'idMagasin');

    var cookieArbo = getCookie("cookieArbo-" + typeBoutique);
    var idMag = null;
    if(cookieArbo != null) idMag = getEltFromUrl(cookieArbo, 'idMag');
    
    if(cookieArbo && idMag == idMagasin) {
        var unRayon = getEltFromUrl(cookieArbo, 'unrayon');
        if(unRayon == "true") {
            var rayonsToDisplay = getEltFromUrl(cookieArbo, 'rayons');
            rayonsToDisplay = rayonsToDisplay.split('-');
            for(var i = 0;i < rayonsToDisplay.length - 1;i++)
                if(document.getElementById("rayon_" + rayonsToDisplay[i])) document.getElementById("rayon_" + rayonsToDisplay[i]).parentNode.style.display = 'block';
                
            var menuSports = document.getElementById("menu-sports").getElementsByTagName('ul')[0];
            var listeLi = menuSports.getElementsByTagName("li");
            var i = 0;
            while(i < listeLi.length) {
                if (listeLi[i].style.display == "") menuSports.removeChild(listeLi[i]);
                else i++;
            }
            
            if(typeBoutique == "mega-shop-promo") showBloc("bouton-promo");
            showBloc("middle-left");
            retriveBoutiqueUrlParameters();
            getDisplayIfArbo();
            loadBoutiqueConnectOrNot(cookieMagasin);
        }
    }
    else {
        // Creation du contexte
        var oContext = new JoServiceContext(_urlErep, _language, _siteNumber, _centralNumber, idMagasin);
        oContext.setDepartments();
        setFilterTypeBoutique(typeBoutique,oContext);
        // Creation du service
        var oService = new JoService(oContext);  
        // Execution du service
        oService.execute(POST_LOAD_ARBO_MEGA_SHOP);
    }
}

var POST_LOAD_ARBO_MEGA_SHOP = function(httpStatus, _joService) {
    var oCardinalities = _joService.getCardinality(SERVICE_CONSTANTS.CARD_KIND_DEPT);
    var cardinalities = oCardinalities.getCardinalities(SERVICE_CONSTANTS.CARD_KIND_DEPT);

    var idMagasin = null;
    if(cookieMagasin != null) idMagasin = getEltFromUrl(cookieMagasin, 'idMagasin');
    var valeurCookieArbo = "idMag=" + idMagasin + "&amp;rayons=";

    if(cardinalities) {
        for (var i = 0;i < cardinalities.length;i++) {
            var idRayon = cardinalities[i].substring(cardinalities[i].indexOf("#",1) + 1, cardinalities[i].lastIndexOf("#"));
            valeurCookieArbo += idRayon + "-";
            if(document.getElementById("rayon_" + idRayon)) document.getElementById("rayon_" + idRayon).parentNode.style.display = 'block';
        }
        
        var menuSports = document.getElementById("menu-sports").getElementsByTagName('ul')[0];
        var listeLi = menuSports.getElementsByTagName("li");
        var i = 0;
        while(i < listeLi.length) {
            if (listeLi[i].style.display == "") menuSports.removeChild(listeLi[i]);
            else i++;
        }
   
        // Lancement boutique
        if(typeBoutique == "mega-shop-promo") showBloc("bouton-promo");
        valeurCookieArbo += "&amp;unrayon=true";
        retriveBoutiqueUrlParameters();
        showBloc("middle-left");
        getDisplayIfArbo();
        loadBoutiqueConnectOrNot(cookieMagasin);
    }
    else valeurCookieArbo += "&amp;unrayon=false";
    
    setCookie("cookieArbo-" + typeBoutique,valeurCookieArbo,null,'/');
}

 // Lancement de la shop sales
function checkParamsForShopSales(sCookieMagasin) {

    // Si shop desactivee ou pas dans periode de soldes, on arrete tout et on va sur la HP
    if (sCookieMagasin != null) {           
        if (!getSwitchSite('SHOP_SALES')) {
            window.parent.location.href = rootPath;
            return false;
        }
    }
    else {
        if (!getSwitchSite('FLAG_IS_SOLD_PERIOD') || !getSwitchSite('SHOP_SALES')) {
            window.parent.location.href = rootPath;
            return false;
        }
    }

    // Si client non connecte, on affiche la popup de connexion magasin
    if (sCookieMagasin == null) {
        show_filter('filter');
        show_popup('filter_frame');
        return false;
    }
    
    // Changement du lien pour quitter le magasin
    var oLeave = document.getElementById("linkLeaveStore");
    if (oLeave) {
        oLeave.onclick = SHOP_LINK_LEAVE_STORE;
    }
    
    return true;
}

var SHOP_LINK_LEAVE_STORE = function shopLinkLeaveStore () {
    checkBasket(function(){shopLeave()});return false;
}

function shopLeave() {
    deleteCookie('decathlon');
    window.parent.location.href = rootPath;
}

/*############################################################################################## */
 // Fonction permettant de recuperer les parametres passes dans l url a la boutique
function retriveBoutiqueUrlParameters() {
    sRequete = window.location.search.substring(1);
    tRequete = sRequete.split('&');
    
    // Recherche ID premier rayon
    if(document.getElementById("menu-sports")) {
        var iFirstRayonId = document.getElementById("menu-sports").getElementsByTagName('a')[0].href;
        iFirstRayonId = iFirstRayonId.substr(iFirstRayonId.indexOf('=') + 1);
    }

    // Recuperation code externe rayon depuis url
    if (tRequete.length > 0) {
        var paramName = tRequete[0].split('=')[0];
        var paramValue = tRequete[0].split('=')[1];
        if (paramName == 'idRayon') _idDepartement = paramValue;
    }

    if (_idDepartement == "" && typeof iFirstRayonId != "undefined" && iFirstRayonId != "") _idDepartement = iFirstRayonId; // Rayon par defaut

    // Deduction des autres parametres
    if (_idDepartement != "") {
        var urlRayon = '', titreRayon = '';
        oHtml = document.getElementById("r" + _idDepartement + "Titre");
        if (oHtml) titreRayon = oHtml.firstChild.nodeValue;
        oHtml = document.getElementById("r" + _idDepartement + "Url");
        if (oHtml) urlRayon = oHtml.firstChild.nodeValue;
        
        setBlocByHtml('lienRayon',titreRayon);
        setHref('lienRayon','/'+_language+urlRayon);
        showBloc('titreRayonAriane','inline');
        setBlocByHtml('titreRayonBandeau',titreRayon);
        
        changeBlocClass('rayon_' + _idDepartement, 'hover');
    }
}
/*############################################################################################## */
/* Determine les parametres pour le chargement des modeles en fonction de la presence du cookie : modeles central OU modeles magasin */
function loadBoutiqueConnectOrNot(cookieMagasin) {

    // Test activation boutique administrable
    if (typeBoutique == "administrable") {           
        if (!getSwitchSite('SHOP_MANAGEABLE')) {
            window.parent.location.href = rootPath;
            return false;
        }
    }    

    // Fonction emailing
    var idStoreCookie = "";
    if (cookieMagasin !=null) idStoreCookie = getEltFromUrl(cookieMagasin, 'idMagasin');
    changeMagasin(idStoreCookie);

    // cookieMagasin est null si pas de cookie magasin ou switch localStock false
    // Cas magasin               
    if (cookieMagasin !=null) {
        if (typeBoutique == "mega-shop-sales" && !getSwitchMagasin('FLAG_IS_SOLD_PERIOD')) shopDispMsg(libStoreNoSales);
        else {
            idMagasin = getEltFromUrl(cookieMagasin, 'idMagasin');
            /* On recupere d abord les dates de soldes du magasin */
            loadThirdParty(_client, THIRD_KIND_STORE, idMagasin, idMagasin);
        }
    }
    // Cas centrale
    else {
        if (typeBoutique == "mega-shop-sales") shopDispMsg(libMustBeConnected);
        else loadModelsBoutique(_siteNumber, _centralNumber, null, _idDepartement, getErepLanguageCode(_language));
    }
}
/*############################################################################################## */
// Fonction assurant le chargement des donnees pour la mini boutique (ajax)
function loadModelsBoutique(_siteNumber, _centralNumber, _storeNumber, _idDepartement, _language) {
    // Creation du contexte
    var oContext = new JoServiceContext(_urlErep, _language, _siteNumber, _centralNumber, _storeNumber);       
    // Definition du contexte
    if(_idDepartement) oContext.setDepartment(_idDepartement);
    else oContext.setModels();
    // Activation des filtres de donnees 
    oContext.activateDataFilter();    
    // Filtre prix, marketing et assortiement
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_PRICE);
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_MARKETING);
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_MIX);
    // Filtre exclusion des modeles sans donnees marketing
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_MRK_AVAILABILITY);

     // Filtre prix min et prix max passes en parametres dans l url
     var urlParams = document.location.search;
     var min = '';
     var max = '';
     if(urlParams.indexOf('min=') != -1) {
         min = urlParams.substr(urlParams.indexOf('min=') + 4);
         if(min.indexOf('&') != -1) min = min.substring(0,min.indexOf('&'));
     }
     if(urlParams.indexOf('max=') != -1) {
         max = urlParams.substr(urlParams.indexOf('max=') + 4);
         if(max.indexOf('&') != -1) max = max.substring(0,max.indexOf('&'));
     }
     if(min || max) {
         oContext.setPriceRangeFilter(min, max);
         document.forms["formFiltrerPrix"].min.value = unescape(min);
         document.forms["formFiltrerPrix"].max.value = unescape(max);
         if(typeof document.forms['formFiltrerPrix'].idRayon != "undefined") document.forms['formFiltrerPrix'].idRayon.value = _idDepartement;
         showBloc('annuleFiltre','inline');
         
         libNoProducts = filterNoResult;
     }
             
    // Filtre en fonction du type de la boutique
    if(_idDepartement) setFilterTypeBoutique(typeBoutique, oContext);
    else // Boutique administrable
        for (var i = 0; i < PSI_QMODELS_ARRAY.length; i++) oContext.addModels(PSI_QMODELS_ARRAY[PSI_QMODELS_ARRAY[i]]);
    // Creation du service
    var oService = new JoService(oContext);  
    // Execution du service
    oService.execute(POST_LOAD_BOUTIQUE_FUNCTION);     
}
/*############################################################################################## */
// Charge le bon filtre en fonction du type de la boutique
// Appellee par loadModelsBoutique 
function setFilterTypeBoutique(typeBoutique, oContext) {
 // Boutique produit bleus
    if (typeBoutique.indexOf('shop-blue-product') != -1) oContext.setModelKindFilter(SERVICE_CONSTANTS.MODEL_KIND_BLUE);
    // Boutique fin de collection
     if (typeBoutique=='shop-end-of-collection') {
        oContext.enableStepFilter(SERVICE_CONSTANTS.STEP_3);
        oContext.enableStepFilter(SERVICE_CONSTANTS.STEP_7);
        oContext.enableStepFilter(SERVICE_CONSTANTS.STEP_8);
    }
    // Boutique promo
     if (typeBoutique.indexOf('shop-promo') != -1) oContext.setPriceKindFilter(SERVICE_CONSTANTS.PRICE_KIND_PROMO);
    // Boutique soldes
    if (typeBoutique.indexOf('shop-sales') != -1) { 
        oContext.setPriceKindFilter(SERVICE_CONSTANTS.PRICE_KIND_SOLD);
        // Exclusion des modeles suivant la regle BDFR
        oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_BDFR);
    }
}
/*############################################################################################## */
// Fonction de post chargement des produits de la mini boutique 
var POST_LOAD_BOUTIQUE_FUNCTION = function postLoadBoutique(httpStatus, _joService) {

    if(httpStatus != null && httpStatus==200) {
        // Recuperation du service
        var oContent = _joService.getContent();
        if (oContent) {
            if (!aMbItems) aMbItems = new JoItems(_joService.getId());
            var items = oContent.getItemsList();
            // Recuperation de la liste d items
            for (var i = 0;i < items.length;i++) aMbItems.addItem(items[items[i]]);
        }
        
        // [boutique administrable] si il n y a plus de modeles a traites on affiche les modeles charges
        if(tabModels.length == 0) {
            // On masque le message d attente
            document.getElementById("affWait").style.display = "none";
            document.getElementById("middle_boutique").style.display = "block";
            if (!aMbItems || aMbItems.length < nbMinProductsToDisplayBoutique && typeBoutique.indexOf("mega-") == -1) {
                noProducts();
                return;
            }
            
            aMbItems = aMbItems.getItems();
        
            // Initialisation
            _initBoutique();

            // Affichage de la famille requise pour la boutique admistrable uniquement
            showFamily();

            // Affichage des blocs adequats
            showBlocIfCookieBoutique(cookieMagasin);
        }
         // [boutique administrable] si il y a encore des modeles a traites on appelle une nouvelle fois le service loadModelsBoutique
        else {
            PSI_QMODELS_ARRAY = new Array();
            for(var i = 0;i < tabModels.length && i < MAX_LOAD_MODELS;i++) psiAddModelForService(tabModels[i]);
            tabModels = tabModels.slice(MAX_LOAD_MODELS,tabModels.length - 1);
            loadModelsBoutique(_siteNumber, _centralNumber, getEltFromUrl(cookieMagasin,"idMagasin"), null, getErepLanguageCode(_language))
        }
    }
}
/*############################################################################################## */
// Gere l affichage des produits lorsqu un menu est affiche (3 produits par ligne, 15 produits par page)
function getDisplayIfArbo() {
    iMbPagiMaxItemsPerPage = 15;
    nbPdtsPerLine = 3;
    // Modification des valeurs de la liste deroulante permettant de choisir le nombre de produits par page
    var nbPdtsPerPage = document.getElementById("nbPdtsParPage");
    for(var i = 0;i < nbPdtsPerPage.length - 1;i++) {
        nbPdtsPerPage[i].value = nbPdtsPerPage[i].value - (i + 1);
        nbPdtsPerPage[i].text = nbPdtsPerPage[i].value;
    }
    
    // Scroll automatique du menu pour afficher le rayon selectionne
    var ul = document.getElementById("menu-sports").getElementsByTagName("ul")[0];
    var rayons = ul.getElementsByTagName("a");
    var posRayon = 0;
    for (var i=0;i < rayons.length && posRayon == 0;i++)
        if (rayons[i].id == "rayon_" + _idDepartement) posRayon = i;
    ul.scrollTop = posRayon*36 - 222;
}
/*############################################################################################## */
// Fonction appelee au clique sur niveau de l arbo gauche dans le cas d une boutique administrable
function showModelsNiv(niv) {
    // Style des liens dans l arborescence gauche, class hover pour le niveau actif
    var oMenu = document.getElementById('ba-menu');
    if (oMenu) {
        var liens = oMenu.getElementsByTagName('a');
        for(var i = 0; i < liens.length;i++) liens[i].className = '';
    }
    var oLien = document.getElementById("ba-menu-niv-" + niv);
    if (oLien) oLien.className = "hover";
    
    // on efface la liste ordonnee
    aMbItemsToDisplay = new Array();
    for (var i = 0; i < aMbItemsResume.length; i++) if (nivs[niv].indexOf(aMbItemsResume[i][0]) != -1) aMbItemsToDisplay.push(aMbItemsResume[i][0]);
    
    // Reactualisation nombre total d items a afficher
    iMbNbItemsToDisplay = aMbItemsToDisplay.length;
    
    modelsDisplayed = aMbItemsToDisplay.toString();
    
    if(iMbNbItemsToDisplay > 0) {
        _updateDisplayNbOfItems();
        updateListeMarques();
        
        // Init page depart
        jumpToPage(1,true);
    }
    else {
        _deleteAllDisplayItems();
        noProducts();
    }
}
/*############################################################################################## */
// [Boutique administrable] affiche la famille de produits passee en param
function showFamily() {

    if (typeBoutique == 'administrable') {
        var urlParams = document.location.search;
        if(urlParams.indexOf('fam=') != -1) {
            var slot = urlParams.substr(urlParams.indexOf('fam=') + 4);
            if(slot.indexOf('&') != -1) slot = slot.substring(0,slot.indexOf('&'));
            slot = parseInt(slot);

            if (!isNaN(slot)) {
                slot = slot - 1;
                if (slot >= 0 && slot <= (nivs.length - 1)) showModelsNiv(slot);

                document.forms["formFiltrerPrix"].fam.value = unescape(slot + 1);
            }

        }
    }

}
/*############################################################################################## */
/*############################################################################################## */
// Lance le filtrage selon la marque
// _sMarque : nom de la marque selon laquelle il faut filtrer
function filterBoutiqueByMarque(_sMarque) {
    // on efface la liste ordonnee
    aMbItemsToDisplay = new Array();

    // Recherche
    for (var i = 0; i < aMbItemsResume.length; i++) 
        if ((aMbItemsResume[i][1] == _sMarque || _sMarque =='') && modelsDisplayed.indexOf(aMbItemsResume[i][0]) != -1) aMbItemsToDisplay.push(aMbItemsResume[i][0]);

    // Reactualisation nombre total d items a afficher
    iMbNbItemsToDisplay = aMbItemsToDisplay.length;
    _updateDisplayNbOfItems();

    // Init page depart
    jumpToPage(1,true);
}
/*############################################################################################## */
/* Fonction qui verifie les champs de filtre du prix avant de valider le formualire */
function valideFiltrePrix(){
    var min = document.forms["formFiltrerPrix"].min.value.replace(',','.');
    var max = document.forms["formFiltrerPrix"].max.value.replace(',','.');
    if(min != '') min = parseFloat(min.replace('/ /g',''));
    if(max != '') max = parseFloat(max.replace('/ /g',''));
    
    // Test de la valeur des deux champs
    if(min == '' && max == '' || isNaN(min) || isNaN(max) || min < 0 || (max != '' && min > max))
        showBloc('erreurFiltrePrix');
    else{
        var chMin = min.toString();
        var chMax = max.toString();
        // On arrondi a deux chiffres apres la virgule
        if(chMin.indexOf('.') != -1 && chMin.substring(chMin.indexOf('.') + 1,chMin.length).length > 2) min = min.toFixed(2);
        document.forms["formFiltrerPrix"].min.value = min;
        if(chMax.indexOf('.') != -1 && chMax.substring(chMax.indexOf('.') + 1,chMax.length).length > 2) max = max.toFixed(2);
        document.forms["formFiltrerPrix"].max.value = max;

        if(typeof document.forms['formFiltrerPrix'].idRayon != "undefined") document.forms['formFiltrerPrix'].idRayon.value = _idDepartement;
        
        // Tag
        if (typeof pageTracker != 'undefined') gaHmap('hmap_shop','filter_price');
        
        document.forms['formFiltrerPrix'].submit();
    }
}
function annulerFiltre() {
    document.forms["formFiltrerPrix"].min.value = '';
    document.forms["formFiltrerPrix"].max.value = '';
    document.forms['formFiltrerPrix'].submit();
}
/*############################################################################################## */
/* Fonction permettant de trier les produits par prix ou par marque, par ordre croissant ou decroissant */
function trierProduits() {
    var tri = document.getElementById('mbTrier').value;
    var indice = tri.substring(0,tri.indexOf('-'));
    var order = tri.substring(tri.indexOf('-') + 1,tri.lastIndexOf('-'));
    var type = tri.substr(tri.lastIndexOf('-') + 1);
    trierTableau(aMbItemsResume, indice, order, type);
    _sortAffectResultToDisplayArray();
    
    jumpToPage(1,true);
}
/*############################################################################################## */
/* Fonction qui modifie le mode d affichage - Mosaique ou Liste */
function changeModeAff(bouton) {
    if(bouton.className == '') { // On verifie que le mode qui a ete clique n est pas le mode deja affiche
        modeMosai = !modeMosai;
        var div = document.getElementById('contenu_' + typeBoutique);
        
        if(modeMosai) {
            div.className += ' mosai';
            setSrc('modeMosaique', '../images/static/btn-aff-mosa-open.gif');
            setSrc('modeListe', '../images/static/btn-aff-liste-out.gif');
            
            document.getElementById('modeMosaique').parentNode.className = 'hover';
            document.getElementById('modeListe').parentNode.className = '';
        }
        else {
            div.className = div.className.substring(0, div.className.indexOf(' mosai'));
            setSrc('modeMosaique', '../images/static/btn-aff-mosa-out.gif');
            setSrc('modeListe', '../images/static/btn-aff-liste-open.gif');
            document.getElementById('modeListe').parentNode.className = 'hover';
            document.getElementById('modeMosaique').parentNode.className = '';
        }
    }
}
/*############################################################################################## */
/* Fonction qui modifie le nombre de produits affiches sur une page */
function nbProductsPerPage() {
    var value = document.getElementById('nbPdtsParPage').value;
    if(iMbNbItemsToDisplay > iMbPagiMaxItemsPerPage || iMbNbItemsToDisplay > value) {
        iMbPagiMaxItemsPerPage = value;
        jumpToPage(1,true);
    }
    else nbPdtsParPage = value;
}
/*############################################################################################## */
// Permet d afficher une page specifique
function jumpToPage(_pNum, deleteChilds) {
    // Masque l ancienne page et numero
    _updateDisplayPaginationPageNum(iMbPagiCurrentPage, "UNFOCUS");
    hideBloc("mb-page-" + iMbPagiCurrentPage);

    // pour ne pas avoir deux id identiques, il faut gerer le cas de la page qui affiche tous les modeles
    if (typeof deleteChilds != "undefined" && deleteChilds) _deleteAllDisplayItems();

    // Le numero de page demande devient la page courrante
    iMbPagiCurrentPage = _pNum;
    displayPagination();
    
    // Affiche nouvelle page / numero
    _updateDisplayPaginationPageNum(iMbPagiCurrentPage, "FOCUS");
    _updateDisplayItems();
}
/*############################################################################################## */
// Affiche message indiquant qu aucun modele est dans la mb
function noProducts() {
    // On afffiche le message
    oBout = document.getElementById("middle_boutique");
    oP = document.createElement("p");
    oP.className = "aucunProduit";
    oTxt = document.createTextNode(libNoProducts);
    oP.appendChild(oTxt);
    oBout.appendChild(oP);
    
    _updateDisplayNbOfItems();
}

/*############################################################################################## */
// Affiche message indiquant que le client doit se connecter
function shopDispMsg(_msg) {
    // On masque le message d attente
    document.getElementById("affWait").style.display = "none";
    document.getElementById("middle_boutique").style.display = "block";
    // On afffiche le message
    var oBout = document.getElementById("middle_boutique");
    var oP = document.createElement("p");
    oP.className = "shopMsg";
    var oTxt = document.createTextNode(_msg);
    oP.appendChild(oTxt);
    oBout.appendChild(oP);
}

/*############################################################################################## */
/*############################################################################################## */
// Initialisation de la mb. Appel unique 
function _initBoutique() {

    // Mise en forme du bloc tri dans le cas ou il y a une arbo
    if(document.getElementById("middle-right")) {
        var selectTri = document.getElementById('mbTrier');
        var labelTri = selectTri.previousSibling;
        var text = labelTri.innerHTML;
        labelTri.innerHTML = text.replace(' ','<br/>');
        if(labelTri.offsetWidth <= 46) labelTri.className = "fix-width";
        labelTri.innerHTML = text.replace('<br/>',' ');
        labelTri.style.visibility = 'visible';
        selectTri.style.visibility = 'visible';
    }

    // Parcours de la liste des items
    for (var i=0; i<aMbItems.length; i++) {
        oItem = aMbItems[aMbItems[i]];
        // Le modele existe                      
        if (oItem != null) {
            // Etat valide        
            if (oItem.isEnable()) {
                // Recuperation des donnees marketing
                oMarketing = oItem.getMarketing();                   
                if (oMarketing) {
                    oPrice = oItem.getMainPrice();
                    oValue = oPrice.getValue();
                    var oStrikePrice = oItem.getStrikePrice();
                    
                    if(typeBoutique.indexOf('promo') == -1 && typeBoutique.indexOf('sales') == -1 || oStrikePrice) {
                        // Ajout aux listes supports
                        aMbItemsResume.push(new Array(oItem.getId(), oMarketing.getBrand(), oValue.getInteger() + '.' + oValue.getDecimal(), oPrice.getMarkdown()));
                        
                        // Affichage des produits du premier niveau de l arbo si c est une boutique administrable avec une arbo
                        // sinon on affiche tous les produits
                        if (nivs.length < 2 || nivs[0].indexOf(oItem.getId()) != -1) aMbItemsToDisplay.push(oItem.getId());
                    }
                }
            }
        }
    }
    
    iMbNbItemsToDisplay = aMbItemsToDisplay.length;
    _updateDisplayNbOfItems();
    modelsDisplayed = aMbItemsToDisplay.toString();

    if (aMbItemsResume.length == 0 || aMbItemsResume.length < nbMinProductsToDisplayBoutique && typeBoutique.indexOf("mega-") == -1) {
        noProducts();
        return;
    }
    
    // Objet html liste des marques, creation de la liste
    updateListeMarques();

    // Objet html tri
    trierProduits();
}

function updateListeMarques() {
    var modelsToDisplay = aMbItemsToDisplay.toString();
    var marques = '';
    
    // Objet html, init liste des marques
    var oSelectMarques = document.getElementById("listeMarques");
    while (oSelectMarques.hasChildNodes()) oSelectMarques.removeChild(oSelectMarques.firstChild);
    oSelectMarques.options[oSelectMarques.options.length] = new Option(libAllBrands,'');
    
    for (var i = 0;i < aMbItemsResume.length;i++) {
        if(marques.indexOf(aMbItemsResume[i][1]) == -1) {
           if(modelsToDisplay.indexOf(aMbItemsResume[i][0]) != -1) {
               marques += aMbItemsResume[i][1] + ';';
               oSelectMarques.options[oSelectMarques.options.length] = new Option(aMbItemsResume[i][1], aMbItemsResume[i][1]);
           }
        }
    }
    
    // Objet html liste des marque, masquage si moins de 2 marques
    if (oSelectMarques.options.length > 2) showBloc("conteneurFiltreMarques");
}
/*############################################################################################## */
// Gere l affichage des modeles
function _updateDisplayItems() {
    iMaxHeight = 0;

    // Test existance div page courrante
    oDivP = document.getElementById("mb-page-" + iMbPagiCurrentPage);

    // La div correspondante existe, on l affiche directement
    if (oDivP) showBloc("mb-page-" + iMbPagiCurrentPage);
    // La div correspondante n existe pas, creation
    else {
        oBoutique = document.getElementById('middle_boutique');
        oDivP = createElement_div('mb-page-' + iMbPagiCurrentPage, '', '', oBoutique);
        if (oDivP) {

            // Calcul des bornes pour la pagination
            pagiBorneInf = 0;
            pagiBorneSup = iMbNbItemsToDisplay;
            if (iMbPagiCurrentPage > 0) {
                pagiBorneInf = (iMbPagiCurrentPage - 1)  * iMbPagiMaxItemsPerPage;
                if (pagiBorneInf < 1) pagiBorneInf = 0;
                pagiBorneSup = pagiBorneInf + iMbPagiMaxItemsPerPage - 1;
                if (pagiBorneSup > (iMbNbItemsToDisplay - 1)) pagiBorneSup = iMbNbItemsToDisplay - 1;
            }

            var ulLignes = createElement_ul('', 'liste-lignes',oDivP);
            var liLigne = '', ulProduits = '', ulBoutons = '';
            // Ajout des modeles a la div
            for (var i = pagiBorneInf; i < pagiBorneSup + 1; i++) {
            
                oItem = aMbItems["#"+aMbItemsToDisplay[i]+"#"];            
                // Le modele existe                      
                if (oItem != null) {
                    // Recuperation des donnees marketing
                    oMarketing = oItem.getMarketing();                   
                    if (oMarketing) {
                        // Nouvelle ligne tous les 3 produits qu on affecte au div global
                        if (i % nbPdtsPerLine == 0) {
                            liLigne = createElement_li('', 'ligne','',ulLignes);
                            ulProduits = createElement_ul('', '',liLigne);
                            var br = document.createElement('br');
                            br.style.clear = 'both';
                            liLigne.appendChild(br);
                            ulBoutons = createElement_ul('', 'liste-boutons-dispo',liLigne);
                        }
            
                        // BLOC PRODUIT           
                        // On affecte chaque bloc produit a la ligne
                        var liProduit = createElement_li('modele_' + oItem.getId(), '', '', ulProduits);
                        var divBgProduit = createElement_div('', 'bg-produit', '', liProduit);
                        var divProduit = createElement_div('', 'produit', '', divBgProduit);
                        
                        // Photo et vendu unite          
                        var divCol1 = createElement_div('', 'col-1', '', divProduit);
                        // Photo produit
                        if (oMarketing.getPicture()) {
                            var divVisuel = createElement_div('', 'visuel', '', divCol1);     
                            var aVisuel = createElement_a('', '', '', '/'+_language+oMarketing.getSurroundedUrl('/'),divVisuel);
                            var nomImg = oMarketing.getPicture();
                            nomImg = nomImg.replace("my-","mh-");
                            nomImg = nomImg.replace("80/","120/");
                            var imgVisuel = createElement_img('', '', imagesPackShootPath+'/'+nomImg, oMarketing.getLiteral(), '120', '120', aVisuel);
                        }
                        else {
                            var divVisuel = createElement_div('', 'visuel', '', divCol1);
                            var aVisuel = createElement_a('', 'photo_non_dispo', libNoPicture, '#',divVisuel);       
                        }
                        
                        // Marque - libelle - concu pour
                        var divCol2 = createElement_div('', 'col-2', '', divProduit);
                        // Marque            
                        var pMarque = createElement_p('', 'marque', oMarketing.getBrand() , divCol2);    
                        // Libelle           
                        var pLibelle = createElement_p('', 'titre-produit', '', divCol2);            
                        var aLibelle = createElement_a('', '', oMarketing.getLiteral(), '/'+_language+oMarketing.getSurroundedUrl('/'),pLibelle);
                        // Concu pour            
                        var pConcuPour = createElement_p('', 'concu-pour', libConcuPour+oMarketing.getDesignFor(), divCol2);    
                        
                        // Prix et dispo            
                        if (oMarketing.isPassionBrand()) _passion = 'true';
                        else _passion = 'false';
                        // Recuperation des infos prix stock        		    
                        getPriceStockProduct(oItem);
                        var divCol3 = createElement_div('', 'col-3', '', divProduit);
                        if (afficheCartouchePrix == 'Y') {
                            // Prix
                            var divPrix = createElement_div('prixModele_'+oItem.getId(), 'ct-prix','', divCol3);
                            divPrix.innerHTML = displayPriceStockFamille();
                            if (kiloLitre_price != "") var pKiloLitrePrice = createElement_p('prixKgLitre_'+oItem.getId(), 'prixKgLitre', kiloLitre_price, divCol3);
                        }
                        // Dispo
                        var divDispo = createElement_div('', 'bt02', '', divCol3);
                        var pDispo = createElement_p('', '', '', divDispo);
                        var aDispo = createElement_a('', '', lib_stock, '/'+_language+oMarketing.getSurroundedUrl('/'), pDispo);
                        // Pour le mode mosaique
                        var liBouton = createElement_li('', '', '', ulBoutons);
                        var btnDispo = createElement_div('', 'btn-dispo', '', liBouton);
                        btnDispo.appendChild(divDispo.cloneNode(true));
                    }
                    // Reinitialisation de certaines variables
                    reInitPriceVars();
                }
            }
        }
    }
}
/*############################################################################################## */
// Efface tous les items
function _deleteAllDisplayItems() {
    oBoutique = document.getElementById('middle_boutique');
    while (oBoutique.hasChildNodes()) oBoutique.removeChild(oBoutique.firstChild);
}
/*############################################################################################## */
// Gere l affichage du nombre total de modeles
function _updateDisplayNbOfItems() {
    s = iMbNbItemsToDisplay + " ";
    if (iMbNbItemsToDisplay > 1) s +=  libProducts;
    else s +=  libProduct;
    
    oTxt = document.getElementById("mbNbProducts").childNodes;
    oTxt[0].nodeValue = s;
}
/*############################################################################################## */
/* Fonction permettant d'afficher la pagination */
function displayPagination() {

    if (iMbNbItemsToDisplay < 1) return;

    // Format type d un lien vers une page
    var lien = "<a href=\"#\" id=\"pageHaut_$numPage\" onclick=\"jumpToPage($numPage);gaHmap('hmap_shop','pagination_top');return false;\">$numPage</a>";
    var page = parseInt(iMbPagiCurrentPage);
    var ch = "";
    
    // Nombre de pages a afficher
    var nbPages = Math.ceil(iMbNbItemsToDisplay / iMbPagiMaxItemsPerPage);
    
    // Lien precedent
    if(nbPages > 1) {
        ch += "<span class='pagePrecedente' id='pageHaut_precedent'>";
        if(page != 1) {
            var lienPrecedent = lien.substring(lien.indexOf('onclick'),lien.lastIndexOf('$numPage'));
            ch += "<a href='#'" + lienPrecedent.replace(/\$numPage/g,page - 1) + "<</a>";
        }
        else ch += "&nbsp;";
        ch += "</span>";
    }
    
    // 1ere page
    ch += lien.replace(/\$numPage/g,1);
    
    // Nombre de pages avant et apres la page courante
    var nbPagesBefore = page - 2;
    var nbPagesAfter = (nbPages - page) - 1;
    // Nombre de pages max a afficher. on enleve la 1ere page + la page courante + la derniere page
    var nbMax = iNbMaxPages - 3; 
    // Nombre de pages max qui peuvent etre presentes avant et apres la page courante. nbMaxBefore sera plus petit que nbMaxAfter dans le cas d un nombre decimal
    var nbMaxBefore = parseInt(nbMax / 2);
    var nbMaxAfter = nbMax - nbMaxBefore;
    
    // Si il y a plus de pages que le max affichable
    if(nbPages > iNbMaxPages) {
            if(nbPagesBefore > nbMaxBefore) {
                ch += '<span class="points">...</span>';
                // Calcul du nombre pages a afficher avant la page courante
                var nbToDisplayBefore = nbMaxBefore;

                // Si il n y a pas nbMax pages ou plus a afficher apres, on les affiche avant
                if(nbPagesAfter <= nbMax) nbToDisplayBefore = nbMax - nbPagesAfter;
                
                // Calcul de la premiere page a afficher apres les ...
                var indiceDeb = page - nbToDisplayBefore;
                // La premiere page apres les ... est superieure ou egal a 4
                if(indiceDeb < 4) indiceDeb = 4;
                for(var i = 0; indiceDeb + i < page;i++) ch += lien.replace(/\$numPage/g,indiceDeb + i);
                
                // Page courante
                ch += lien.replace(/\$numPage/g,page);

                // Pages a afficher apres
                if(nbPagesAfter <= nbMax) for(var i = page + 1; i <= nbPages;i++) ch += lien.replace(/\$numPage/g,i);
                else {
                    // Calcul du nombre de pages a afficher apres la page courante
                    var nbToDisplayAfter = nbMaxAfter + (nbMaxBefore - (page - indiceDeb));

                    for(var i = 1; i <= nbToDisplayAfter && page + i < nbPages - 2;i++) ch += lien.replace(/\$numPage/g,page + i);
                    ch += '<span class="points">...</span>' + lien.replace(/\$numPage/g,nbPages);
                }
            }
            else {
                 for(var i = 2; i <= page;i++) ch += lien.replace(/\$numPage/g,i);
                 
                 // Calcul du nombre de pages a afficher avant la page courante
                 var nbToDisplay = nbMaxAfter;
                 // Si il n y a pas nbMaxBefore pages ou plus qui ont ete affichees avant, on les affiche apers
                 if(nbPagesBefore < nbMaxBefore) nbToDisplay += nbMaxBefore - nbPagesBefore;
                 for(var i = 1; i <= nbToDisplay && page + i < nbPages - 2;i++) ch += lien.replace(/\$numPage/g,page + i);
                 // Pages a afficher apres
                ch += '<span class="points">...</span>' + lien.replace(/\$numPage/g,nbPages);
            }
    }
    else for(var i = 2;i <= nbPages;i++) ch += lien.replace(/\$numPage/g,i);
    
    // Lien suivant
    if(nbPages > 1) {
        ch += "<span class='pageSuivante' id='pageHaut_suivant'>";
        if(page != nbPages) {
            var lienSuivant = lien.substring(lien.indexOf('onclick'),lien.lastIndexOf('$numPage'));
            ch += "<a href='#'" + lienSuivant.replace(/\$numPage/g,page + 1) + "></a>";
        }
        else ch += "&nbsp;";
        ch += "</span>";
    }
    
    setBlocByHtml("paginationHaut",ch);
    ch = ch.replace(/pageHaut_/g,'pageBas_');
    ch = ch.replace(/pagination_top/g,'pagination_bottom');
    setBlocByHtml("paginationBas",ch);
}
/*############################################################################################## */
// Met en focus / unfocus le numero de page
// _numPage : numero de page concerne
// _display : FOCUS / UNFOCUS
function _updateDisplayPaginationPageNum(_numPage, _display) {
    oA = document.getElementById("pageHaut_" + _numPage);
    oB = document.getElementById("pageBas_" + _numPage);
    if (oA && oB) {
        if (_display == "FOCUS") {
            oA.className = "active";
            oB.className = "active";
        }
        else {
            oA.className = "";
            oB.className = "";
        }
    }
}
/*############################################################################################## */
// Fct interne, pour le tri (affectation des resultats)
function _sortAffectResultToDisplayArray() {
    tmpTabOrdered = aMbItemsToDisplay;
    aMbItemsToDisplay = new Array();

    for (var i=0; i < aMbItemsResume.length; i++) {
        for (var j=0; j < tmpTabOrdered.length; j++) {
            if (aMbItemsResume[i][0] == tmpTabOrdered[j]) aMbItemsToDisplay.push(tmpTabOrdered[j]);
        }
    }
}


/*############################################################################################## */
/*############################################################################################## */
/*####################################### RAYON ################################################ */
/*############################################################################################## */
/*############################################################################################## */

/*############################################################################################## */
// Appelee :
// - si le rayon possede au moins 1 lien interne poitant vers une mini-boutique
// - et switch MINI_BOUTIQUE active pour le site
// - apres le chargement des modeles et le calcul de ceux autorises (apres getAffichageTGRayon) si le rayon possede des TG  (PSI_QMODELS_ARRAY.length>0)
// ou dans la post chargement des switchs (postSwitchAction) si le rayon ne possede pas de TG (PSI_QMODELS_ARRAY.length=0)
// - afin de recuperer la cardinalite (nombre de produits autorises) de la boutique pour le rayon dans le bon contexte (magasin ou centrale) 
function loadCardinaliteBoutiqueConnectOrNot(cookieMagasin) {  
    // cookieMagasin est null si pas de cookie magasin ou switch localStock false
    // Cas magasin               
    if (cookieMagasin !=null) {	
        idMagasin = getEltFromUrl(cookieMagasin, 'idMagasin');	
        loadCardinaliteBoutique( _siteNumber, _centralNumber, idMagasin, _idDepartement, getErepLanguageCode(_language));	
    }
    // Cas centrale
    else {
        loadCardinaliteBoutique( _siteNumber, _centralNumber, null, _idDepartement, getErepLanguageCode(_language));
    }
 }
 /*############################################################################################## */
// Fonction assurant la recuperation de la cardinalite pour la mini boutique du rayon (ajax)
function loadCardinaliteBoutique(_siteNumber, _centralNumber, _storeNumber, _idDepartement, _language) {
     // Creation du contexte
    var oContext = new JoServiceContext(_urlErep, _language, _siteNumber, _centralNumber, _storeNumber);
    // Definition du contexte
    oContext.setFamilies(_idDepartement);     
     // Activation des filtres 
    oContext.activateDataFilter();    
    // Filtre cardinalites
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_CARDINALITY);
    // Filtre exclusion des modeles sans donnees marketing
    oContext.enableDataFilter(SERVICE_CONSTANTS.DATA_FILTER_MRK_AVAILABILITY);
    // Creation du service
    var oService = new JoService(oContext);
    // Execution du service
    oService.execute(POST_LOAD_CARD_BOUTIQUE_FUNCTION);
}
  /*############################################################################################## */
 // Fonction de post chargement de la cardinalite de la mini boutique 
// On y gere l affichage des onglets sur la page rayon
var POST_LOAD_CARD_BOUTIQUE_FUNCTION = function postLoadCardBoutique(httpStatus, _joService) {
    if(httpStatus != null && httpStatus==200) {
    
        // Recuperation des cardinalites du service
        var oCardinalities = _joService.getCardinality();              
        var cardBoutique = 0;
        
        // Nombre de MB ayant un nb de modeles superieur au seuil min
        var nbBoutiqueOk = 0;
        
        if (oCardinalities) {      
            for (var i=0;i<tabTypeBoutique.length;i++) {
            
                if (nbBoutiqueOk < nbMaxOngletsToDisplayBoutique) {
                    // Recuperation des cardinalites pour chaque type de boutique
                    if (tabTypeBoutique[i]=='shop-blue-product') {
                        var oCard  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_MODEL_KIND, SERVICE_CONSTANTS.CARD_MODEL_KIND_BLUE);
                        if (oCard) cardBoutique = oCard.getModelCardinality();
                    }
                    if (tabTypeBoutique[i]=='shop-end-of-collection') {
                        var oCard1  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_STEP, SERVICE_CONSTANTS.STEP_3);
                        if (oCard1) cardBoutique += (oCard1.getModelCardinality())*1;       
                        var oCard2  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_STEP, SERVICE_CONSTANTS.STEP_7);
                        if (oCard2) cardBoutique += (oCard2.getModelCardinality())*1; 
                        var oCard3  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_STEP, SERVICE_CONSTANTS.STEP_8);
                        if (oCard3) cardBoutique += (oCard3.getModelCardinality())*1; 
                    }
                    if (tabTypeBoutique[i]=='shop-promo') {
                        var oCard  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_PRICE_KIND, SERVICE_CONSTANTS.PRICE_PROMO);
                        if (oCard) cardBoutique = oCard.getModelCardinality();                
                    }
                        if (tabTypeBoutique[i]=='shop-sales') {
                        var oCard  = oCardinalities.getCardinality(SERVICE_CONSTANTS.CARD_KIND_PRICE_KIND, SERVICE_CONSTANTS.PRICE_SOLD);
                        if (oCard) cardBoutique = oCard.getModelCardinality();                
                    }
                      
                    // Affichage des onglets boutique si cardinalite > nb de produits definis dans nbMinProductsToDisplayBoutique
                    if (cardBoutique>nbMinProductsToDisplayBoutique) {
                        nbBoutiqueOk  = nbBoutiqueOk + 1;
                        if(nbBoutiqueOk == 1) showBloc("mbMenuRayon");
                        showBloc('ongletBoutique_'+(i+1));
                        showBloc('ongletBoutiqueMenu_'+(i+1));

                        // On reaffecte le lien mb soldes vers boutique soldes
                        if (getSwitchSite('SHOP_SALES') && tabTypeBoutique[i] == "shop-sales") {
                            var sTheUrl = oL.href;
                            var sTheRayonId = sTheUrl.substring(sTheUrl.indexOf("?idRayon="));
                            setHref('zoneBoutiqueLink_sales',shopUrl + sTheRayonId);
                            setHref('menuBoutiqueLink_sales',shopUrl + sTheRayonId);
                        }
                        
                        // Si pas de TG ou aucune TG autorisees : c est l onglet boutique qui est le premier affiche                
                        if ((typeof tabPrdTg == "undefined" || tabPrdTg.length == 0) && nbBoutiqueOk == 1) {
                            var li = document.getElementById('ongletBoutique_' + (i+1));
                            li.style.paddingLeft = "4px";
                            li.firstChild.style.paddingLeft = "21px";
                        }
                    }
                    else // Fix IE6 : si on ne supprime pas le lien a l interieur du li il prend de la place, meme en display:none
                        document.getElementById("ongletBoutique_" + (i+1)).parentNode.removeChild(document.getElementById("ongletBoutique_" + (i+1)));
                    
                    // Reinitialisation pour traitement de la prochaine boutique
                    cardBoutique = 0;
                }
                else // Fix IE6 : si on ne supprime pas le lien a l interieur du li il prend de la place, meme en display:none
                    document.getElementById("ongletBoutique_" + (i+1)).parentNode.removeChild(document.getElementById("ongletBoutique_" + (i+1)));
            }      
        }
    }        
}
