/**
 * Prerequis :
 * La variable modelList est un objet de type ArrayList et doit oblgatoirement etre initialise dans la page HTML
 */
var _displayPrice = true ;
var _displayAssortiment=true;
var nbModelToCheck = 0 ;
var nbModelHidden = 0 ;
var possibleAAfficher = new ArrayList() ;

var isErrorErep = false ;
var disableProductList =  new ArrayList() ;

//liste des modeles valides
var enableModelList = new ArrayList() ; 

//Identifiant du service execute
var serviceId = "" ;

//Map contenant les identifiant de services a partir du service appele
var mapServiceId = new Map() ;

//############ GESTION DES FILTRES/TRIS ############
//Liste des modeles par prix
var priceModelMap = new Map() ;

/**
 * Permet de cacher ou non le bloc produit et d'afficher le picto new
 * @param :
 *    - httpStatus : le statut HTTP apres l'appel ajax
 * @desc :
 *    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_FAMILY_FUNCTION = function postItemFamilyService(httpStatus){
    if(httpStatus == "200"){
        var currentServiceId = mapServiceId.get(_SERVICE_ITEM_FAMILY) ;
        var nbItems = getNbItem(currentServiceId);
        
        if(nbItems == -1){
            isErrorErep = true ;
        }
        checkModels(currentServiceId, _displayPrice) ;
        
        if(typeof _modeleCourant == "string"){
            displayPrevNextProduct(_modeleCourant) ;        
        }
        
        if(typeof nbProduitFamille != "undefined"){
            //generation du bloc pagination
            writePagination(isErrorErep) ;

            //Affichage des criteres
            if(!isErrorErep){
                if(typeof activerFiltre != "undefined" && activerFiltre){
                    displayCriteria() ;
                }
            }
            
            //Affichage des produits
            show("1") ;
        }
    }
    else{
        displayProducts() ;
    }
}

/**
 * Permet de cacher ou non le bloc produit et d'afficher le picto new ou FIN lors du chargement des modeles a partir d'une liste de modele
 * @param :
 *    - httpStatus : le statut HTTP apres l'appel ajax
 * @desc :
 *    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_MODELS_FUNCTION = function postItemModelsService(httpStatus){
    if(httpStatus == "200"){
        var currentServiceId = mapServiceId.get(_SERVICE_ITEM_MODELS) ;
        var nbItems = getNbItem(currentServiceId);
        
        if(nbItems == -1){
            isErrorErep = true ;
        }
        
        checkModels(currentServiceId, _displayPrice) ;

        //Dans le cas des ventes complementaire, doit on cacher ou non le bloc
        hideBlockModels("bloc-decouvrirplus") ;
        if(isVc){
            displayBlocVc()
        }
        checkSwitchProductPages(false, modelList) ;
    }
}

/**
 * Permet de cacher ou non le bloc produit et d'afficher le picto new ou FIN lors du chargement des modeles a partir d'une liste de modele
 * @param :
 *    - httpStatus : le statut HTTP apres l'appel ajax
 * @desc :
 *    - pour chaque item, on va verfier sa visibilite, si elle est a true alors on affiche le produit, sinon on ne l'affiche pas
*/
var POST_LOAD_ITEM_MODEL_FUNCTION = function postItemModelService(httpStatus){
    if(httpStatus == "200"){
        var currentServiceId = mapServiceId.get(_SERVICE_ITEM_MODEL) ;
        var nbItems = getNbItem(currentServiceId);
        if(nbItems == -1){
            isErrorErep = true ;
        }
        
        checkModel(serviceId, idModel, _displayPrice, isFromModel) ;

        modelList = new ArrayList() ;
        modelList.add(idModel) ;
        
        if(typeof isAffichePictoGamme != "undefined" && isAffichePictoGamme == "1"){
            setPictoGamme(_urlFamille+"/index.shtml", idModel) ;
        }
    
        checkSwitchProductPages(true, modelList) ;
    }
}

