//Liste des criteres a prendre en compte
var _CRITERIA_1 = "typologie" ;
var _CRITERIA_2 = "collection" ;

//Liste des type de tri par prix
var _SORT_PRICE_DEFAULT = "-1" ;
var _SORT_PRICE_DESC = "0" ;
var _SORT_PRICE_ASC = "1" ;

var  _listeCriteria1 = new ArrayList() ; //Liste contenant le critere 1 : ici typologie
var  _listeCriteria2 = new ArrayList() ; //Liste contenant le critere 2 : ici personnalisable

var _mapCriteria = new Map() ; //Map contenant les objets Criteria par type de critere

var _mapNbProductCriteria = new Map() ; //Map contenant le nombre de produit par type de critere

var _mapCriteriaByModel = new Map() ; //Map contenant les objets Criteria par code modele

var _listeSelectedCriteria = new ArrayList() ; //Liste contenant les criteres selectionnes
var _listeModelForCriteriaSelected = new ArrayList() ; //LIste contenant les modeles du criteres selectionne

var isCriteriaAlreadySelected = false ; //Est ce qu'un crietere a deja ete selectionne 

var sortedList = new ArrayList() ; //Va contenir la liste des produits tries

var hasMultiColor = false;

var isColoramaSelected = false;


/* **************************************
                Object : CriteriaModel
--------------------------------------------------
 Version :
     1.0 - 090615 - KIG
 Description :
    Permet d'associer a un produit les criteres pour le filtre
 Attributes :
    + _idModel : Le code modele
    + _typoModel : La typologie du modele
    + _collection : La collection du modele
************************************** */
function CriteriaModel(_idModel, _typoModel, _collection){
    this._idModel = _idModel ;
    this._typoModel = _typoModel ;
    this._collection = _collection ;
}

CriteriaModel.prototype.getIdModel = function(){
    if(this._idModel){
        return this._idModel ;
    }
    else{
        return "" ;
    }
}

CriteriaModel.prototype.getTypoModel = function(){
    if(this._typoModel){
        return this._typoModel ;
    }
    else{
        return "" ;
    }
}

CriteriaModel.prototype.getCollection = function(){
    if(this._collection){
        return this._collection ;
    }
    else{
        return "" ;
    }
}

CriteriaModel.prototype.setCollection = function(_newCollection){
    return this._collection = _newCollection ;    
}


/* **************************************
* Fonction permettant de mettre a jour la liste des criteres par type de critere et le nombre de produit repondant a ce critere
* @params :
*     + _criteria1 : La valeur pour le type de critere 1
*     + _criteria2 : La valeur pour le type de critere 2
*/
function addCriteria(_criteria1, _criteria2){
    //1er critere
    //Si la liste des criteres 1 ne contient pas encore ce critere, alors on va l'inserer dans la liste
    //et on va initialiser le compteur de produit pour ce critere a 1
    if(_listeCriteria1.contains(_criteria1) == -1){
        _listeCriteria1.add(_criteria1) ;
        _mapNbProductCriteria.put(_criteria1, 1) ;
    }
    else{ //Sinon le critere a deja ete traite et on va juste incrementer le nombre de produit valide (via eRep)  pour ce critere
        var cpt = _mapNbProductCriteria.get(_criteria1) ;
        _mapNbProductCriteria.remove(_criteria1) ;
        cpt++ ;
        _mapNbProductCriteria.put(_criteria1, cpt) ;
    }
    
    //2eme critere : meme gestion que pour le critere 1
    if(_listeCriteria2.contains(_criteria2) == -1){
        _listeCriteria2.add(_criteria2) ;
        _mapNbProductCriteria.put(_criteria2, 1) ;
    }
    else{
        var cpt = _mapNbProductCriteria.get(_criteria2) ;
        _mapNbProductCriteria.remove(_criteria2) ;
        cpt++ ;
        _mapNbProductCriteria.put(_criteria2, cpt) ;
    }
        
    //Si le type de critere 1 a ete gere, on va retirer la liste des criteres pour ce type pour le remettre a jour
    if(_mapCriteria.get(_CRITERIA_1)){
        _mapCriteria.remove(_CRITERIA_1)
    }
    //Idem type critere 1
    if(_mapCriteria.get(_CRITERIA_2)){
        _mapCriteria.remove(_CRITERIA_2)
    }
    
    //On met a jour les types de critere avec les nouveaux criteres
    _mapCriteria.put(_CRITERIA_1, _listeCriteria1) ;
    _mapCriteria.put(_CRITERIA_2, _listeCriteria2) ;
}


