/**
 * Prerequis :
 * La variable modelList est un objet de type ArrayList et doit oblgatoirement etre initialise dans la page HTML
 */
 
var _displayPrice = true ;
var nbModelToCheck = 0 ;
var nbModelHidden = 0 ;
var possibleAAfficher = new ArrayList() ;

var isErrorErep = false ;
var disableProductList =  new ArrayList() ;

/**
 * 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"){
        if(ITEM_ARRAY == null || ITEM_ARRAY.length == 0){
            isErrorErep = true ;
        }
        checkModels(_displayPrice) ;
        
        checkSwitchProductPages(false) ;        
    }
    else{
        hideWaitingMessage();
    }
}

/**
 * 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"){
        if(ITEM_ARRAY == null || ITEM_ARRAY.length == 0){
            isErrorErep = true ;
        }    
        checkModels(_displayPrice) ;

        //Dans le cas des ventes complementaire, doit on cacher ou non le bloc
        hideBlockModels("bloc-decouvrirplus") ;

        checkSwitchProductPages(false) ;        
    }
}

/**
 * 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"){
        checkModel(idModel, _displayPrice, isFromModel) ;        
        
        modelList = new ArrayList() ;
        modelList.add(idModel) ;
        
        checkSwitchProductPages(true) ;
    }
}

/**
 * Permet de verifier les switchs apres la recuperation des prix
*/
function checkSwitchProductPages(isModelPage){
        //appel des interrupteurs
        var _switchArrayAChecker = new Array() ;
        _switchArrayAChecker[0] = SWITCH_ACTIVATION_PRIX ;
        _switchArrayAChecker[1] = SWITCH_ACTIVATION_DEEE ;
        _switchArrayAChecker[2] = SWITCH_ACTIVATION_KOODZA ;        
        _switchArrayAChecker[3] = SWITCH_ACTIVATION_DEEE_KOODZA ;
        _switchArrayAChecker[4] = SWITCH_ACTIVATION_MDR ;        
        _switchArrayAChecker[5] = SWITCH_ACTIVATION_MDR_RECHERCHE_PREDICTIVE
        if(isModelPage){
            _switchArrayAChecker[6] = SWITCH_ACTIVATION_OXYLANE_PROFIL ;
            _switchArrayAChecker[7] = SWITCH_ACTIVATION_OXYLANE_AVIS ;
            _switchArrayAChecker[8] = SWITCH_ACTIVATION_OXYLANE_PLUS_ONGLET ;
        }
        else{
            _switchArrayAChecker[6] = SWITCH_ACTIVATION_OXYLANE_PLUS_BT ;
        }
        
        checkSwitches(_switchArrayAChecker, _client, THIRD_KIND_SITE, _siteNumber, _siteNumber, "", "", "", modelList) ;
}

/**
 * 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 checkModels(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(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) ;
        }
        
        //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(idModel, isDisplayPrice, isFromModel){
    if(idModel){        
        var forceDisplayBlock = false ;
        var item = getItem(idModel, ITEM_MODEL) ; //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-vente", 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(!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.step ; //recuperation de son etat : 1/2 ou 3                    
                if(step == "-1" || !item.isStepHomogeneous()){ //Si les étapes du modèle ne sont pas homogène, 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{
                    if(step == "2"){ //etape de vie 2, picto NEW a afficher
                        var pictoNewItemObj = getElement("picto-new-"+idModel, true, "") ;
                        if(pictoNewItemObj){
                            displayBloc(pictoNewItemObj) ;
                        }
                    }
                    else if(step == "3"){ //etape de vie 3, picto FIN a afficher
                        var pictoFinItemObj = getElement("picto-fin-"+idModel, true, "") ;
                        if(pictoFinItemObj){
                            displayBloc(pictoFinItemObj) ;
                        }
                    }
                    //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 displayBlocItem = true ;
                        
                        if(isDisplayPrice && item.getMainPrice() != null){
                            var currencyPriceItem = item.getMainPrice().getPriceCurrency() ;
                            if(currencyPriceItem != null){
                                var fonctionGoToProduct = getLinkToDecathFunction(_rootPath, _serverUrl, _urlLiage, idModel, _siteRepositoryEnseigne) ;

                                /* -- HACK IE6, le prix koodza n'est plus affiche
                                var urlKoodzaFile = urlXMLKoodza + idModel + ".xml" ;
                                var koodza = new KoodzaInfoBean(urlKoodzaFile, idModel, true, true) ;
                                */
                                
                                var prixKg = getPriceByKg(item.getMainPrice(), currencyPriceItem) ;
                                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) ;
                                    }                                    
                                }
                                
                                setPrixDecathlon(idModel, item, _language, fonctionGoToProduct) ;
                                
                                //on va afficher le bloc prix
                                var blocPrixObj = getElement("blocPrix"+idModel, true, "") ;
                                if(blocPrixObj){
                                    displayBloc(blocPrixObj) ;
                                }
                            }
                            else{
                                displayBlocItem = false ;
                            }
                        }
                        //on va afficher le bloc produit
                        if(displayBlocItem){
                            if(blocItemObj.id!="decouvrirplus"+idModel){
                                displayBloc(blocItemObj) ;
                            }else{
                                possibleAAfficher.add(blocItemObj.id);
                            }
                        }
                    }else{
                        if(blocItemObj.id=="decouvrirplus"+idModel){
                             possibleAAfficher.add(blocItemObj.id);
                        }
                    }
                }
            }
        }
        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 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){
    loadFamily(_client, _familyId, _idSite, _displayPrice, _idCentral, POST_LOAD_ITEM_FAMILY_FUNCTION) ;
}