/**
 * Permet de verifier les switchs apres la recuperation des prix
*/
function checkSwitchProductPages(isModelPage, modelList){
    //appel des interrupteurs
    var _switchArrayAChecker = new Array() ;
    _switchArrayAChecker[0] = SWITCH_ACTIVATION_PRIX ;
    _switchArrayAChecker[1] = SWITCH_ACTIVATION_DEEE ;
    _switchArrayAChecker[2] = SWITCH_ACTIVATION_MDR ;        
    _switchArrayAChecker[3] = SWITCH_ACTIVATION_MDR_SAISIE_PREDICTIVE
    
    if(isModelPage){
        _switchArrayAChecker[4] = SWITCH_ACTIVATION_OXYLANE_AVIS ;
        _switchArrayAChecker[5] = SWITCH_ACTIVATION_DOC_ASSOCIES ;
        _switchArrayAChecker[6] = SWITCH_ACTIVATION_LIAGE_DKT ;
    }
    
    checkSwitches(_switchArrayAChecker, _client, _siteNumber, modelList) ;
}

/**
 * Permet de cacher ou non le bloc produit et d'afficher le picto new
 * @param :
 *    - _serviceId : l'identifiant du service en court
 *    - _isDisplayPrice : true/false doit on gerer l'affichage des prix
*/
function checkModels(_serviceId, _isDisplayPrice){
    
    if(modelList && modelList.length() > 0){
        //Nb de modele a verifier
        nbModelToCheck = modelList.length() ;
        
        //Pour chaque modele de la liste global, on va recuperer l'objet Item
        for(var ii=0 ; ii<modelList.length() ; ii++){
            var modelId = modelList.get(ii) ; //identifiant du modele a verifier    
            
            checkModel(_serviceId, modelId, _isDisplayPrice, false) ;
         }
        
        //pour tous les produits a desactiver, on va les cacher
        for(var i=0; i<disableProductList.length(); i++){
            var productToHideObj = disableProductList.get(i) ;
            hideBloc(productToHideObj) ;
        }
        
        //check des switchs
        checkSwitchProductPages(false, modelList) ;
        
        //on va cacher le message d'attente
        hideWaitingMessage();
                
    }
}

