//Liste des criteres a prendre en compte
var _CRITERIA_1 = "typologie" ;
var _CRITERIA_2 = "colorama" ;

//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 coloris

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 _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
    + _typoCollection : La collection du modele
    + _typoModel : La typologie du modele
    + _color : La couleur du modele
    + _colorFamily : La famille de la couleur
************************************** */
function CriteriaModel(_idModel, _typoModel, _color, _colorFamily){
    this._idModel = _idModel ;
    this._typoModel = _typoModel ;
    this._color = _color ;
    this._colorFamily = _colorFamily ;
}

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.getColor = function(){
    if(this._color){
        return this._color ;
    }
    else{
        return "" ;
    }
}


CriteriaModel.prototype.getColorFamily = function(){
    if(this._colorFamily){
        return this._colorFamily ;
    }
    else{
        return "" ;
    }
}


/* **************************************
* 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(){
    //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() ;
			
			var test = "";
			for(var j=0 ; j<enableModelList.length() ; j++){
				test += enableModelList.get(i);
			}
			
            
            if(enableModelList.contains(idModel) > -1){
                var criteria1 = currentCriteriaModel.getTypoModel() ;
                var criteria2 = currentCriteriaModel.getColor()+"__"+currentCriteriaModel.getColorFamily() ;

                if(currentCriteriaModel.getColor() == ''){
                    criteria2 = "__" ;
                }
                
                //mise à jour de la liste des criteres
                addCriteria(criteria1, criteria2) ;
            }
        }
    }
    
    //Gestion critere categorie
    writeCriteria(_CRITERIA_1, _listeCriteria1) ;
         
    //Gestion critere couleur
    writeCriteria(_CRITERIA_2, _listeCriteria2) ;
    
        
    //Affichage de la selection que si une des 2 listes contient des criteres
    if(_listeCriteria1.length() > 0 || _listeCriteria2 > 0){
        displayBloc(getElement("selection", true, "")) ;
    }
}


/* **************************************
* 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
*/
function writeCriteria(_criteriaType, _listeCriteria){
    var criteriaHtmlObj = getElement("fmc_"+_criteriaType, true, "") ;
    var libelleTypeFiltre = "" ;
    var libelleTypeFiltreAll = "" ;
    var tagTypeFiltreAll = "" ;
    
    //Recuperation de la zone HTML qui va accueiller ce type de critere
    if(criteriaHtmlObj){
        var criteriaListHtml = "" ;
        for(var i=0 ; i<_listeCriteria.length() ; i++){
            var currentCriteria = _listeCriteria.get(i) ;
            
            //Traitement des criteres autres que colorama
            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, le checkbox va etre desactive et checke
                if(_listeCriteria.length() == 1){
                    checkedCriteria = "checked=true" ;
                    disabledCriteria = "disabled=true" ;
                }
                
                //Specifique DOMYOS
                libelleTypeFiltre = libelleFiltreTypo ;
                libelleTypeFiltreAll = libelleFiltreTypoAll ;
                tagTypeFiltreAll = tagFamille+"filter_alltypes" ;
                                
                //[TAG]Ajout du taggage Google analytics pour le texte
                var funcTag = setLinkTag(tagFamille+"filter_type", "selectModels(this, '"+_criteriaType+"', '"+currentCriteria+"');") ;
                
                criteriaListHtml = criteriaListHtml + '<div class="intitule" id="'+currentId+'"><a id="'+currentId+'_cb" onclick="'+funcTag+'">'+currentCriteria+"(<span class='chiffre'>"+nbProduct+"</span>)</a></div>" ;
            }
            else{
                var colorHtml = currentCriteria.split("__")[0] ;
                var colorName = currentCriteria.split("__")[1] ;
                var currentId = _criteriaType+"_"+colorHtml ;

                var checkedCriteria = "" ;
                var disabledCriteria = "" ;
                
                //Si il n'y a qu'un seul critere pour ce type de critere, le checkbox va etre desactive et checke
                if(_listeCriteria.length() == 1){
                    checkedCriteria = "checked=true" ;
                    disabledCriteria = "disabled=true"
                }
                
                //Specifique DOMYOS
                libelleTypeFiltre = libelleFiltreColoris ; 
                libelleTypeFiltreAll = libelleFiltreColorisAll ;
                tagTypeFiltreAll = tagFamille+"filter_allcolors" ;
                
                //[TAG]Ajout du taggage Google analytics pour le texte
                var funcTag = setLinkTag(tagFamille+"filter_colors", "selectModels(this, '"+_criteriaType+"', '"+currentCriteria+"');") ;
               if(!hasMultiColor){
                   isColoramaSelected=false;
               }
               if(colorHtml != "" || _listeCriteria.length() > 1){
                    hasMultiColor=true;
                }
                //Si la couleur html est definie, on va afficher la case couleur
                if(colorHtml != ""){
                    criteriaListHtml = criteriaListHtml + '<div class="intitule" id="'+currentId+'"><a class="colorama" id="'+currentId+'_cb"  onclick="'+funcTag+'" style="display:block;height:16px;background-color:'+colorHtml+';"><img src="../images/static/blank.gif" alt="'+colorName+'" height="16" width="16"/></a></div>' ;
                }
                //Sinon si la couleur html n'est pas definie, on va afficher la case couleur que si il existe d'autre couleur
                else if((colorHtml == '' && _listeCriteria.length() > 1) || (colorHtml == '' && hasMultiColor && isColoramaSelected)){
                    criteriaListHtml = criteriaListHtml + '<div class="intitule" id="'+currentId+'"><a class="nocolorama" id="'+currentId+'_cb"  onclick="'+funcTag+'" style="display:block;height:16px;"><img src="../images/static/blank.gif" alt="'+libelleCouleurNonDefinie+'" height="16" width="16"/></a></div>' ;
                }
                //Sinon, il existe que des couleur html non definie, on n'affiche donc pas le bloc filtre couleur
                else{
                    hideBloc(getElement("couleurs", true, "")) ; //On cache le filtre coloris
                }
            }
        }
        //[TAG]Ajout du taggage Google analytics pour le texte
        var funcTag = setLinkTag(tagTypeFiltreAll, "cleanUrl('"+document.location.href+"');") ;
                
        criteriaHtmlObj.innerHTML = '<span class="title">'+libelleTypeFiltre+'</span><div class="criteres">' + criteriaListHtml + '<div class="intitule"><a class="all" href="#" onclick="'+funcTag+'">'+libelleTypeFiltreAll+'</a></span></div>' ;
    }
}


