/**
 * Animation du menu principal.
 * 
 * @require	jQuery
 */
(function($) {

	/**
	 * Création ou récupération d'espaces de noms spécifiques.
	 */
	
	var P = window.PAGE || (window.PAGE = {});
	var $_info = P._info || (P._info = {});

	/**
	 * Id d'éléments de la page et classes qu'ils peuvent porter.
	 */
	
	var sTopPrefix = "topMenu";
	var sTopClass = sTopPrefix;	// topMenu
	
	var sTopItemPrefix = sTopPrefix + "Item"; // topMenuItem
	var sTopItemClass = sTopItemPrefix; // topMenuItem
	var sTopItemIdPrefix = sTopItemClass + "-"; // topMenuItem-
	var sTopItemContSepClass = sTopItemPrefix + "ContSep"; // topMenuItemContSep
	var sTopItemContButtonOuterClass = sTopItemPrefix + "ContButtonOuter"; // topMenuItemContButtonOuter
	var sTopItemContButtonInnerClass = sTopItemPrefix + "ContButtonInner"; // topMenuItemContButtonInner
	var sTopItemTextClass = sTopItemPrefix + "Text"; // topMenuItemText
	
	var sSubPrefix = "topSubMenu";
	var sSubClass = sSubPrefix; // topSubMenu
	
	var sSubItemPrefix = sSubPrefix + "Item"; // topSubMenuItem
	var sSubItemClass = sSubItemPrefix; // topSubMenuItem
	var sSubItemNumClassPrefix = sSubItemPrefix + "-"; // topSubMenuItem-
	var sSubItemContBorderClass = sSubItemPrefix + "ContBorder"; // topSubMenuItemContBorder
	var sSubItemContSepClass = sSubItemPrefix + "ContSep"; // topSubMenuItemContSep
	
	var sActiveClass = "active";
	var sOpenClass = "open";
	var sLinkClassPrefix = "link-to-page-id-";
	
	var _jDefaultActiveTopItem;
	var rResetTimeout = null;
	var rActivateDefaultTopItemTimeout = null;
	
	/**
	 * Configuration.
	 */
	
	var iResetTimeoutDuration = 500; // ms
	var dSubOpacity = 0.9;
	
	/**
	 * Active une entrée de menu, ce qui conduit généralement à la mettre en
	 * valeur.
	 * 
	 * @param	jQuery	j	Une ou plusieurs entrée(s) de menu.
	 */	
	function activate(jItems) {
		jItems.addClass(sActiveClass);
	}
	
	/**
	 * Désactive une entrée de menu, annulant sa mise en valeur.
	 * 
	 * @param	jQuery	j	Une ou plusieurs entrée(s) de menu.
	 */
	function deactivate(jItems) {
		jItems.removeClass(sActiveClass);
	}
	
	/**
	 * Ouvre une entrée de menu, ce qui conduit généralement à afficher son
	 * sous-menu, lorsque ce dernier est présent.
	 * 
	 * @param	jQuery	j	Une ou plusieurs entrée(s) de menu.
	 */	
	function open(jItems) {
		jItems.addClass(sOpenClass);
	}
	
	/**
	 * Ferme une entrée de menu, cachant son éventuel sous-menu.
	 * 
	 * @param	jQuery	j	Une ou plusieurs entrée(s) de menu.
	 */	
	function close(jItems) {
		jItems.removeClass(sOpenClass);
	}
	
	/**
	 * Désactive et ferme (le cas échéant) toutes les entrées de menu.
	 */
	function deactivateAndCloseAllItems() {
		
		var jAllTopItems = $("." + sTopClass + " ." + sTopItemClass);
		close(jAllTopItems);
		
		var jAllItems = jAllTopItems.add("." + sTopClass + " ." + sSubItemClass);
		deactivate(jAllItems);
	}
	
	/**
	 * Fournit l'entrée de menu de niveau 1 qui doit être activée par défaut
	 * sur la page actuelle.
	 * 
	 * @return	jQuery	Une entrée de menu de niveau 1, ou <code>null</code>.
	 */	
	function getDefaultActiveTopItem() {
		
		if (typeof _jDefaultActiveTopItem === "undefined") {
			
			if (typeof $_info.pathIds !== "undefined" && $_info.pathIds.length > 1) {
				
				_jDefaultActiveTopItem = $(
					"." + sTopClass + " ." + sLinkClassPrefix + $_info.pathIds[1]
				).closest("." + sTopItemClass);
			}
			else {
				_jDefaultActiveTopItem = null;
			}
		}
		
		return _jDefaultActiveTopItem;
	}
	
	/**
	 * Active l'entrée de menu de niveau 1 qui doit être activée par défaut
	 * sur la page actuelle.
	 */
	function activateDefaultTopItem() {
		
		var jItem = getDefaultActiveTopItem();
		
		if (!!jItem) { 
			activate(jItem);
		}
	}
	
	/**
	 * Réinitialise le menu.
	 */
	function reset() {
		
		deactivateAndCloseAllItems();
		activateDefaultTopItem();
	}
	
	/**
	 * (Re)met en place une réinitialisation différée du menu.
	 */
	function setResetTimeout() {
		
		clearResetTimeout();
		
		rResetTimeout = setTimeout(function() {
			reset();
			rResetTimeout = null;
		}, iResetTimeoutDuration);
	}
	
	/**
	 * Annule toute réinitialisation différée du menu.
	 */
	function clearResetTimeout() {
		
		if (rResetTimeout !== null) {
			clearTimeout(rResetTimeout);
		}
	}
	
	/**
	 * Réponse au début de l'intéraction de l'utilisateur avec une entrée de
	 * menu de niveau 1. 
	 */
	function onHoverInTopItem() {
		
		var jItem = $(this);
		
		clearResetTimeout();
		deactivateAndCloseAllItems();
		activate(jItem);
		open(jItem);
	}
	
	/**
	 * Réponse à la fin de l'intéraction de l'utilisateur avec une entrée de
	 * menu de niveau 1. 
	 */
	function onHoverOutTopItem() {		
		setResetTimeout();
	}
	
	/**
	 * Réponse au début de l'intéraction de l'utilisateur avec une entrée de
	 * menu de niveau 2.
	 */
	function onHoverInSubItem() {
		
		var jItem = $(this);
		activate(jItem);
	}
	
	/**
	 * Réponse à la fin de l'intéraction de l'utilisateur avec une entrée de
	 * menu de niveau 2.
	 */
	function onHoverOutSubItem() {
		
		var jItem = $(this);
		deactivate(jItem);
	}
	
	/**
	 * Mise en place au chargement de la page.
	 */	
	$(document).ready(function() {
		
		// Sélectionne une entrée de menu de niveau 1 par défaut, le cas
		// échéant.
		
		activateDefaultTopItem();
		
		// Mise en place des intéractions avec les entrées de menu.
		
		$("." + sTopClass + " ." + sTopItemClass).hover(
			onHoverInTopItem, onHoverOutTopItem
		);
		
		$("." + sTopClass + " ." + sSubItemClass).hover(
			onHoverInSubItem, onHoverOutSubItem
		);
		
		// Réglage d'opacité multi-navigateurs.
		
		// $("." + sTopClass + " ." + sSubClass).css("opacity", dSubOpacity);
	});
})
(jQuery);