/**
 * Permet de cacher ou non le bloc produit et d'afficher le picto new
 * @param :
 *    - isDisplayPrice : true/false doit on gerer l'affichage des prix
*/
function checkModel(serviceId, idModel, isDisplayPrice, isFromModel){
   
    if(idModel){        
        var forceDisplayBlock = false ;
        var item = getMyItem(serviceId, idModel) ; //on recupere l'objet Item associe
        //on recupere les blocs HTML a afficher ou a cacher
        //5 types :
        //    - vignetteproduit : utilise dans les pages familles
        //    - ligneproduit : utilise dans les pages GDBC
        //    - compare : utilise dans les pages comparateurs
        //    - maSelection : utilise dans la page "Mes produits favoris"
        //    - bloc-vente : utilise dans la page produit
       
        var blocItemObj = getElement("vignetteproduit-"+idModel, true, "") ;
        forceDisplayBlock = true ;
        if(blocItemObj == null){
            blocItemObj = getElement("ligneproduit-"+idModel, true, "") ;
            forceDisplayBlock = true ;
            if(blocItemObj == null){
                blocItemObj = getElement("compare-"+idModel, true, "") ;
                forceDisplayBlock = true ;
                if(blocItemObj == null){
                    blocItemObj = getElement("maSelection"+idModel, true, "") ;
                    forceDisplayBlock = true ;
                    if(blocItemObj == null){
                        blocItemObj = getElement("bloc-prix"+idModel, true, "") ;
                        forceDisplayBlock = false ;
                        if(blocItemObj == null){
                            blocItemObj = getElement("decouvrirplus"+idModel, true, "") ;
                            forceDisplayBlock = false ;
                        }
                    }
                }
            }
        }
        
        //Si la reponse erep est fausse, on va quand meme afficher les produits
        if(isErrorErep){
            if (isFromModel) {
                //redirectProduit(idModel, _urlFamille) //_urlFamille doit etre declare dans l'html
                hideBlocId("ouAcheter") ;
            }
            if(!forceDisplayBlock){
                nbModelHidden++ ;
                //hideBloc(blocItemObj) ; //Par defaut, le bloc est cache
                disableProductList.add(blocItemObj) ;
            }
            else{
                displayBloc(blocItemObj) ; //Par defaut, le bloc est affiche
            }
        }
        //Item existe donc on va recuperer les prix
        else if(item != null){
           
            //Traitement que si le bloc HTML existe
            if(blocItemObj){                   
                var isEnable = item.isEnable() ; //l'item est-il valable, faut il l'afficher
                var step = item.getStep() ; //recuperation de son etat : 1/2 ou 3                    
                if(step == "-1" || !item.isStepHomogeneous()){ //Si les tapes du modle ne sont pas homogne, on va forcer l'tape du produit  1
                    step = "1"  ; 
                }
                //Si l'item n'est pas valable, alors on cache le bloc HTML correspondant
                if(!isEnable){
                    if(!isFromModel){
                        //hideBloc(blocItemObj) ;
                        disableProductList.add(blocItemObj) ;
                        nbModelHidden++ ;
                    }
                    else{
                        redirectProduit(idModel, _urlFamille) //_urlFamille doit etre declare dans l'html
                    }
                }
                //sinon on l'affiche apres avoir verifie son etape de vie pour afficher les pictos NEW ou FIN
                else{ 
                    //le modele est coherent et peut donc etre affiche, on l'ajoute a la liste
                    enableModelList.add(idModel);
                                        
                    if(step == "2"){ //etape de vie 2, picto NEW a afficher
                        //Cas d'une fiche produit
                        var enteteProduit = getElement("entete-produit", true, "") ;
                        var pictoNew = getElement("pictoNew", true, "") ;
                        if(pictoNew){
                            displayBloc(pictoNew) ;
                            var messageNew = getElement("message-new", true, "") ;
                            displayBloc(messageNew) ;
                            
                            hideBlocId("titrePrix") ;
                            displayBlocId("ouAcheter") ;
                            displayBlocId("bloc-prix"+idModel) ;                            
                        }
                        else if(enteteProduit){
                            enteteProduit.className = "new" ;
                            
                            var messageNew = getElement("message-new", true, "") ;
                            displayBloc(messageNew) ;
                            
                            displayBlocId("ouAcheter") ;
                            displayBlocId("bloc-prix"+idModel) ;
                            
                            //on va egalement modifier la classe picto gamme pour le bouton new
                            //L'affichage de ce picto se fait dans la css page-produit.css
                            var pictoGammeObj = getElement("picto-prix-new") ;
                            if(pictoGammeObj){
                                pictoGammeObj.className = "picto-prix new" ;
                                displayBloc(pictoGammeObj) ;
                            }
                        }
                        else if(getElement("picto-new-"+idModel, true, "")){//cas comparer produit
                            displayBloc(getElement("picto-new-"+idModel, true, "")) ;
                            var blocCompareItemObj = getElement("col-"+idModel, true, "") ;
                            if(blocCompareItemObj){
                                blocCompareItemObj.className = "col1new" ;
                            }
                        }
                        else{//autre cas
                            blocItemObj.className = "new" ;
                        }
                    }
                    else if(step == "3"){ //etape de vie 3, picto FIN a afficher
                        var enteteProduit = getElement("entete-produit", true, "") ;
                        var pictoFin = getElement("pictoFin", true, "") ;
                        if(pictoFin){
                            displayBloc(pictoFin) ;
                            
                            displayBlocId("ouAcheter") ;
                            displayBlocId("bloc-prix"+idModel) ;
                        }
                        else if(enteteProduit){
                            enteteProduit.className = "fin" ;
                            
                            //on va egalement modifier la classe picto gamme pour le bouton fin
                            //L'affichage de ce picto se fait dans la css page-produit.css
                            var pictoGammeObj = getElement("picto-prix-fin") ;
                            if(pictoGammeObj){
                                pictoGammeObj.className = "picto-prix fin" ;
                                displayBloc(pictoGammeObj) ;
                            }                            
                        }                 
                    }

                    //on va afficher les prix Decathlon si le modele est en etape de vie different de 2 et que le booleen isDisplayPrice est a true                    
                    if(step != "2"){
                        var messageNew = getElement("message-new", true, "") ;
                        if(messageNew){
                            hideBloc(messageNew) ;
                        }
                        var displayBlocItem = true ;
                        
                        if(isDisplayPrice && item.getMainPrice() != null){
                            //Rcuperation de l'objet Prices qui contient tous les types de prix
                            var oPrice = item.getPrices() ;
                            var oCurrency = oPrice.getCurrency() ; //objet Currency qui va permettre de formater correctement le prix
                            
                            if(oCurrency){                                
                                var oMainPrice = item.getMainPrice() ; //Prix principal = prix central
                                var valuePrice = oCurrency.formatValue(oMainPrice.getValue()) ; //on formatte le prix central
                                var isHomogenous = oMainPrice.isPriceHomogeneous() ;
                                var oWeeePrice = item.getWeeePrice() ; //Prix deee 
                                if(oWeeePrice!=null){
                                    var valuePriceWeee = oCurrency.formatValue(oWeeePrice.getValue()) ; //on formatte le prix central
                                }else{
                                     var valuePriceWeee="";
                                }
                                 
                                if(valuePrice != ""){
                                    //Prix au kg
                                    var prixKg = getPriceByKg(oMainPrice,oCurrency) ;
                                   
                                    if(prixKg != ""){       
                                        var blocPxKgHtml = getElement("infoplus-valeur-prxKg", true, "") ;
                                        if(blocPxKgHtml){
                                            blocPxKgHtml.innerHTML = prixKg ;
                                        }
                                    }
                                    else{
                                        var blocPxKgHtml = getElement("prixKgCell", true, "") ;
                                        if(blocPxKgHtml){
                                            hideBloc(blocPxKgHtml) ;
                                        }
                                        var blocPxKgJurHtml = getElement("prixKgJur", true, "") ;
                                        if(blocPxKgJurHtml){                                
                                            hideBloc(blocPxKgJurHtml) ;
                                        }
                                        var blocPoidsHtml = getElement("poidsCell", true, "") ;
                                        if(blocPoidsHtml){
                                            hideBloc(blocPoidsHtml) ;
                                        }
                                    }

                                    //############ GESTION DES FILTRES/TRIS ############
                                    if(typeof activerTri != "undefined" && activerTri){
                                        if(!isFromModel){
                                            var valueObj = oMainPrice.getValue() ;
                                            
                                            rangeModelByPrice(valueObj, valuePrice, step, idModel) ;
                                        }
                                    }
                                    
                                    var fonctionGoToProduct = getLinkToDecathFunction(_rootPath, _serverUrl, _urlLiage, idModel, _siteRepositoryEnseigne) ;
                                    setPrixDecathlon(idModel, valuePrice,valuePriceWeee, isHomogenous, _language, fonctionGoToProduct) ;
                                    
                                    //on va afficher le bloc prix
                                    var blocPrixObj = getElement("bloc-prix"+idModel, true, "") ;
                                    
                                    if(blocPrixObj){
                                        displayBloc(blocPrixObj) ;
                                    }
                                }
                                else{
                                    displayBlocItem = false ;
                                }
                            }
                            else{
                                displayBlocItem = false ;
                            }
                        }
                        //on va afficher le bloc produit
                        if(displayBlocItem){
                            if(blocItemObj.id!="decouvrirplus"+idModel && blocItemObj.id != "vignetteproduit-"+idModel){
                                displayBloc(blocItemObj) ;
                            }else{
                                possibleAAfficher.add(blocItemObj.id);
                            }
                        }
                    }
                    else{
                        if(blocItemObj.id=="decouvrirplus"+idModel){
                             possibleAAfficher.add(blocItemObj.id);
                        }
                        
                        //on va ranger les produit nouveaute dans la liste des tris
                        if(typeof activerTri != "undefined" && activerTri){
                            rangeModelByPrice("", "", step, idModel) ;
                        }
                        
                        //si le client vient d'un autre pays, on va cacher le bloc prix pour les produits en tape de vie 2
                        var valueCookieCountry = getCookie("country") ;
                        var isFromOtherCounrty = false ;
                        if(valueCookieCountry){
                            if(valueCookieCountry != "FR" && valueCookieCountry != "EN" && valueCookieCountry != "ES" && valueCookieCountry != "IT"){
                                isFromOtherCounrty = true ;
                            }
                        }
                        if(isFromOtherCounrty){
                            var divOuAcheterElement = getElement("ouAcheter", true, "") ;
                            if(divOuAcheterElement){
                                hideBloc(divOuAcheterElement) ;
                            }
                        }
                    }
                }
            }
        }
        else{//dans le cas ou l'item est null, on va cacher le bloc produit            
            nbModelHidden++ ;
            //hideBloc(blocItemObj) ; //Par defaut, le bloc est cache
            disableProductList.add(blocItemObj) ; //Au lieu de le cacher directement, on va mettre le bloc a cacher dans une liste qu'on parcourera plus tard pour cacher les bons blocs => pas de risque de desynchro
        }
    }
}