/* **************************************
* Fonction permettant d'afficher les criteres
*/
function displayCriteria(_eltChecked){    
    //on va generer la liste des criteres en fonction des produits valides via eRep
    for(var i=0 ; i<listeCriteriaModel.length() ; i++){
        var currentCriteriaModel = listeCriteriaModel.get(i) ;
        if(currentCriteriaModel){
            var idModel = currentCriteriaModel.getIdModel() ;
            
            if(enableModelList.contains(idModel) > -1){
                var criteria1 = currentCriteriaModel.getTypoModel() ;
                var criteria2 = currentCriteriaModel.getCollection() ;
                
                //mise à jour de la liste des criteres
                addCriteria(criteria1, criteria2) ;
            }
        }
    }
    
    //Gestion critere categorie
    writeCriteria(_CRITERIA_1, _listeCriteria1, _eltChecked) ;

    //Gestion critere couleur
    writeCriteria(_CRITERIA_2, _listeCriteria2, _eltChecked) ;
    
    //Affichage de la selection que si une des 2 listes contient des criteres
    if(_listeCriteria1.length() > 1 || _listeCriteria2 > 1){
        displayBlocId("typologie") ;
    }
    
    //Si le nombre d'element est de 1, alors on va afficher le nombre d'element trouve sans lien dessus
    if(getTotalPages(nbProduitFamille) == 1) { //nbProduitFamille declare dans l'HTML
        //displayElementTrouve(true, nbProduitFamille) ;
        
    }
}


/* **************************************
* Fonction permettant d'ecrire l'HTML correspondant au type de critere
* @params :
*    + _criteriaType : Le type de critere a traiter
*    + _listeCriteria : La liste des criteres pour ce type
*    + _eltChecked : L'element selectionne
*/
function writeCriteria(_criteriaType, _listeCriteria, _eltChecked){
    var criteriaHtmlObj = getElement(_criteriaType) ;
    var libelleTypeFiltre = "" ;
    var libelleTypeFiltreAll = "" ;
    var isListBoxSelected = false ;

    //Recuperation de la zone HTML qui va accueiller ce type de critere
    if(criteriaHtmlObj){        
        //Ce booleen permet de savoir si un critere a ete choisi par un internaute
        var isSelectedCriteria = false ;
        if(_listeModelForCriteriaSelected.length() > 0){ //Si la liste _listeModelForCriteriaSelected contient des modeles, c que l'utilisateur a selectionne un critere
            isSelectedCriteria = true ;
        }

        //Ce booleen permet de savoir si le filtre ne contient qu'un seul critere, ceci pour ne pas afficher un filtre inutile
        isUniqueCriteria = false ;
        if(!isSelectedCriteria && _listeCriteria.length() == 1){
            isUniqueCriteria = true ;
        }
        
        //La liste de selection ne sera genere que si le filtre possede plus d'un critere a l'origine
        if(!isUniqueCriteria){
            //La liste de selection ne sera genere que si nous ne sommes pas dans le cas d'un seul critere pour ce type à l'origine
            var criteriaListHtml = "" ;
        
            //On va trier la liste dans l'ordre alphabetique
            _listeCriteria.sortAlpha() ;
            for(var i=0 ; i<_listeCriteria.length() ; i++){
                var currentCriteria = _listeCriteria.get(i) ;
                
                //Traitement des criteres
                if(currentCriteria.indexOf("__") == -1){
                    var nbProduct = _mapNbProductCriteria.get(currentCriteria) ;
                    var currentId = _criteriaType+"_"+currentCriteria.toUpperCase() ;
                    
                    var checkedCriteria = "" ;
                    var disabledCriteria = "" ;
                    
                    //Si il n'y a qu'un seul critere pour ce type de critere, la listbox sera selectionnee
                    if(!isListBoxSelected && _listeCriteria.length() == 1){
                        isListBoxSelected = true ;
                    }
                    
                    if(_criteriaType == _CRITERIA_1){
                        libelleTypeFiltre = libelleFiltreTypo ;
                    }
                    else{
                        libelleTypeFiltre = libelleTitreFiltreCollection ;
                    }
                    
                    var isSelected = "" ;
                    
                    if(isListBoxSelected){
                        isSelected = "selected" ;
                    }
                    else if(typeof _eltChecked != "undefined"){
                        if(currentCriteria == _eltChecked.value){
                            isSelected = "selected" ;
                            isListBoxSelected = false ; //cela veut dire qu'un critere a ete choisi
                        }
                        else{
                            isSelected = "" ;
                        }
                    }
                    else{
                        isSelected = "" ;
                    }
                    
                    criteriaListHtml = criteriaListHtml + "<li class='"+isSelected+"'><a href='' target='_self' onclick='setCriteriaChoice(this, \""+_criteriaType+"\", \""+currentCriteria+"\");return false;'>"+currentCriteria+" <span>("+nbProduct+")</span></a></li>" ;
                }
            }
        
            var isDisabled = "" ;
            if(isListBoxSelected){
                isDisabled = "disabled=disabled" ;
       
               //on va egalement afficher le lien "tout afficher" si l'internaute a selectionne un critere
                if(isSelectedCriteria){
                    displayBloc(getElement("reset")) ;
                }
            }
            else{
                isDisabled = "" ;
                
                //on va egalement cacher le lien "tout afficher"
                hideBloc(getElement("reset")) ;            
            }
                        
            criteriaHtmlObj.innerHTML = '<h3>'+libelleTypeFiltre+'</h3>'+'<ol>'+criteriaListHtml+'</ol>' ;            
        }
        else{ //Sinon on va juste afficher le nombre d'elements de cette page ou laisser le lien pour afficher tous les produits
            var isDisplayElementTrouve = true ;
            if(totalPages > 1){ //totalPages declare dans l'HTML et recalcule dans pagination.js => writePagination(...)
                isDisplayElementTrouve = false ;
            }
            
            //displayElementTrouve(isDisplayElementTrouve, nbProduitFamille) ; //nbProduitFamille declare dans l'HTML et recalcule dans pagination.js => writePagination(...)
        }
    }
}