/**
 * 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){
    loadModels(_client, _idSite, _idCentral, POST_LOAD_ITEM_MODELS_FUNCTION) ;
}

/**
 * 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, _isFromModel){
    //on va verifier si ce produit est deja dans la liste des favoris ou non
    verifMaSelection(_idModel) ;    
    
    loadModel(_client, _idSite, _idCentral, _idModel, _language, _isDisplayPrice, _isFromModel, POST_LOAD_ITEM_MODEL_FUNCTION) ;
}

/**
 * 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 : ""
 *    - _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, _subNumber1, _bPriceData, _number2, _localfunc){
    //doit on afficher les informations prix
    _displayPrice = _bPriceData ;
    
    //recupere le serveur eRep
    _urlErep = getUrlErep(_SERVICE_ITEM_FAMILY, _client, "", _familyId,  _subNumber1, _bPriceData,  _number2, "", _localfunc) ;
    
    if(_urlErep){
        //initialise le service
        _initItemService(_urlErep) ;

        //charge la famille
        _loadFamily( _client, _subNumber1, _number2, null, _familyId, _bPriceData, _localfunc) ;
   }
}

/**
 * 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){
    //recupere le serveur eRep
    _urlErep = getUrlErep(_SERVICE_ITEM_MODELS, _client, "", _idSite,  "", "",  _idCentral, "", _localfunc) ;

    if(_urlErep){        
        if(modelList && modelList.length() > 0){
            //initialise le service
            _initItemService(_urlErep) ;
            
            //compteur qui va servir a reinitialiser la liste tous les 20 modeles
            var indexModel = 0 ;
            
            for(var j=0 ; j<modelList.length() ; j++){
                var model = modelList.get(j) ;                    
                
                if(model != ""){
                    addModelForService(model) ;
                    indexModel = j+1 ;
                }
                //lorsque le nombre modele contenu dans la liste atteint 20, on va charger ces modeles et mettre a 0 la liste
                if(indexModel == 20){
                    _loadModels(_client, _idSite, _idCentral, "", _localfunc) ;
                    _resetModelList() ;
                    indexModel = 0 ;
                }
            }
            
            //charge les modeles pour les derniers modeles de la liste
            _loadModels(_client, _idSite, _idCentral, "", _localfunc) ;
        }
        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, _isFromModel, _localfunc){
    //doit on afficher les informations prix
    _displayPrice = _isDisplayPrice ;
    isFromModel =_isFromModel ;
    
    //recupere le serveur eRep
    _urlErep = getUrlErep(_SERVICE_ITEM_MODEL, _client, "", _idModel,  _idSite, _language,  _idCentral, "", _localfunc) ;        
    idModel = _idModel ;

    if(_urlErep){
        //initialise le service
        _initItemService(_urlErep) ;

        //charge la famille
        _loadModel(_client, _idSite, _idCentral, null, _idModel, _language, _localfunc) ;
   }
}

/**
 * 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 aléatoirement 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>4 && possibleAAfficher.length()>=4){
        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<4 && 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 aléatoirement parmit toutes les VC disponible
    -nbPdt : nombre de produit disponible
*/
function selectionAleatoire(nbPdt){
    if(nbPdt>4){
         var dejaAfficher=[-1,-1,-1,-1];
         for(var l=0; l < 4;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];
    }   
    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.value ;
        var priceByKg = parseFloat(priceValue.integer+"."+priceValue.decimal)/valeurPoidsModele ;
        priceByKg=Math.round(priceByKg*100)/100;
        
        // 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 Value(priceByKg.substring(0,priceByKg.indexOf('.')), priceByKg.substring(priceByKg.indexOf('.')+1));
        }
        else {
            var priceByKg_value = new Value(priceByKg, '00');
        }
        // construction de l objet currency pour utiliser la methode de formatage du prix

        var oCurrency = new Currency(1, _currencyObject.getSymbol(), _currencyObject.getDecimalNumber(), _currencyObject.getDecimalDelimiter(), _currencyObject.getThousandDelimiter(), _currencyObject.isBehind());
        if(oCurrency){            
            return oCurrency.formatValue(priceByKg_value) +' / ' +unitePoidsModele;
        }
        else{
            return "" ;
        }
    }
    else{
        return "" ;
    }
}