/**
 * Permet de classer les produits par prix
*/
function rangeModelByPrice(_valueObj, _valuePrice, _step, _idModel){
    var listeModelByPrice = "" ;
    var valuePrice = "" ;
    
    //On va mettre a jour l'objet ItemSite
    if(typeof modelObjByIdMap != "undefined"){
        var itemSite = modelObjByIdMap.get(_idModel) ;
        
        //Traitement step != 2
        if(_valuePrice != ""){
            if(itemSite){
                itemSite.setPrixMag(_valuePrice) ;         
            }
            
            //Cast du prix en float : va permettre de trier plus facilement
            valuePrice = parseFloat(_valueObj.integer+"."+_valueObj.decimal) ; //Remplacement du , par .
        }
        else{ //Traitement step == 2
            if(_step == "2"){
                itemSite.setIsNew(true) ;
            }
            valuePrice = "NEW" ;
        }
        
        //Initialisation de la liste des modeles par prix
        var index = -1 ;
        
        //Est ce qu'il a deja ete cree
        if(priceModelMap.get(valuePrice)){
            listeModelByPrice = priceModelMap.get(valuePrice) ;
            index = priceModelMap.remove(valuePrice) ;
        }
        else{ //Sinon on le cree
            listeModelByPrice = new ArrayList() ;
        }
        
        //On rajoute le modele pour cette valeur de prix
        listeModelByPrice.add(_idModel) ;
        
        //On insert cette liste de modele pour cette valeur de prix dans la map
        if(index == -1){
            priceModelMap.put(valuePrice, listeModelByPrice) ;
        }
        else{
            priceModelMap.putIn(index, valuePrice, listeModelByPrice) ;
        }
    }
}