/* **************************************
* Fonction permettant de lancer le taggage lors de la selection d'une typo et de lancer la fonction de selection de ces produits
* @params :
*    + _obj : L'objet correspondant au select
*    + _criteriaType : Le type du critere choisi
*/
function setCriteriaChoice(_obj, _criteriaType, _criteriaValue){
    var tagCountry = "/"+_language+"/" ;
    var tag = tagCountry + tagLink + tagFamille+"filter_type" ;
    doLinkTag(tag) ;
    
    selectModels(_obj, _criteriaType, _criteriaValue) ;
}


/* **************************************
* Fonction permettant de selectionner les modeles correspondant a un critere choisi
* @params :
*    + _obj : L'objet correspondant au checkbox selectionne
*    + _criteriaType : Le type du critere choisi
*    + _criteriaValue : La valeur du critere choisi
*/
function selectModels(_obj, _criteriaType, _criteriaValue){    
    var newListeCriteriaModel = new ArrayList() ; //La liste qui va contenir les produits correspondant au critere selectionne
    _listeModelForCriteriaSelected = new ArrayList() ;
    
    //on va verifier si au moins un critere est selectionne
    var isCriteriaSelected = true ;
    
    //Si au moins un critere est selectionne
    if(isCriteriaSelected){        
        //on affiche tous les produits
        if(!isCriteriaAlreadySelected){
            displayAllProducts(false, false) ;
            isCriteriaAlreadySelected = true ;
        }
        
        //on va parcourir la liste de tous les modeles pour laisser afficher ceux qui répondent au critere
        for(var i=0 ; i<listeCriteriaModel.length() ; i++){
            var currentCriteriaModel =  listeCriteriaModel.get(i) ;
            var idModel = currentCriteriaModel.getIdModel() ;
            
            if(enableModelList.contains(idModel) > -1){
                var currentCriteria = "" ;
                if(_criteriaType == _CRITERIA_1){
                    currentCriteria = currentCriteriaModel.getTypoModel() ;
                }
                if(_criteriaType == _CRITERIA_2){
                    currentCriteria = currentCriteriaModel.getCollection() ;
                }
                
                //On va cacher tous les produits dont le critere n'est pas celui selectionne
                if(currentCriteria != _criteriaValue){
                    //on cache le produit
                    var refModel = currentCriteriaModel.getIdModel() ;
                    
                    hideBloc(getElement("vignetteproduit-"+refModel, true, "")) ;
                }
                else{
                    newListeCriteriaModel.add(currentCriteriaModel) ;
                    _listeModelForCriteriaSelected.add(currentCriteriaModel.getIdModel()) ;
                }
            }
        }
        if(newListeCriteriaModel.length()==1){
            hideBloc(getElement("triprix", true, ""));
        }
        //on va raffraichir les criteres suivants en fonction du critere selectionne 
        refreshCriteria(_obj, newListeCriteriaModel) ;

        //on va modifier le nombre d'elements trouves
        //displayElementTrouve(true, newListeCriteriaModel.length()) ;
                    
        //on va cacher le message de non dispo au cas ou celui aurait ete affiche
        hideBlocId("advertDispo") ;
    }
    //Sinon on va reafficher tous les produits et la premiere page
    else{
        //affichage de la premiere page
        showPage(1, totalPages); //totalPages definit dans l'HTML
    }       
}


