jQuery(document).ready(function($) {

	var dont_close=false;
	var timeout =  null;
	
	/* On stoppe la programmation de fermeture du menu */
	function stopClose() {
		if (timeout!=null) clearTimeout(timeout);
		timeout=null;
	}
	function hideAllMenuItems() {
		stopClose();
		jQuery("div.blocsubmenu").each(function() { hideMenuItem( $(this)); });
	}
	
	function showMenuItem(submenu) {
		stopClose();
		jQuery(document).bind('click', spyclickToClose);
		$('a#'+submenu.attr('id_menu')).addClass("menuActive");
		submenu.bind('mouseout', boMenu.mouseout);
		submenu.show();
	}
	function hideMenuItem(submenu) {
		submenu.hide();
		$('a#'+submenu.attr('id_menu')).removeClass("menuActive");
		jQuery(document).unbind('click', spyclickToClose);
		submenu.unbind('mouseover', boMenu._mouseover);
		submenu.unbind('mouseout', boMenu._mouseout);
		
	}
	function refreshUi(opening, submenu) {
		hideAllMenuItems();
		if (opening) showMenuItem(submenu);
		else hideMenuItem(submenu);
	}
	function spyclickToClose(e) {
		/* si on click en dehors du document alors tant pis */
		if (e.pageX>jQuery(document).width()) return; 
		
		/* Si on est sur un menu alors tant pis */
		if (jQuery(this).closest("#menu_root").size()>0) return;
		
		/* le target est dans le menu*/
		var $target= $(e.target);
		if ($target.closest("#menu_root").size()>0) return;
		
		boMenu.hideAll();
	}

	
	
	/**
	 *
	 * @class
	 * @static
	 * @name menu
	 * @version 1.0
	 */
	"boMenu".namespace(/** @lends menu.prototype	*/ {
		/**
		 * Forcer à fermer les menus.
		 */
		hideAll: function() {
			if (dont_close) return;
			hideAllMenuItems();
		},
		/**
		 * Si on entre dans le composant, alors on annule la fermeture de la liste
		 */
		_mouseover : function() {
			stopClose();
			var item = jQuery(this).closest("div.blocsubmenu");
			if (item.size()==0) return;
			dont_close=true;
			item.unbind('mouseover', boMenu._mouseover);
		},
		/**
		 * Gestion de la disparition de la liste des options
		 * Si on sort du composant, alors on schedule la fermeture
		 * On surveille aussi tant que possible les clicks exterieurs pour fermer la liste plus rapidement
		 */
		mouseout : function(e) {
			/* si nous ne sortons pas d'un menu courant alors faisons rien */
			var item = jQuery(this).closest("div.blocsubmenu");
			if (item.size()==0) return true;
			dont_close=false;
			item.bind('mouseover', boMenu._mouseover);
			timeout = window.setTimeout(boMenu.hideAll, 10000);
			return true;
		}
	
	});
	
	var body_innerwidth= $(document).find("body").innerWidth();
	$(window).resize(function() {
		body_innerwidth= $(window).find("body").first().innerWidth();
	});
	
	/* Si on sort du browser, alors arretons de chercher à fermer le menu*/
	$(document).find("body").mouseleave(function(e) {
		dont_close=true;
	});
	/* Si on est sorti du body et que l'on revient sans passer par le menu,
	 * alors dont_close est true et il ne passera plus a false donc le menu ne se refermera pas dans le temps declaré 
	 */
	$(document).find("body").mousemove(function(e){
		/* Si le curseur va sur la scroll bar alors ne fermons plus automatiquement */
	   if (e.pageX>body_innerwidth) dont_close=true;
	   else dont_close=false;
	}); 

	jQuery("#menu #menu_root").delegate(".menuLevel1 > a", "click", function() {

		var opening = false;

		/* Il est actif alors fermons tous les menus */
		/* Sinon le menu n'est pas actif alors on veut l'ouvrir */
		if (jQuery(this).hasClass("menuActive")) opening=false;
		else opening=true;

		var submenu = jQuery("div.blocsubmenu[id_menu='"+jQuery(this).attr('id')+"']");
		if (opening && submenu.size()==0) {
			/* construisons le bloc parce qu'il n'existe pas */
			/* Notre bloc submenu n'existe pas allons le chercher */
			var pointer_a = jQuery(this);
			/* recuperons notre bloc submenu et affichons le */
			jQuery.ajax({
				async: true,
				url:boState.getContextPath()+'/bov3/common/menu/ajaxGetMenuContent.jspz',
				context: {
					aElt: pointer_a,
					code: pointer_a.attr('id')
				},
				data: { 
					code: pointer_a.attr('id'),
					form_object: boState.getFormObject(),
					form_action: boState.getFormAction()
				},
				cache: false,
				dataType: 'html',
				success: function(data) {
					/* supprimons tout ce qui pourrait être un ancien blocsubmenu */
					jQuery("div.blocsubmenu[id_menu='"+this.code+"']").remove();
					/* ajoutons le bloc */
					if (data==null) return;
					this.aElt.after( data );
					var submenu = jQuery("div.blocsubmenu[id_menu='"+this.code+"']"); 
					refreshUi(true, submenu);
				}
			});
			return false;
		}

		refreshUi(opening, submenu);
		
		return false;
	});

});