/**
 * Permet de charger tous les items de la famille
 * @param :
 *    - _client : ITOOL
 *    - _familyId : l'identifiant de la famille masterdata
 *    - _idSite : l'identifiant du site
 *    - _idCentral : identifiant de la centrale
 *    - _displayPrice : recuperation ou non des prix
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function getFamily(_client, _familyId, _idSite, _idCentral, _displayPrice,_isDisplayAssortiment){
    //on va verifier si le client ne vient pas d'un autre pays
    var idCentral = _idCentral ;
    var valueCookieCountry = getCookie("country") ;
    if(valueCookieCountry){
        var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry) ;
        if(enseigneSiteObj){
            idCentral = enseigneSiteObj.getCentrale() ;
        }
    }
    
    if(idCentral != "-1"){
        loadFamily(_client, _familyId, _idSite, _displayPrice,_isDisplayAssortiment, idCentral, POST_LOAD_ITEM_FAMILY_FUNCTION) ;
    }
    else{
        displayProducts() ;
    }
}

/**
 * Permet de charger tous les items a partir d'une liste de modeles
 * @param :
 *    - _client : ITOOL
 *    - _familyId : l'identifiant de la famille masterdata
 *    - _idSite : l'identifiant du site
 *    - _idCentral : identifiant de la centrale
 *    - _displayPrice : recuperation ou non des prix
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function getModels(_client, _idSite, _idCentral,_isDisplayPrice,_isDisplayAssortiment){
    //on va verifier si le client ne vient pas d'un autre pays
    var idCentral = _idCentral ;
    var valueCookieCountry = getCookie("country") ;
    if(valueCookieCountry){
        var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry) ;
        if(enseigneSiteObj){
            idCentral = enseigneSiteObj.getCentrale() ;
        }
    }
    
    if(idCentral != "-1"){
        loadModels(_client, _idSite, idCentral, POST_LOAD_ITEM_MODELS_FUNCTION,_isDisplayPrice,_isDisplayAssortiment) ;
    }
    else{
        hideWaitingMessage() ;
    }    
}

/**
 * Permet de charger tous les items a partir d'une liste de modeles
 * @param :
 *    - _client : ITOOL
 *    - _idModel : l'identifiant du modele (reference modele)
 *    - _idSite : l'identifiant du site
 *    - _idCentral : identifiant de la centrale
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge l'item correspondant au modele
*/
function getModel(_client, _idSite, _idCentral, _idModel, _isDisplayPrice,_isDisplayAssortiment, _isFromModel){
    //on va verifier si ce produit est deja dans la liste des favoris ou non
    verifMaSelection(_idModel) ;
    
    //on va verifier si le client ne vient pas d'un autre pays
    var idCentral = _idCentral ;
    var language = _language ;    
    var valueCookieCountry = getCookie("country") ;
    if(valueCookieCountry){
        var enseigneSiteObj = mapUrlParPays.get(valueCookieCountry) ;
        if(enseigneSiteObj){
            idCentral = enseigneSiteObj.getCentrale() ;
        }
    }
    
    if(idCentral != "-1"){    
        loadModel(_client, _idSite, idCentral, _idModel, language, _isDisplayPrice,_isDisplayAssortiment, _isFromModel, POST_LOAD_ITEM_MODEL_FUNCTION) ;
    }
    else{
        //on va cacher le bloc ou acheter et les blocs oxylane
        var divOuAcheterElement = getElement("ouAcheter", true, "") ;
        if(divOuAcheterElement){
            hideBloc(divOuAcheterElement) ;
        }
    
        var divOxyClubElement = getElement("oxylaneClub", true, "") ;
        if(divOxyClubElement){
            hideBloc(divOxyClubElement) ;
        }
    }
}

