/****************
 * jQuery.fn.menuActif()
 * Demarque dans un menu un lien de page comme actif lorsque l'url
 * de la page courante correspond au href du lien de page.
 * La demarcation comprend :
 *  - attribution d'une classe au lien de page ;
 *  - attribution d'une classe au lien de section ;
 *  - visibilite forcee de la section comprenant le lien de page.
 *
 * Francois Moreau, grillonbleu@gmail.com, mai 2009
 *
 * PARAMETRES (valeurs par defaut)
 * classeActif ('on')
 *    Classe donnee au lien de page et de section active.
 * requeteLiensSections ('> div > a[href]')
 *    Requete jQuery qui trouve tous les liens de sections,
 *    dans le contexte du menu.
 * trouvePagesParSection (function(element_jQuery) return element_jQuery)
 *    Fonction qui, a partir de l'element jQuery du lien de section,
 *    trouve les liens de pages de la section.
 *
 * USAGE :
 *  jQuery("#menu").menuActif({option1: val1, option2: val2});
 */

jQuery.fn.menuActif = function(options) {
  var opts = jQuery.extend({}, jQuery.fn.menuActif.defaults, options);
  return this.each(function() {
                     var menu = jQuery(this);

                     var est_trouve_lien_actif = false;
                     var liens_sections = menu.find(opts.requeteLiensSections);
                     for(var ii=0; ii<liens_sections.length; ++ii) {
                       var lien_section = liens_sections.eq(ii);

                       var liens_pages  = opts.trouvePagesParSection(lien_section);
                       for(var jj=0; jj<liens_pages.length; ++jj) {
                         var lien_page = liens_pages.eq(jj);
                         if(lienEstActif(lien_page)) {
                           
                           //forcer la visibilite sur tous les ancetres du menu actif
                           //s'arreter a la racine du menu
                           var parents = lien_page.parents();
                           for(var kk=0; kk<parents.length; ++kk) {
                             if(this == parents[kk]) break;
                             parents.eq(kk).show();
                           }

                           lien_page.addClass(opts.classeActif);
                           est_trouve_lien_actif = true;
                           break;
                         }
                       }

                       if(est_trouve_lien_actif || lienEstActif(lien_section)) {
                         lien_section.addClass(opts.classeActif);
                         break;
                       }
                     }
                   });

  function lienEstActif(lien) {
    return lien[0].href == location.href;
  }
};
jQuery.fn.menuActif.defaults = {
  classeActif: 'on',
  requeteLiensSections: '> div > a[href]',
  trouvePagesParSection: function(lien_section) {
    return lien_section.parent('div').next('ul').find('li > a[href]');
  }
};


//Appel

jQuery(function() {
         jQuery('#menu').menuActif();
       });

// FIN jQuery.fn.menuActif()