var delaiAvantDeCacher = 150; // délai en milisecondes avant que le menu disparaisse lorsqu'on quitte sa zone
var largeurSousMenu = 150; // largeur en pixel des sous-menus
var idTimer, div2eNiveau, div3eNiveau, g_noMenu, g_sousMenu, g_stopSurvol, imgs = new Array();

/* Mouchard de détection des navigateurs 
 *  - Mets les variables os[Plateforme] et nav[Navigateur] à true selon ce que l'usager utilise
 */
var osWindows, osMac, navExplorer, navNetscape, navMozilla, navOpera;
if (navigator.appVersion.indexOf("Windows") > -1) osWindows = true;
if (navigator.appVersion.indexOf("Mac") > -1) osMac = true;
if (navigator.userAgent.indexOf("Opera") > -1) navOpera = true;
if (((navigator.userAgent.indexOf("Explorer") > -1) || (navigator.userAgent.indexOf("MSIE") > -1)) && (!navOpera)) navExplorer = true;
if (navigator.userAgent.indexOf("Netscape") > -1) navNetscape = true;
if ((((navigator.userAgent.indexOf("Mozilla") > -1) && (!navExplorer) && (!navOpera) && (!navNetscape)))) navMozilla = true;

/* gererSousMenus()
 *  - Active le code javascript nécéssaire au fonctionnement des sous-menus
 */
function gererSousMenus() {
	prechargerImages("navig/fond.gif", "navig/fleche.gif" ,"navig/img_menu_01.gif", "navig/img_menu_02.gif", "navig/img_menu_03.gif", "navig/img_menu_04.gif", "navig/img_menu_05.gif", "navig/img_menu_06.gif");
	elemNavig = document.getElementById("navigRacine");
	appliquerSurvol(elemNavig);
}

/* appliquerSurvol(élément html)
 *  - Vérifie le ID des balises LI enfant de l'élément reçu en argument. Si un DIV de sous-menu associé
 *    est existant, des événements onmouseover/onmouseout sont ajoutés aux A qui affiche le sous-menu. La
 *    fonction est ensuite appellée récursivement pour s'appliquer au sous-menu qui a été trouvé (et ainsi
 *    de suite)
 */
function appliquerSurvol(element) {
	var i, j, noMenu, enfant, enfantDiv, enfantDivList, enfantLien;

	appliquerTimer(element);

	if (element) {
		for (i=0; i<element.childNodes.length; i++) {
			enfant = element.childNodes[i];
			if (enfant.nodeName == "LI") {
				if (enfant.id.indexOf("mnu") >= 0) {
					noMenu = enfant.id.replace("mnu", "");
					enfantDiv = document.getElementById("mnu" + noMenu + "div");
					if (enfantDiv) {
						//alert("enfant existant: " + "mnu" + noMenu + "div");

						// applique les événements onmouseover/onmouseout aux liens
						for (j=0; j<enfant.childNodes.length; j++) {
							enfantLien = enfant.childNodes[j];
							if (enfantLien.nodeName == "A") {
								enfantLien.onmouseover = survolMenuOver;
								enfantLien.onmouseout = survolMenuOut;
							}
						}

						// trouve la liste enfant et lui applique cette fonction de facon récursive
						for (j=0; j<enfantDiv.childNodes.length; j++) {
							enfantDivListe = enfantDiv.childNodes[j];
							if (enfantDivListe.nodeName == "UL") {
								appliquerSurvol(enfantDivListe);
							}
						}
					}
				}
			}
		}
	}
}

/* appliquerTimer(élément html)
 *  - Applique les événements onmouseover/onmouseout aux balises A enfants afin de leur permettre de faire appel
 *    aux fonctions timerMenuOver()/timerMenuOut() qui gère la fermeture des sous-menus lorsqu'on quitte leur zone
 */
function appliquerTimer(element) {
	var i, j, enfant, enfantLien;

	if (element) {
		for (i=0; i<element.childNodes.length; i++) {
			enfant = element.childNodes[i];
			if (enfant.nodeName == "LI") {
				for (j=0; j<enfant.childNodes.length; j++) {
					enfantLien = enfant.childNodes[j];
					if (enfantLien.nodeName == "A") {
						enfantLien.onmouseover = timerMenuOver;
						enfantLien.onmouseout = timerMenuOut;		
					}
				}
			}
		}
	}
}

/* obtenirNoMenu(élément html)
 *  - Retourne le ID du premier LI parent
 */
function obtenirNoMenu(element) {
	pere = element.parentNode; // note: ne pas appeller la variable "parent", cela entre en conflit avec IE
	while (pere.nodeName != "LI") {
		pere = pere.parentNode;
	}

	if (pere.id == "") {
		pere = element.parentNode;
		while (pere.nodeName != "DIV") {
			pere = pere.parentNode;
		}	
	}

	return pere.id;
}