/**
 * Permet de charger tous les items d'une famille et de lancer le traitement post appel Ajax
 * @param :
 *    - _client : ITOOL
 *    - _familyId : l'identifiant de la famille a recuperer
 *    - _subNumber1 : l'identifiant du site
 *    - _bPriceData : recuperation ou non des prix
 *    - _number2 : l'id de la centrale
 *    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function loadFamily(_client, _familyId, _idSite, _bPriceData, displayAssortiment, _idCentral, _localfunc){
    //doit on afficher les informations prix
    _displayPrice = _bPriceData ;
    _displayAssortiment = displayAssortiment;
    
    //recupere le serveur eRep
    _urlErep = getUrlErep(_SERVICE_ITEM_FAMILY, _client, THIRD_KIND_SITE, _idSite, _familyId, _localfunc, _displayPrice, _displayAssortiment) ;
    
    if(_urlErep){
        //initialise le service 
        serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_FAMILLE, _familyId, _localfunc, _displayPrice, _displayAssortiment) ;
        
        mapServiceId.put(_SERVICE_ITEM_FAMILY, serviceId) ;
    }
}

/**
 * Permet de charger tous les items a partir d'une liste de modeles et de lancer le traitement post appel Ajax
 * @param :
 *    - _client : ITOOL
 *    - _familyId : l'identifiant de la famille a recuperer
 *    - _subNumber1 : l'identifiant du site
 *    - _bPriceData : recuperation ou non des prix
 *    - _number2 : ""
 *    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge tous les items de la liste de modeles
*/
function loadModels(_client, _idSite, _idCentral, _localfunc,isDisplayPrice,displayAssortiment){
    //recupere le serveur eRep
    _displayPrice = isDisplayPrice ;
    _displayAssortiment = displayAssortiment;
      _urlErep = getUrlErep(_SERVICE_ITEM_MODELS, _client, THIRD_KIND_SITE, _idSite, "", _localfunc, _displayPrice, _displayAssortiment) ;

    if(_urlErep){        
        if(modelList && modelList.length() > 0){
            //initialise le service
             serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_MODELES, modelList, _localfunc, _displayPrice, _displayAssortiment) ;
             
             mapServiceId.put(_SERVICE_ITEM_MODELS, serviceId) ;
        }
        else{
            //Dans le cas des ventes complementaire, on va cacher le bloc si aucun produit n'est dans la VC
            hideBlockModels("bloc-decouvrirplus") ;
        }
    }
}

