// Menus
// Auteur : Eric Quillévéré 
// 04/11/2008
/*jsl:import 1-effets.js */
/*jsl:import divers.js */
var menu_Actuel=null;
var menu_zIndex=100;
var listeMenusEnCoursSuppr=Array(); // Menus en cours d'effacement
var listeMenusEnCoursAff=Array(); // Menus en cours d'affichage


function menu_Affiche(objAppelant, idMenu)
	{
	var objMenu=objet_Renvoie(idMenu);
	if (menu_Actuel==idMenu) 
		{
		// Menu actuellement affiché : on enlève l'éventuel suppression
		if (objMenu.timeoutMenu)
			{
			clearTimeout(objMenu.timeoutMenu);
			objMenu.timeoutMenu=null;
			}
		return; // Menu déjà affiché
		}
	if (tab_Recherche(listeMenusEnCoursAff, idMenu)!==null) return; // Menu en cours d'affichage
	
	
	if (objMenu)
		{
		var hauteur;
		var infosPosApp=objet_PositionAbsolue(objAppelant);
		
		// Calcule la taille la première fois
		if (!objMenu.hauteur)
			{
			var infosTaille=objet_TailleRenvoie(objMenu);
			hauteur=infosTaille.hauteur;
			objMenu.hauteur=hauteur;
			objMenu.style.height='2px';
			// Fixe la position gauche
			objMenu.style.left=infosPosApp.gauche+'px';

			// Calcule le décalage
			var temps=8;
			var decalage=(hauteur/temps)+1;
			objMenu.decalage=decalage;
			}
			
		// Menu en cours d'effacement ?
		if (tab_Recherche(listeMenusEnCoursSuppr, idMenu)!==null)
			{
			// Appelle la méthode de fin
			clearTimeout(objMenu.timeoutEffet);
			objMenu.fonctionApresFin();
			}			
		
		// Ferme les autres menus
		menu_FermeTous();

		// Style sur le nom du menu
		objMenu.objAppelant=objAppelant;
		menu_StyleMenu(idMenu, true);

		
		listeMenusEnCoursAff.push(idMenu);
		new Effet(idMenu, 'Deroulant', Array(0,objMenu.decalage, objMenu.hauteur,  0, false,10), null, 
			function()
				{
				tab_Supprime(listeMenusEnCoursAff,idMenu);
				});	
		// Cache le menu si quitte le nom
		objAppelant.onmouseout=function()
			{menu_AffecteTimeout(idMenu, 700);	};
		// Cache le menu si quitte le cadre
		objMenu.onmouseout=function()	
			{menu_AffecteTimeout(idMenu, 700);	};
			

		// Réitère le timeout
		objMenu.onmouseover=function()
			{ 
			clearTimeout(objMenu.timeoutMenu);
			};
	
		menu_zIndex++;
		objMenu.style.zIndex=menu_zIndex;

		menu_Actuel=idMenu;
		}
	
	
	}
	
// Style sur le nom du menu
function menu_StyleMenu(idMenu, estSelectionne)
	{
	
	var objMenu=objet_Renvoie(idMenu);
	if (objMenu)		
		{	
		var classe=objMenu.objAppelant.className;
		if (estSelectionne)
			{
			if (classe=='li_menu_suiv')
				classe='li_menu_suiv_sel';
			else if (classe=='li_menu_prem')
				classe='li_menu_prem_sel';
			}
		else
			{
			if (classe=='li_menu_suiv_sel')
				classe='li_menu_suiv';
			else if (classe=='li_menu_prem_sel')
				classe='li_menu_prem';
			}
		objMenu.objAppelant.className=classe;
		}
		
	}	
	
	
// Ferme tous les menus immédiatement
function menu_FermeTous()
	{
	// Ferme les menus en cours d'affichage
	while (listeMenusEnCoursAff.length>0)
		{
		var idMenu=listeMenusEnCoursAff[0];
		
		var objMenu=objet_Renvoie(idMenu);
		if (objMenu)		
			{
			clearTimeout(objMenu.timeoutEffet); // Timeout de l'effet
			objMenu.fonctionApresFin();
			menu_Effacer(idMenu);
			}
		}		
	
	// Ferme le menu actuel	
	if (menu_Actuel!==null)
		{
		objMenu=objet_Renvoie(menu_Actuel);
		if (objMenu)		
			{
			menu_Effacer(menu_Actuel);
			}
		}	
	
	}
	
// Affecte un timeout de fin d'affichage
function menu_AffecteTimeout(idMenu, temps)
	{
	var objMenu=objet_Renvoie(idMenu);
	if (objMenu)
		{	
		// Efface le timeout précédent
		if (objMenu.timeoutMenu)
			clearTimeout(objMenu.timeoutMenu);
		
		var timeoutMenu=setTimeout('menu_Effacer(\'' + idMenu + '\')',temps);
		objMenu.timeoutMenu=timeoutMenu;
		}
	}
	
// Efface le menu	
function menu_Effacer(idMenu)
	{
	if (menu_Actuel==idMenu) menu_Actuel=null;
	if (tab_Recherche(listeMenusEnCoursSuppr,idMenu)!==null) return;
	
	
	var objMenu=objet_Renvoie(idMenu);
	if (objMenu)
		{	
		// Efface le timeout précédent
		if (objMenu.timeoutMenu)
			clearTimeout(objMenu.timeoutMenu);		
		
		// Si menu en cours d'affichage, force la fin
		if (tab_Recherche(listeMenusEnCoursAff,idMenu)!==null)
			{
			clearTimeout(objMenu.timeoutEffet);
			objMenu.fonctionApresFin();
			}
			
		// Change le style
		menu_StyleMenu(idMenu, false);
		
		listeMenusEnCoursSuppr.push(idMenu); // Menu en cours d'effacement
		new Effet(idMenu, 'Deroulant', Array(1,objMenu.decalage, 10,  0, false,10), null,
			function()
				{
				objMenu.style.visibility='hidden';		
				tab_Supprime(listeMenusEnCoursSuppr, idMenu);
				
				}
			);
		}
		
	}




// Renvoie la position d'un élément
function objet_PositionAbsolue(objet)
	{
	var posGauche = 0;
	var posHaut  = 0;

	while (objet.parentNode)
		{
		posGauche += objet.offsetLeft - objet.scrollLeft;
		posHaut += objet.offsetTop - objet.scrollTop;

		objet= objet.parentNode;
		}		
	return {gauche:posGauche, haut:posHaut};
	}	


	
// Renvoie hauteur/largeur d'un élément
function objet_TailleRenvoie(objet)
	{
	return {hauteur:objet.offsetHeight, 
		largeur:objet.offsetWidth, 
		haut:objet.offsetTop,
		gauche:objet.offsetLeft};
	}		
	
		
	

// Retire une donnée d'un tableau
function tab_Supprime(tab, donnee)
	{
	var Trouve=false;
	var i=0;
	while (i<tab.length && !Trouve)
		{
		if (tab[i]==donnee)
			Trouve=true;
		else
			i++;
		}	
	if (Trouve) tab.splice(i,1);
	return tab;
	}	
	
// Renvoie la position de la donnée dans le tableau (null si non trouvée)
function tab_Recherche(tab, donnee)
	{
	var i=0;
	while (i<tab.length)
		{
		if (tab[i]==donnee)
			return i;
		else
			i++;
		}
	return null;
	}	
