/**
 * Plugin JQuery AOT-menu
 *  
 *
 *
 */    
var fixedHeight = false;
(function($) {

    // Corps du plugin aotMenu
  $.aotMenu = function(obj, options) {
      // Définition des variables locales
    var inactivityDelay = options.inactivityDelay;
    var activeDelay     = options.activeDelay;
    var activeDelaySub  = options.activeDelaySub;
    var scrollSpeed     = options.scrollSpeed;
    
    var currentItem;
    var currentItem2;
    var timer1;
    var timer2;
    
    $(options.content).css('min-height',options.absmin+'px')
                      .css('max-height','500000px')
                      .css('height','auto');
    var minHeight = $(options.content).height();
    
    function adjH() {
	var X = $('#aot-scroll-page-left-search').height()+$('#aot-scroll-page-left-menu').height()+$('#aot-scroll-page-left-quicklaunch').height()+$('#aot-scroll-page-left-promotion').height();
	var Y = $(options.content).height();
             
        if (X > Y) {
	    $(options.content).height(X+50);
        }else {
	    if (fixedHeight) {
		$(options.content).height(fixedHeight);
	    }else
	    if (X < Y && minHeight < Y) {
		$(options.content).height(minHeight+50);
	    }
	    $(options.content).css('min-height',X+50);
        }
    }
    
      // MENU_INACTIVITY : Delay pour masquage des items du menu si curseur inactif
    menuInactivity = window.setInterval(function() {
      inactivityDelay--;
      if (inactivityDelay <= 0) {
          // Masquage des éléments non actifs
        $(options.level_1_sub+':visible', obj).not('.'+options.active).slideUp('fast',adjH);
        $(options.level_0_sub+':visible', obj).not('.'+options.active).slideUp('slow',adjH);
          // Reset du delay d'innactivité
        inactivityDelay = options.inactivityDelay;
      }
    },1000);
        
      // INITIALISATION DU MENU : Masquage initial des sous éléments de menu
    $(options.level_0, obj).each(function() {
      if ($(this).hasClass(options.active))
        $(this).next().filter(options.level_0_sub).addClass(options.active);
    });
    $(options.level_1, obj).each(function() {
      if ($(this).hasClass(options.active))
        $(this).next().filter(options.level_1_sub).addClass(options.active);
    });
    $(options.level_1_sub, obj).not('.'+options.active).hide();
    $(options.level_0_sub, obj).not('.'+options.active).hide();
    $('.'+options.active, obj).show();
    adjH();
    minHeight = $('#aot-scroll-page-main-content').height();
    
      // BIND mouseover Level_0
    $(options.level_0, obj).mouseover(function() {
        // Marquer l'item survollé comme courant
      currentItem = $(this);
      $('.aotMenu_current', obj).removeClass('aotMenu_current');
      $(this).next().addClass('aotMenu_current');
        // Reset de l'inactivité
      inactivityDelay = options.inactivityDelay;
        // Ajout timer d'activité
      timer1 = setTimeout(function() {
          // Relever les sous menu non actifs non survollés
        $(options.level_0_sub, obj).not('.'+options.active).not('.aotMenu_current').slideUp(scrollSpeed,adjH);
        $(options.level_1_sub, obj).not('.'+options.active).not('.aotMenu_current').slideUp(scrollSpeed,adjH);
          // Derouler le prochain sous-menu
        $(currentItem).next().filter(options.level_0_sub).slideDown(scrollSpeed,adjH);
          // Reset inactivitée
        inactivityDelay = options.inactivityDelay;
      },(activeDelay*1000));
      
    }).mouseout(function() {
        // Arret du survole => Suppression de timer d'activité
      clearTimeout(timer1);
        //  Reset inactivitée
      inactivityDelay = options.inactivityDelay;
    });
  
      // BIND mouseover Level_1
    $(options.level_1, obj).mouseover(function() {
        // Marquer l'item survollé comme courant
      currentItem2 = $(this);
      $(this).parent().find('.aotMenu_current').removeClass('aotMenu_current');
      $(this).next().addClass('aotMenu_current');
        // Reset inactivitée
      inactivityDelay = options.inactivityDelay;
        // ajout timer d'activité
      timer2 = setTimeout(function() {
          // Relever les sous menu précédent non actifs
        $(options.level_0_sub, obj).not('.'+options.active).not('.aotMenu_current').slideUp(scrollSpeed,adjH);
        $(options.level_1_sub, obj).not('.'+options.active).not('.aotMenu_current').slideUp(scrollSpeed,adjH);
        
          // Dérouler le prochain sous-menu
        $(currentItem2).next().filter(options.level_1_sub).slideDown(scrollSpeed,adjH);
          // Reset inactivitée
        inactivityDelay = options.inactivityDelay;
      },(activeDelaySub*1000));
      
    }).mouseout(function() {
        // Arret du survole => Suppression du timer d'activité
      clearTimeout(timer2);
        // Reset inactivitée
      inactivityDelay = options.inactivityDelay;
    });
    
  };
  
    // Définition du Plugin aotMenu
  $.fn.aotMenu = function(options) {
      // Valeurs par défaut des options
    var defaults = {
        // Delay d'inactivité
      inactivityDelay : 6,
        // Delay d'activation
      activeDelay : 0.4,
        // 2nd Delay d'activation
      activeDelaySub : 0.5,
        // Vitesse d'animation
      scrollSpeed : 900,
        // Selecteur || JQuery Object de 1er Niveau d'arbo
      level_0 : '.level_0',
        // Selecteur || JQuery Object de conteneur de 2nd  Niveau d'arbo
      level_0_sub : '.level_0_sub',
        // Selecteur || JQuery Object de 2nd Niveau d'arbo
      level_1 : '.level_1',
        // Selecteur || JQuery Object de conteneur de 3rd Niveau d'arbo
      level_1_sub : '.level_1_sub',
        // Selecteur || JQuery Object de 3rd Niveau d'arbo
      level_2 : '.level_2',
        // Class marquant l'item comme courant
      active : 'active',
        // Selecteur || jQuery Object du contenu de page
      content : '#aot-scroll-page-main-content',
        // MinHeight
      absmin : 320
    };
      // Fusion defaults & options
    options = $.extend(defaults, options);  
    
      // Attachement du plugin sur les elmts selectionés
    this.each(function() {
      new $.aotMenu(this, options);      
    });
      // Retourne le ou les objects JQuery soumis après traitement.
    return this;
  };
  
})(jQuery);