/**
 * Permet de charger tous les items d'une famille et de lancer le traitement post appel Ajax
 * @param :
 *    - _client : ITOOL
 *    - _idSite : l'identifiant du site
 *    - _idCentral : l'identifiant de la centrale
 *    - _idModel : identifiant du modele
 *    - _language : FR|EN|ES|IT ...
 *    - _localfunc : la fontion post ajax a appeler : par ex, POST_LOAD_SWITCH_VENTE_FUNCTION
 * @desc :
 *    - recupere le serveur erep, initialise ce serveur et charge tous les items de la famille
*/
function loadModel(_client, _idSite, _idCentral, _idModel, _language, _isDisplayPrice, _isDisplayAssortiment, _isFromModel, _localfunc){
    //doit on afficher les informations prix
    _displayPrice = _isDisplayPrice ;
    _displayAssortiment=_isDisplayAssortiment;
    isFromModel =_isFromModel ;
    
    //recupere le serveur eRep      
    _urlErep = getUrlErep(_SERVICE_ITEM_MODEL, _client, THIRD_KIND_SITE, _idSite, _idModel, _localfunc, _displayPrice, _displayAssortiment) ;
    idModel = _idModel ;

    if(_urlErep){
        //Initialisation et execution du service
        serviceId = initExecuteService(_urlErep, _language, _idSite, _idCentral, CONTEXT_MODE_MODELE, _idModel, _localfunc, _displayPrice, _displayAssortiment) ;  
        
        mapServiceId.put(_SERVICE_ITEM_MODEL, serviceId) ;
   }
}


/**
 * Permet de cacher le bloc de vente complementaire si tous les produits de la vente sont desactives
 * @param :
 *    - idBlockToHide : bloc VC a cacher
*/
function hideBlockModels(idBlockToHide){
    var blockToHide = getElement(idBlockToHide, true, "") ;
    if(!blockToHide){
        if(parent){
            blockToHide = parent.document.getElementById(idBlockToHide) ;
        }
    }
    
    if(blockToHide){
        //Si le nb de bloc cache est egal au nb de modele a afficher dans la VC, alors on va cacher ce bloc
        if(nbModelToCheck == nbModelHidden){
            hideBloc(blockToHide) ;
        }
    }
    completeAffiche();
}


/*verifie si les VC selectionner alatoirement sont affichable et en selectionne d'autre si elles ne font pas partie des produit affichable*/
function completeAffiche(){
    var pdtAffiche=document.getElementsByTagName("LI");
    var nbVC=pdtAffiche.length;
    if(nbVC>6 && possibleAAfficher.length()>=6){
        var afficher=selectionAleatoire(nbVC);
        for(var i=0;i<afficher.length;i++){
            if(pdtAffiche[afficher[i]].style.display=="none"){
                 if(possibleAAfficher.contains(pdtAffiche[afficher[i]].id)){
                     pdtAffiche[afficher[i]].style.display="block";
                     verif=true;
                 }
                else{
                    verif=false;
                }
                while(!verif){
                    indice=  Math.ceil(Math.random()*nbVC) -1; 
                    var j=0;
                    verif=true;
                    while(j<6 && verif){
                        verif=(afficher[j]!=indice);
                        j++;
                    }
                    if(verif){
                         if(possibleAAfficher.contains(pdtAffiche[indice].id)){
                             pdtAffiche[indice].style.display="block";
                             afficher[i]=indice;
                         }
                         else{
                             verif=false;
                         }
                    }
                }
            }
        }       
    }
    else{
        for (var i=0;i<possibleAAfficher.length();i++){
            document.getElementById(possibleAAfficher.get(i)).style.display="block";
        }
    }
}