/* **************************************
* Fonction permettant d'afficher ou de cacher le bloc "elements trouves" ainsi que les autres blocs "articles" et "Pagination basse"
* @params :
*    + _toDisplayElt : Affichage ou non du bloc "elements trouves"
*    + _nbEltTrouve : Nb d'elements trouves apres filtre
*/
function displayElementTrouve(_toDisplayElt, _nbEltTrouve){
    //Doit on afficher le texte X elements trouve, si oui
    if(_toDisplayElt){
        var elt = getElement("elementsTrouves") ;
        //on affiche le texte X elements trouves
        if(elt){
            var lib = "" ;
            //Choix du texte au pluriel ou au singulier
            if(_nbEltTrouve == 1){
                lib = libelleFiltreElementTrouve ;
            }
            else{
                lib = libelleFiltreElementsTrouves ;
            }
            //on inscrit le texte dans le bloc html
            elt.innerHTML = "<span>"+_nbEltTrouve + "</span>&nbsp;" + lib ;
            displayBloc(elt) ;
        }
        //on cache le texte X articles trouves
        var eltTotal = getElement("totalArticle") ;
        if(eltTotal){
            hideBloc(eltTotal) ;
        }
        //on cache egalement la pagination basse
        var eltPage = getElement("ligne-affichage-bas") ;
        if(eltPage){
            hideBloc(eltPage) ;
        }
    }
    else{ //si non
        //on cache le texte X elements trouves
        var elt = getElement("elementsTrouves") ;
        if(elt){
            hideBloc(elt) ;
        }
        //on affiche le texte X articles trouves
        var eltTotal = getElement("totalArticle") ;
        if(eltTotal){
            displayBloc(eltTotal) ;
        }
        //on affiche egalement la pagination basse
        var eltPage = getElement("ligne-affichage-bas") ;
        if(eltPage){
            displayBloc(eltPage) ;
        }        
    }
}

/* **************************************
* Fonction permettant de rafraichir les criteres en fonction du critere choisi
* @params :
*    + _criteriaCheckedObj : L'objet correspondant au checkbox selectionne
*    + _newListeCriteriaModel : La liste des modeles repondant au critere selectionne
*/
function refreshCriteria(_criteriaCheckedObj, _newListeCriteriaModel){
     //On remet a 0 toutes les listes pour regerer l'affichage des filtres
     _listeCriteria1 = new ArrayList() ;
     _listeCriteria2 = new ArrayList() ;
    
    _mapCriteria = new Map() ; //Map contenant les objets Criteria par type de critere
    
    _mapNbProductCriteria = new Map() ; //Map contenant le nombre de produit par type de critere
    
    listeCriteriaModel = _newListeCriteriaModel ; //On met a jour la liste des critere par modele    

    //Affichage des criteres
    displayCriteria(_criteriaCheckedObj) ;
    
    //On reselectionne le critere choisi
    _listeSelectedCriteria.add(_criteriaCheckedObj.id) ;
}