/* **************************************
* 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() ;
    alert(listeCriteriaModel.length());
    //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){
                    isColoramaSelected=true;
                    currentCriteria = currentCriteriaModel.getColor()+"__"+currentCriteriaModel.getColorFamily() ;
                    if(currentCriteriaModel.getColor() == ''){
                        currentCriteria = "__" ;
                    }
                }
                
                //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) ;
    }
    //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 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() ;
    
    //On reselectionne le critere choisi
    _listeSelectedCriteria.add(_criteriaCheckedObj.id) ;
    
    for(var i=0 ; i<_listeSelectedCriteria.length() ; i++){
        var currentSelectedCriteria = _listeSelectedCriteria.get(i) ;
        var objCriteriaChecked = getElement(currentSelectedCriteria, true, "") ;

        if(objCriteriaChecked){
            objCriteriaChecked.checked = true ;
            objCriteriaChecked.disabled = true ;
        }
    }
}


/* **************************************
*/
function sortProducts(){
    if(getElement("triprix", true, "")){
        //on va afficher le message d'attente
        displayWaitingMessage() ;
        
        //on va tagguer cette fonctionnalite
        //[TAG]Ajout du taggage Google analytics
        doLinkTag(tagFamille+"sortprice") ;
        
        var sortType = getElement("triprix", true, "").value ;
        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 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 on est pas dans le cas d'un critere selectionne
        var blocPagination = getElement("pagination", true, "") ;
        if(!isCriteriaAlreadySelected){
            hideBloc(getElement("pagination", true, "")) ;
        }
        
        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 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 +
                                '<div class="bloc-produit" id="vignetteproduit-'+currentIdModel+'">' +                            
                                    '<div class="picto">' ;
                            
                            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_link", "") ;
                            
                            htmlProducts = htmlProducts +
                                        '<span class="info_etape" style="'+isDisplayNew+'">'+_nouveauProduit+'</span>' +
                                    '</div>' +
                                    '<div class="vignette">' +
                                        '<a title="" class="" target="_top" href="'+urlItem+'" id="" style="" onclick="'+funcTagImg+'">' +
                                            '<img id="img" src="'+imageItem+'" align="absmiddle" alt="'+altImageItem+'" title="'+altImageItem+'" border="0">' +
                                        '</a>' +
                                    '</div>' +
                                    '<div class="description">' +
                                        '<h2 class="titre">'+libelleItem+'</h2>' +
                                        '<div class="bloc-decathlon">'+prixMagItem+'</div>' +                                
                                        '<p class="produit-savoir-plus">' +
                                            '<a title="" class="savoir-plus" target="_top" href="'+urlItem+'" id="" style="" onclick="'+funcTagTxt+'">'+enSavoirPlusLib+'</a>' +
                                        '</p>' ;
                            
                            if(isDisplayCompareButton){
                                htmlProducts = htmlProducts +
                                     '<p class="produit-comparer">' +
                                            '<input type="checkbox" id="checkbox'+currentIdModel+'" name="produit" value="'+currentIdModel+'" class="checkboxCompare" onclick="checkCompare(this)"/>' +
                                            '<a href="#" onclick="checkTheBox(\'checkbox'+currentIdModel+'\'); return false;">'+comparerLib+'</a>' +
                                        '</p>' ;
                            }        
        
                            htmlProducts = htmlProducts +
                                    '</div>' +
                                '</div>' ;
                        }
                    }
                }
            }
        }
        
        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){
                displayBloc(getElement("pagination", true, "")) ;
            }
        }
    }
}