/*selectionne 4 positions alatoirement parmit toutes les VC disponible
    -nbPdt : nombre de produit disponible
*/
function selectionAleatoire(nbPdt){
    if(nbPdt>6){
         var dejaAfficher=[-1,-1,-1,-1,-1,-1];
         for(var l=0; l < 6;l++){
             var verifier=false;
             var indice=  Math.ceil(Math.random()*nbPdt) -1;
             while(!verifier){
                 var j=0;
                 verifier=true;
                 while(j<l && verifier){
                     verifier=(dejaAfficher[j]!=indice);
                     j++;
                 }
                 if(!verifier)indice=  Math.ceil(Math.random()*nbPdt) -1; 
             }
             dejaAfficher[l]=indice;
        }
        
    }else{
         var dejaAfficher=[0,1,2,3,4,5];
    }   
    return dejaAfficher;
}

/*verif si une VC fait partie des VC selectionner aleatoirement
    tab : tableau des position selectionne
    pos : position a tester
*/
function verifAffichage(tab,pos){
    var estAAfficher=false;
    var i=0;
    while(!estAAfficher && i<tab.length){
        estAAfficher=(tab[i]==pos);
        i++;
    }
    return estAAfficher;
}


/**
 * Permet de recupErer le poids d'un modele et son unite 
*/
function getPriceByKg(_mainPrice, _currencyObject){
    var poidsModeleObj = getElement("poids_modele", true, "") ;
    var uniteModeleObj = getElement("unite_modele", true, "") ;
   
    var valeurPoidsModele = "" ;
    var unitePoidsModele = "" ;
    if(poidsModeleObj && uniteModeleObj){
        valeurPoidsModele = poidsModeleObj.innerHTML ;
        unitePoidsModele = uniteModeleObj.innerHTML ;        
    }
    
    if((unitePoidsModele == "Kg" || unitePoidsModele == "L") && valeurPoidsModele > 0 ){
        var priceValue = _mainPrice.getValue();
        
        var priceByKg = parseFloat(priceValue.getInteger()+"."+priceValue.getDecimal())/valeurPoidsModele ;
        
        priceByKg=Math.round(priceByKg*100)/100;
        
        // convertion en string pour separer la partie entiere et decimale et construire l objet value                
        // convertion en string pour separer la partie entiere et decimale et construire l objet value                
        priceByKg = priceByKg.toString();
        
        var priceByKg_value = null ; //Objet Value
        if (priceByKg.indexOf('.')!=-1) {
            var priceByKg_value = new JoValue() ;
            priceByKg_value.setInteger(priceByKg.substring(0,priceByKg.indexOf('.'))) ;
            priceByKg_value.setDecimal(priceByKg.substring(priceByKg.indexOf('.')+1)) ;
        }
        else {
            var priceByKg_value = new JoValue();
            priceByKg_value.setInteger(priceByKg) ;
            priceByKg_value.setDecimal(0) ;
        }
        // construction de l objet currency pour utiliser la methode de formatage du prix

        var oCurrency = new JoCurrency();
        oCurrency.setId(_currencyObject.getId());
        oCurrency.setBehind(_currencyObject.isBehind());
        oCurrency.setSymbol(_currencyObject.getSymbol());
        oCurrency.setDecimalNumber(_currencyObject.getDecimalNumber());
        oCurrency.setDecimalDelimiter(_currencyObject.getDecimalDelimiter());
        oCurrency.setThousandDelimiter(_currencyObject.getThousandDelimiter());
        
        if(oCurrency){
            return oCurrency.formatValue(priceByKg_value) +' / ' +unitePoidsModele;
        }
        else{
            return "" ;
        }
    }
    else{
        return "" ;
    }
}

/** #########################################
 * Permet d'afficher le message d'erreur de non dispo d'un produit
*/
function checkPageStatus(){
    // Doit on afficher le message de non dispo du produit
    var paramsUrl = getParameters() ;
    if (paramsUrl.length > 0 && paramsUrl[0] != "") {
        if((paramsUrl[0][0]).indexOf("?nondispo") > -1){
            if(paramsUrl[0][1] == "true"){
                displayBlocId("advertDispo") ;
            }
        }
    }
}