/* **************************************
* _typeSort = 0 => Tri decroissant
* _typeSort = 1 => Tri croissant
*/
function sortProducts(_typeSort){
    if(getElement("triprix", true, "")){
        //on va afficher le message d'attente
        displayWaitingMessage() ;
                
        var sortType = _typeSort ;
        var map = priceModelMap ;
        var keyList = null ;
        
        //Tri par prix decroissant
        if(sortType == _SORT_PRICE_DESC){
            //On va recuperer les produits NEW pour les positionner en premier            
            var listeProduitNew = map.get("NEW") ;
            var index = -1 ;
            if(listeProduitNew){
                index = map.remove("NEW") ;
            }
            else if(map.get(999999)){
                listeProduitNew = map.get(999999) ;
                index = map.remove(999999) ;
            }
            if(index == -1){
                map.put(0, listeProduitNew) ;
            }
            else{
                map.putIn(index, 0, listeProduitNew) ;
            }
            
            keyList = map.getKeys() ;
            keyList.sort(true) ;
        }
        else if(sortType == _SORT_PRICE_ASC){ //Tri par prix croissant
            //On va recuperer les produits NEW pour les positionner en premier
            var listeProduitNew = map.get("NEW") ;
            var index = -1 ;
            if(listeProduitNew){
                index = map.remove("NEW") ;
            }
            else if(map.get(0)){
                listeProduitNew = map.get(0) ;
                index = map.remove(0) ;
            }
            if(index == -1){
                map.put(999999, listeProduitNew) ;
            }
            else{
                 map.putIn(index, 999999, listeProduitNew) ;
            }
            
            keyList = map.getKeys() ;
            keyList.sort(false) ;
        }
        else{
            cleanUrl(document.location.href) ;
        }

        writeSortedProducts(keyList) ;
        
        //on va cacher le message de non dispo au cas ou celui aurait ete affiche
        if(getElement("advertDispo").style.display == "block"){
            hideBlocId("advertDispo") ;
        }
        
        //on cache le message d'attente
        hideWaitingMessage() ;
    }
}