/* obtenirNiveauMenu(no du menu)
 *  - Retourne le niveau (2 ou 3) du menu reçu en argument
 */
function obtenirNiveauMenu(noMenu) {
	if (noMenu.indexOf("_") >= 0) {
		return 3;
	} else {
		return 2;		
	}
}

/* survolMenuOver()
 *  - Fait apparaître le DIV associé à un sous-menu
 */
function survolMenuOver() {
	noMenu = obtenirNoMenu(this);
	nivMenu = obtenirNiveauMenu(noMenu);
	if (nivMenu == 2) { cacherMenu(); g_noMenu = noMenu; }
	x = obtenirX(this);
	y = obtenirY(this);

	pere = document.getElementById(noMenu);
	g_stopSurvol = false;

	div = document.getElementById(noMenu + "div");

	if (g_sousMenu) g_sousMenu.className = "";

	// menu de 2e niveau
	if (nivMenu == 2) {
		//cacherMenu();
		if (pere) pere.className = "survol";
		div2eNiveau = div;
		if (osMac && navExplorer) {
			div.style.left = x-1 + "px";
			div.style.top = y + 34 + "px";
		} else {
			div.style.left = x - 1 + "px";
			div.style.top = y + 44 + "px";
		}
	}

	// menu de 3e niveau
	if (nivMenu == 3) {
		this.className = "survol";
		g_sousMenu = this;
		noMenu = parseInt(noMenu.replace("mnu", "").replace("div","").replace("_",""));
		if (div3eNiveau) div3eNiveau.style.visibility = "hidden";
		div3eNiveau = div;
		div.style.zIndex = 3;

		// dernier menu, on fait apparaître le sous-menu à droite
		taille = x + largeurSousMenu + 125;
		if (taille > obtenirLargeurFenetre()) {
			if (osMac) {
			 // bug dans IE5mac/safari lorsque le menu est à droite, on replace légèrement à gauche
				div.style.left = x + 40 + "px";
			} else {
				div.style.left = x - 135 + "px";
			}

		// menu régulier, on fait apparaître le sous-menu à gauche
		} else {
			div.style.left = x + 125 + "px";
		}
		if (osMac && navExplorer) {
			// bug dans IE5mac qui fait apparaître les menus trop haut, on le redescend
			div.style.top = y - 1 + "px";
		} else {
			div.style.top = y - 1 + "px";	
		}
	}

	div.style.visibility = "visible"

	clearTimeout(idTimer);
}

/* survolMenuOver()
 *  - Raccourci vers timerMenuOut(), appellé lorsqu'on quitte la zone de survol des menus déployant un sous-menu, 
 */
function survolMenuOut() {
	g_stopSurvol = true;
	timerMenuOut();
}

/* timerMenuOver()
 *  - Arrête le timer au survol d'une zone de menu. Si on survol une nouvelle zone et qu'un sous-menu est
 *    déployé, on cache ce dernier.
 */
function timerMenuOver() {
	noMenu = obtenirNoMenu(this);
	nivMenu = obtenirNiveauMenu(noMenu);

	if (nivMenu == 2) {
		if (div3eNiveau) div3eNiveau.style.visibility = "hidden";
		if (g_sousMenu) g_sousMenu.className = "";
	}
	clearTimeout(idTimer);
}

/* timerMenuOut()
 *  - Démarre le timer cachant les menus. Appelé lorsqu'on quitte la zone de survol des menus
 */
function timerMenuOut() {
	idTimer = setTimeout('cacherMenu()', delaiAvantDeCacher);
}

/* cacherMenu()
 *  - Cache tous les sous-menus déployés
 */
function cacherMenu() {
	if (div2eNiveau) div2eNiveau.style.visibility = "hidden";
	if (div3eNiveau) div3eNiveau.style.visibility = "hidden";

	//alert(g_nivMenu);
	if (g_stopSurvol) {
		pere = document.getElementById(g_noMenu);
		if (pere) pere.className = "";
	}
}

/* obtenirX(élément html)
 *  - Retourne la coordonnée X d'un élément
 */
function obtenirX (element) {
	var o = element;
	var x = o.offsetLeft; while(o = o.offsetParent) x += o.offsetLeft;
	return x;
}

/* obtenirY(élément html)
 *  - Retourne la coordonnée Y d'un élément
 */
function obtenirY (element) {
	var o = element;
	var y = o.offsetTop; while(o = o.offsetParent) y += o.offsetTop;
	return y;
}

/* obtenirLargeurFenetre()
 *   - Retourne la largeur de la fenêtre du navigateur, ou la largeur entière de l'écran si il est impossible de la détecter
 */
function obtenirLargeurFenetre() {
	var x;

	// Internet Explorer
	if (document.all && document.getElementById) {
		x = document.body.offsetWidth;
	}

	// Autres navigateurs
	else {
		x = window.innerWidth;
	}

	if (!x) {
		x = screen.width;
	}

	return x;
}