/*
fonctions gérant les onglets et filtres du corner
*/
(function ($) {
AjaxSolr.TagcloudWidget = AjaxSolr.AbstractFacetWidget.extend({

  afterRequest: function () {

    if(!Manager.custom.getTagCloud) {
      /*********************************************************************************************/
      // Les listes de filtres sont déjà générée, donc on coupe leur régénération
      /*********************************************************************************************/
      return;
    }
    Manager.custom.tagCloudExecuted++;
    /*********************************************************************************************/
    // Il ne faut générer qu'un nombre de widget TagCloud égal au nombre de critere affiché
    // On calcule donc le nombre de tagCloud executé
    // Si les nombre de tagCloud executé est égal au nombre de tagCloud à afficher, on change notre marqueur.
    /*********************************************************************************************/

    if ( Manager.custom.tagCloudExecuted == Manager.custom.tagCloudNumber ) {
      Manager.custom.getTagCloud = false;
      Manager.custom.getFacet = false;
    }

    var maxCount = 0;
    objectedItems = [];
    for (var facet in this.manager.response.facet_counts.facet_fields[this.field]) {
      if( facet != "" ) {
        var count = parseInt(this.manager.response.facet_counts.facet_fields[this.field][facet]);
        if (count > maxCount) {
          maxCount = count;
        }
        objectedItems.push({ facet: facet, count: count });
      }
    }


    if( Manager.custom.MethodeTri == "alphabetic" ){
      objectedItems.sort(function (a, b) {
        return a.facet < b.facet ? -1 : 1;
        /*********************************************************************************************/
        // On trie par ordre alphabetique
        /*********************************************************************************************/

      });
    } else if( Manager.custom.MethodeTri == "weight" ){
      objectedItems.sort(function (a, b) {
        return a.count > b.count ? -1 : 1;
        /*********************************************************************************************/
        // On trie par nombre de résultat décroissant
        /*********************************************************************************************/

      });
    }

    if( this.id == "Tags_prix_tranche") {
      objectedItems.sort(function (a, b) {
        return a.facet.indexOf('Moins') >= b.facet.indexOf('Moins') ? -1 : 1;
      });
    }
    /*console.log(objectedItems);*/

    var self = this;
    var filters = this.manager.store.exposedString();


    self.facetHash = function (value) {
      var _newHash = "";
      var _fqs = Manager.store.params.fq
      //console.log(_fqs)
      if( (_fqs!="undefined")&&(_fqs!="")&&(_fqs!=undefined)) {
        _newHash += "#!";
        for (var i = 0, l = _fqs.length; i < l; i++) {
          //console.log(_fqs[i].value)
          if( this.target == '#docs' ){
            if( !_fqs[i].value.indexOf('categories:') == 0 ) {
              _newHash += encodeHash(_fqs[i].value);
            }
          } else {
            _newHash += encodeHash(_fqs[i].value);
          }
          if( i+1 < l ){
            _newHash += "&";
          }
        }
      }
      Manager.custom.hashChangedByFacet = true;
      window.location.hash = _newHash;
      if( window.location.href.substring(window.location.href.length-2,window.location.href.length) == "#!" ){
        $(Manager.widgets.result.target).hide();
        window.location.href = window.location.href.substring(0,window.location.href.length-2);
      }
      if( window.location.href.substring(window.location.href.length-1,window.location.href.length) == "#" ){
        $(Manager.widgets.result.target).hide();
        window.location.href = window.location.href.substring(0,window.location.href.length-1);
      }
    }

    self.clickHandler = function (value) {
      var self = this;
      /*********************************************************************************************/
      // Au clic sur un filtre (en mode lien) :
      // On parcoure les filtre en cours, si jamais un filtre du même type existe déjà, on le supprime
      // A la fin, on ajoute notre filtre qui, de fait, sera unique pour le critere choisi.
      /*********************************************************************************************/
      return function () {
        var _this = jQuery(this);
        allowAdding = true;
        if(Manager.store.params.fq != undefined) {

          var doc = Manager.store.params.fq

          for (var i = 0, l = doc.length; i < l; i++) {
            if( (doc[i] != "undefined")&&(doc[i]!="")&&(doc[i]!=undefined)) {
              if( doc[i].value.indexOf(self.field) != -1 ) {
                if(doc[i].value == self.field+':'+value) {
                  allowAdding = false;
                }
                Manager.store.removeByValue('fq',doc[i].value)
              }
            }
          }
        }

        if(allowAdding) {
          /*********************************************************************************************/
          // Si jamais le clic est effectué sur un filtre déjà coché :
          // On ne réajoute pas le filtre, on se contente de la suppression
          // On s'arrange par contre, pour cocher les cases / réinitialiser les select à chaque changement de filtre
          /*********************************************************************************************/

          if(value!=""){
            self.add(value);
          }
          _Check = _this.prev(':checkbox');
          _CheckName = _this.prev(':checkbox').attr('name');
          jQuery("input[name="+_CheckName+"]").attr('checked',false);
          _Check.attr('checked',true);
          jQuery('select[name=select_'+_CheckName.split('check_')[1]+']').val('');

        } else {
          _Check = _this.prev(':checkbox');
          _CheckName = _this.prev(':checkbox').attr('name');
          jQuery("input[name="+_CheckName+"]").attr('checked',false);
        }

        self.facetHash();
        if( Manager.store.params.fq != undefined ) {
          if( Manager.widgets.result.target == '#docs' ){
            if( Manager.store.params.fq.length == 1 ) {
              jQuery(Manager.widgets.result.target).hide().next().show();
            } else {
              jQuery(Manager.widgets.result.target).show().next().hide();
              Manager.doRequest();
            }
          } else {
            if( Manager.store.params.fq.length == 0 ) {
              Manager.store.get('rows').val(16);
            } else {
              Manager.store.get('rows').val(Manager.custom.rows);
            }
            Manager.doRequest();
          }
        }

        return false;
      }
    }
    self.clickHandlerCheck = function (_value) {

      /*********************************************************************************************/
      // Au clic sur un filtre (en mode checkbox) :
      // On décoche les autres filtre
      // On remet le select à zéro
      // On simule le click sur le lien correspondant
      /*********************************************************************************************/
      return function () {
        var _this = jQuery(this);
        _thisName = _this.attr('name');

        jQuery("input[name="+_thisName+"]").attr('checked',false);
        _this.attr('checked',true);
        jQuery('select[name=select_'+_thisName.split('check_')[1]+']').val('');
        _this.next('a').trigger('click');
      }
    }
    self.clickHandlerSelect = function (_value) {

      /*********************************************************************************************/
      // Au clic sur un filtre (en mode select) :
      // On parcoure les filtre en cours, si jamais un filtre du même type existe déjà, on le supprime
      // A la fin, on ajoute notre filtre qui, de fait, sera unique pour le critere choisi.
      // Si jamais le champ n'a pas de valeur, on supprime donc juste le filtre en cours.
      /*********************************************************************************************/
      return function () {
        value = jQuery('select[name="'+_value+'"]').val();
        //console.log(_value);
        if(Manager.store.params.fq != undefined) {
          var doc = Manager.store.params.fq
          for (var i = 0, l = doc.length; i < l; i++) {
            if( (doc[i] != "undefined")&&(doc[i]!="")&&(doc[i]!=undefined)) {
              if( doc[i].value.indexOf(self.field) != -1 ) {
                Manager.store.removeByValue('fq',doc[i].value)
              }
            }
          }
        }
        if(value!=""){
          self.add('"'+value+'"');
        }

        jQuery('input[name=check_'+_value.split('select_')[1]+']').attr('checked',false);

        self.facetHash();
        Manager.doRequest();
        return false;
      }
    }

    $(this.target).empty();
    if( this.target == '#docs' ){
      _CritereTitre = $('<li>').append($('<strong>').html(self.id.split('critere_')[1]));
    } else {
      if(self.id.split('critere_').length > 1) {
        _CritereTitre = $('<li>').append($('<strong>').html(self.id.split('critere_')[1].replace(/_/g,' ').replace('edition','&eacute;dition')));
      } else {
        _CritereTitre = $('<li>').append($('<strong>').html(self.id.split('Tags_')[1].replace(/_/g,' ').replace('tranche','').replace('text','').replace('categories','cat&eacute;gorie') ));
      }
    }
    $(this.target).append(_CritereTitre);
    /*********************************************************************************************/
    // On ajoute le titre du critère.
    // Ensuite, pour chaque valeur du filtre (jusque le nombre max), on affiche un lien
    /*********************************************************************************************/
    for (var i = 0,  j = 0 , l = Manager.custom.NumberOfLinks; (j < l)&&(j < objectedItems.length); i++) {
      var facet = objectedItems[i].facet
      $(this.target).append(AjaxSolr.theme('tag', facet, parseInt(objectedItems[i].count), self.clickHandler('"' + facet + '"'), self.clickHandlerCheck('"' + facet + '"'), self.id.split('critere_')[1], j ));
      j++;
    }

    if((Manager.custom.UseSelect)&&(objectedItems.length > Manager.custom.NumberOfLinks)){
      /*********************************************************************************************/
      // Ensuite, si on est censé afficher un select, on s'occupe de le générer
      /*********************************************************************************************/

      if(self.id.split('critere_').length > 1) {
        _selectName = 'select_'+self.field.split('critere_')[1];
      } else {
        _selectName = 'select_'+self.field;
      }
      _select = $('<select>')
        .attr('name',_selectName)
        .change(self.clickHandlerSelect( _selectName ))
      _liSelect = $('<li>').append( _select );

      $(this.target).append(_liSelect)
      $(this.target).find('li:last select').append(AjaxSolr.theme('tagOption', '', 'S&eacute;lectionnez votre '+$(this.target).find('strong').text() ));
      /*********************************************************************************************/
      // Enfin, on ajoute une option pour chaque filtre disponible.
      /*********************************************************************************************/
      for (var i = Manager.custom.NumberOfLinks, l = objectedItems.length; i < l; i++) {

        var facet = objectedItems[i].facet
        if (facet != "") {
          $(this.target).find('li:last select').append(AjaxSolr.theme('tagOption', facet, facet ));
        }
      }
      $(this.target).find('select').selectmenu();
    }

}
});
})(jQuery);