/* **************************************
*/
function writeSortedProducts(_sortedList){
    if(_sortedList){
        sortedList = new ArrayList() ;
        var htmlProducts = "" ; //Contient la liste des produits en HTML
        
        //On va reafficher le message d'attente
        displayBloc(getElement("waitingMessage", true, "")) ;
        hideBloc(getElement("produits", true, "")) ;
        hideBloc(getElement("libJurPrix", true, "")) ;
        
        //On ne va cacher le bloc pagination que quand on est pas dans le cas d'un critere selectionne
        if(!isCriteriaAlreadySelected){
            hideBlocId("pagination") ;
            hideBlocId("pagination-bas") ;            
        }
        
        for(var i=0 ; i<_sortedList.length() ; i++){
            var currentPrice = _sortedList.get(i) ;

            var listeModel = priceModelMap.get(currentPrice) ;
            
            if(listeModel){
                for(var k=0 ; k<listeModel.length() ; k++){
                    var currentIdModel = listeModel.get(k) ;
                    
                    if(!isCriteriaAlreadySelected || (isCriteriaAlreadySelected && _listeModelForCriteriaSelected.contains(currentIdModel) > -1)){
                        var itemSite = modelObjByIdMap.get(currentIdModel) ;
                        
                        if(itemSite){
                            //Servira a la pagination
                            sortedList.add(currentIdModel) ;
                            
                            //on genere l'html pour le produit
                            var urlItem = itemSite.getUrl() ;
                            var imageItem = itemSite.getImageMedium() ;
                            var altImageItem = itemSite.getAltImage() ;
                            var libelleItem = itemSite.getLibelle() ;
                            var typoItem = itemSite.getTypo() ;
                            var prixMagItem = itemSite.getPrixMag() ;
                            var isNew = itemSite.isNew() ;
                            var pictoSelection = itemSite.getPictoSelection() ;
                            var descSelection = itemSite.getDescSelection() ;
                                                        
                            //Si on est dans le cas d'un critere selectionne, on affiche les produits, sinon ils sont caches
                            var isDisplayBlock = "" ;
                            if(isCriteriaAlreadySelected){
                                isDisplayBlock = "block" ;
                            }
                            else{
                                isDisplayBlock = "none" ;
                            }
        
                            var isDisplayNew = "display:none;" ;
                            if(isNew){
                                isDisplayNew = "display:block;" ;
                            }
                            
                            htmlProducts = htmlProducts +
                                '<li class="produit" id="vignetteproduit-'+currentIdModel+'">' ;
                            
                            if(pictoSelection != ""){
                                htmlProducts = htmlProducts +
                                    '<img src="'+pictoSelection+'" alt="'+descSelection+'" title="'+descSelection+'"/>' ;
                            }
                                                        
                            //[TAG]Ajout du taggage Google analytics pour le texte
                            var funcTagImg = setLinkTag(tagFamille+"product_img", "") ;
                            var funcTagTxt = setLinkTag(tagFamille+"product_text", "") ;                            
                            var funcTagBtn = setLinkTag(tagFamille+"product_btn", "") ;
                            
                            var onMouseOverImg = "ddrivetip2('imgpdt-"+currentIdModel+"', 'blocinfoplus"+currentIdModel+"', '', '440', 'dhtmltooltip2', false);" ;
                            var onMouseOutImg = "hideddrivetip('dhtmltooltip2', false);" ;
                                                
                            htmlProducts = htmlProducts +
					'<div class="image">'+
						'<a target="_top" href="'+urlItem+'" onclick="'+funcTagImg+'">' +
							'<img id="imgpdt-' + currentIdModel + '" src="'+imageItem+'" align="absmiddle" alt="'+altImageItem+'" title="'+altImageItem+'" border="0" onmouseout="'+onMouseOutImg+'" onmouseover="'+onMouseOverImg+'"/>'+
						'</a>' +
					'</div>'+					
                                    '<h2>'+
						'<a target="_top" href="'+urlItem+'" id="' + currentIdModel + '" onclick="'+funcTagTxt+'">' +
							libelleItem +
						'</a>' +
                                    '</h2>' +
                                    '<h3>' +
						'<div class="informations bloc-prix" id="bloc-prix' + currentIdModel + '">' +
							'<div class="fiche-produit-prix" id="bloc-decathlon'+currentIdModel+'">'+ 
                                                		'<div class="droite"><span class="prix">' +prixMagItem+ '</span></div>' +                                                 
                                        		'</div>' +
                                        	'</div>' +
                                        	'<span class="picto-new" id="picto-new-{$referenceModele}" style="'+isDisplayNew+'">' +
                    					_nouveauProduit +
                				'</span>' +
					'</h3>' +
					'<span>' +
						'<img align="absmiddle" src="../images/static/bg-btn-famille-l.gif" alt=""/>' +'<a target="_top" href="'+urlItem+'" onclick="'+funcTagBtn+'">' +voirLeProduitLabel +'</a>' +
					'</span>' ;

                            htmlProducts = htmlProducts + '</li>' ;
                        }
                    }
                }
            }
        }
        
        var produitsHtml = getElement("produits", true, "") ;
        if(produitsHtml){
            produitsHtml.innerHTML = "" ;
            produitsHtml.innerHTML = htmlProducts ;
            
            if(!isCriteriaAlreadySelected && !isAllPages){
                showPage(1, totalPages) ;
            }
            
            //On va reafficher le message d'attente
            hideBloc(getElement("waitingMessage", true, "")) ;            
            displayBloc(getElement("produits", true, "")) ;
            displayBloc(getElement("libJurPrix", true, "")) ;
            
            //On ne va afficher le bloc pagination que si il a etait cache un peu plus haut dans le code
            if(!isCriteriaAlreadySelected){
                displayBlocId("pagination") ;
                displayBlocId("pagination-bas") ;
            }
        }
    }
}

/* **************************************
 * Permet de renseigner l'object CriterialModel
*/
function setCollectionFilter(_modelList, _collectionTitle){
    var tabModel = _modelList.split(";") ;
    for(var i=0 ; i<tabModel.length ; i++){
        var idModel = tabModel[i] ;

        if(idModel != '' && enableModelList.contains(idModel) > -1){
            var criteriaModel = _mapCriteriaByModel.get(idModel) ;
            if(criteriaModel){
                criteriaModel.setCollection(_collectionTitle) ;
            }
        }
    }
}
