/* iubito's menu - http://iubito.free.fr/prog/menu.php - configuration du javascript
revu par florent@lekod.com (www.vipere.lekod.com)

******************
*Règles générales*
******************

Les menus doivent avoir un id commençant par conteneurmenu suivi d'un nombre
Exemple
Premier menu doit IMPERATIVEMENT être conteneurmenu0
Second menu     : conteneurmenu1
troisième menu  : conteneurmenu2
....

Le premier ID d'un menu suivant doit être égal à "menu"+ le nombre de menus du précédent +1
Exemple
Le premier menu a 12 éléments
Le premier ID de menu du second menu doit être "menu13"

Faire des tableaux pour déterminer les valeurs propres à chaque menus
Si un indice de tableau est un tableau et l'autre une valeur fixe,
déclarer d'abord 2 variables à inclure ensuite dans le tableau
Exemple:
var hauteur1=[100,22,22,22,22,22,35,35,22,22,22,22];var hauteur2=0;
var hauteur_menu=[hauteur1,hauteur2];

S'il y a plus de deux menus, incorporer des else if dans la fonction Determine_indice
Exemple pour 4 menus

function Determine_indice(Id_calque)
{
if(Id_calque=="conteneurmenu0")
Indice=0;
else if(Id_calque=="conteneurmenu1")Indice=1;
else if(Id_calque=="conteneurmenu2")>-1)Indice=2;
else if(Id_calque=="conteneurmenu3")>-1)Indice=3;
else if(Id_calque.indexOf('conteneurmenu')>-1)Indice=4;
return Indice;
}
*/

/* true = le menu sera vertical, à gauche.
   false = le menu sera horizontal, en haut. */
var vertical=[true,false];

/* TRES IMPORTANT !
	Il faut mettre ici le nombre de menus, le script n'est pas capable de compter tout
	seul ! :-p Donc si votre code va jusqu'à <p id="menu5"...> il faut mettre 5. */
var nbmenu=[13,6];

/* Centrer le menu ? (true/false).
	Centre horizontalement ou verticalement suivant le mode choisi. */
var centrer_menu=[false,true];

/* On est obligé de définir une largeur pour les menus.
	Pour mettre des menus de largeurs différentes :
	var largeur_menu = new Array(largeur menu1, largeur menu2, largeur menu3...)
	Il faut faire attention à mettre autant de valeurs que de nombre de menu !
	Attention, si vous êtes en menu vertical, mettez une largeur fixe (pas de Array) !
	*/
var largeur_menu=[100,100];
/* En mode vertical, on a besoin de connaître la hauteur de chaque menu.
	Même si les "cases" ne sont pas dimensionnées en hauteur.
	Ajustez cette variable si les menus sont trop rapprochés ou espacés en vertical.
	Pour mettre des menus de hauteurs différentes :
	var hauteur_menu = new Array(hauteur menu1, hauteur menu2, hauteur menu3...)
	Il faut faire attention à mettre autant de valeurs que de nombre de menu !
	Attention, si vous êtes en menu horizontal, mettez une largeur fixe (pas de Array) !
	*/
var hauteur1=[100,22,22,22,22,22,22,22,22,22,22,22,22];var hauteur2=0;
var hauteur_menu=[hauteur1,hauteur2];
/* En mode horizontal.
	Largeur des sous-menus, pour IE uniquement, les autres navigateurs respectent la largeur
	auto. Mettez "auto" uniquement si vous êtes sûr d'avoir mis des &nbsp; à la place des
	espace dans les items !
	Pour mettre des sous-menus de largeurs différentes :
	var largeur_sous_menu = new Array(largeur1, largeur2...).
	Il faut faire attention à mettre autant de valeurs que de menus.
	Si un menu n'a pas de sous-menus, il faut mettre quand même quelque chose !
	Il est possible de mettre "auto" dans certaines colonnes, à condition de respecter la
	consigne ci-dessus.
	*/

var largeur_sous_menu=[120,120];

/* Pour les navigateurs connaissant la largeur automatique (s'adapte au contenu), cette
	option (active par défaut) permet d'avoir une largeur automatique. En cas contraire
	(false), les sous menus auront la largeur largeur_sous_menu. */
var largeur_auto_ssmenu=[false,false];

/* ... pour mettre un peu d'espace entre les menus ! */
var espace_entre_menus=[0,0];

/* position du menu par rapport au haut de l'écran ou de la page.
	0 = le menu est tout en haut. en px */
var top_menu=[2,2];
/* En version horizontale.
	position des sous-menus par rapport au haut de l'écran ou de la page. Il faut prévoir
	la hauteur des menus, donc ne pas mettre 0 et faire "à tâton". en px */
var top_ssmenu=[top_menu[0]+28,top_menu[1]+20];

/* Position gauche du menu, en px. */
var left_menu=[0,0];
/* En version verticale.
	Position des sous-menus par rapport au bord gauche de l'écran. */
var left_ssmenu=[largeur_menu[0]+1,largeur_menu[1]+200];

/* Quand la souris quitte un sous-menu, si le sous-menu disparait immédiatement,
	cela gêne l'utilisateur. Alors on peut mettre un délai avant disparition du sous-menu.
	500 ms c'est bien :-) */
var delai=150; // en milliseconde

/* En version horizontale.
	Comme le menu peut se superposer avec le texte de la page, il est possible de faire
	descendre un peu la page (on augmente la marge du haut) pour aérer un peu la page,
	une quarantaine de pixel c'est pas mal. en px*/
var marge_en_haut_de_page=[top_menu[0]+40,top_menu[1]+60];
/* En version verticale.
	On décale le document à droite pour pas que le menu le superpose. */
var marge_a_gauche_de_la_page=[largeur_menu[0]+10,largeur_menu[1]+40];

/* Mettez à true si vous souhaitez que le menu soit toujours visible.
	Mettez false si vous ne le souhaitez pas, dans ce cas le menu "disparaîtra" quand vous
	descendrez dans la page. */
var suivre_le_scroll=[true,true];

/* Pour IE uniquement, les balises <select> passent toujours au-dessus du menu, donc
	par défaut on cache les listes déroulantes quand le menu est ouvert, puis on les fait
	réapparaître à la fermeture du menu. Pour empêcher ça, mettre à false. */
var cacher_les_select=false;


var timeout; //ne pas toucher, c'est pour déclarer la variable
var agt = navigator.userAgent.toLowerCase();
var isMac = (agt.indexOf('mac') != -1);
var isOpera = (agt.indexOf("opera") != -1);
var IEver = parseInt(agt.substring(agt.indexOf('msie ') + 5));
var isIE = ((agt.indexOf('msie')!=-1 && !isOpera && (agt.indexOf('webtv')==-1)) && !isMac);
var isIE5win = (isIE && IEver == 5);
var isIE5mac = ((agt.indexOf("msie") != -1) && isMac);
var blnOk=true;
//pour enlever les "px" pour faire des calculs...
var reg = new RegExp("px", "g");

//Pour gérer plusieurs menus
var Indice=0;var Calques=new Array();var Depart=0;var Tare=0;
// onScroll pour Internet Explorer, le position:fixed fait ce boulot pour les autres navigateurs
// qui respectent les normes CSS...
window.onscroll = function()
{
for(a=0;a<Calques.length;a++)
{
Indice=Determine_indice(Calques[a].getAttribute('id'));
cumul = 0;Depart=0;
//Pour les menus suivants, on incrémente Depart du nombre de menus précédents afin d'avoir la référence au premier ID de celui-ci
for(i=0;i<Indice;i++) Depart+=nbmenu[i];Depart+=1;
//Pour un menu, l'ID 1 correspond à l'élément 0. Or, pour les menus suivants, le premier indice est égal au N° d'ID. On créé une tare pour la bonne exécution du code
Tare=(Indice>0?Depart-1:0);
	if (blnOk && suivre_le_scroll[Indice] && (isIE || isIE5mac))
	{
		if (isIE5mac) Calque_visible("hidden");
                for(i=Depart;i<Depart+nbmenu[Indice];i++)
                {
			if (!vertical[Indice]) {
				document.getElementById("menu"+i).style.top = document.body.scrollTop + top_menu[Indice] + "px";
				if (document.getElementById("ssmenu"+i))
					document.getElementById("ssmenu"+i).style.top = document.body.scrollTop + top_ssmenu[Indice] + "px";
			} else {
				document.getElementById("menu"+i).style.top = document.body.scrollTop
							+(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+top_menu[Indice])+"px";
				if (document.getElementById("ssmenu"+i))//undefined
					document.getElementById("ssmenu"+i).style.top = document.body.scrollTop
							+(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+top_menu[Indice])+"px";
				cumul += isFinite(hauteur_menu[Indice])?hauteur_menu[Indice]:hauteur_menu[Indice][i-Tare-1];
			}
		}
		if (isIE5mac) Calque_visible("visible");
	}
}
}
function Calque_visible(Etat)
{
        for(a=0;a<Calques.length;a++)
        {
        if (Calques[a].getAttribute('id').lastIndexOf('conteneurmenu')==0) document.getElementById(Calques[a].getAttribute('id')).style.visibility=Etat;
        }
}

function Chargement() {
Calques=document.getElementsByTagName('div');
Calque_visible('hidden');
if(document.body)  //Pour éviter un message d'erreur javascript. Pourquoi ? Mystère
{

with(document.body.style)
{
 for(b=0;b<vertical.length;b++)
 /*On ne garde pour les marge que les valeurs les plus élevées*/
 {
  if (!vertical[b])
  {
  if(marge_en_haut_de_page[b]>marge_en_haut_de_page[b-1]||b-1<0)marginTop=marge_en_haut_de_page[b]+"px";
  }
  else
  {
  if(marge_a_gauche_de_la_page[b]>marge_a_gauche_de_la_page[b-1]||b-1<0)marginLeft=marge_a_gauche_de_la_page[b]+"px";
  }
 }
}
}
for(a=0;a<Calques.length;a++)
{
if (Calques[a].getAttribute('id').indexOf('conteneurmenu')>-1)
{
Indice=Determine_indice(Calques[a].getAttribute('id'));
Le_calque=document.getElementById(Calques[a].getAttribute('id'));
	if (!blnOk) {
		if(document.body.style.backgroundColor!="") { blnOk=false; }
		if(document.body.style.color!="") { blnOk=false; }
		if(document.body.style.marginTop!="") { blnOk=false; }
		if(document.getElementById) {
			with(Le_calque.style) {
				if(position!="" || top!="" || left!=""
						|| width!="" || height!="" || zIndex!=""
						|| margin!="" || visibility!="") {
					blnOk=false;
				}
			}
		}
		else{
			blnOk=false;
		}
	}

	if(blnOk)
	{
		Le_calque.style.visibility="hidden";
		trimespaces();
		positionne();
		CacherMenus();
	}

	// comme on a évité le clignotement, maintenant on fait apparaître le menu ;-)
	Le_calque.style.visibility="visible";
}
}
}
window.onresize = Chargement();

function Determine_indice(Id_calque)
{
//En fonction du calque, on détermine les propriétés se référant à ce dernier dans les éléments des tableaux de déclaration de variables
if(Id_calque=="conteneurmenu0")
Indice=0;
else if(Id_calque.indexOf('conteneurmenu')>-1)Indice=1;
return Indice;
}
/*
 * Place les éléments du menu correctement, au chargement, au scroll, au redimensionnement
 * de la fenêtre
 */
function positionne() {
var largeur_fenetre = (isIE?document.body.clientWidth:window.innerWidth);
var hauteur_fenetre = (isIE?document.body.clientHeight:window.innerHeight);
var largeur_totale;var hauteur_totale;
var cumul = 0;Depart=0;
//Pour les menus suivants, on incrémente Depart du nombre de menus précédents afin d'avoir la référence au premier ID de celui-ci
for(i=0;i<Indice;i++) Depart+=nbmenu[i];Depart+=1;
//Pour un menu, l'ID 1 correspond à l'élément 0. Or, pour les menus suivants, le premier indice est égal au N° d'ID. On créé une tare pour la bonne exécution du code
Tare=(Indice>0?Depart-1:0);

if (centrer_menu[Indice]) {
  if (!vertical[Indice]) { //On prend la valeur absolue au cas où l'on mette des valeurs négatives pour l'espace entre les menus
  largeur_totale = Math.abs(espace_entre_menus[Indice]) * (nbmenu[Indice]-1);
    if (isFinite(largeur_menu[Indice]))
    largeur_totale += largeur_menu[Indice] * nbmenu[Indice];
    else {
    for (i = 1; i <= nbmenu[Indice]; i++) largeur_totale += largeur_menu[Indice][i-1];
    }
  left_menu[Indice] = (largeur_fenetre - largeur_totale)/2;
}
else {
hauteur_totale = espace_entre_menus[Indice] * (nbmenu[Indice]-1);
    if (isFinite(hauteur_menu[Indice]))
    hauteur_totale += hauteur_menu[Indice]* nbmenu[Indice];
    else {
    for (i = 1; i < nbmenu[Indice]; i++) hauteur_totale += hauteur_menu[Indice][i-1];
    }
top_menu[Indice] = (hauteur_fenetre - hauteur_totale)/2;
}
}
//Menus
for(i=Depart;i<Depart+nbmenu[Indice];i++)
{
		with(document.getElementById("menu"+i).style)
                {
			if (!vertical[Indice]) {
				top=top_menu[Indice]+"px";
				left=(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+left_menu[Indice])+"px";
                                }
                                else {
				top=(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+top_menu[Indice])+"px";
				left=left_menu[Indice]+"px";
			}
			if (!suivre_le_scroll[Indice] || isIE || isIE5mac)
				position="absolute";
			else position="fixed";
			margin="0";
			zIndex="2";
			width=isFinite(largeur_menu[Indice]) ? largeur_menu[Indice]+"px":largeur_menu[Indice][i-Tare-1]+"px";
			if ((!vertical[Indice] && isFinite(largeur_menu[Indice])) || (vertical[Indice] && isFinite(hauteur_menu[Indice])))
                        {
				cumul += (!vertical[Indice]?largeur_menu[Indice]:hauteur_menu[Indice]);
			}
			else {
				cumul +=(!vertical[Indice]?largeur_menu[Indice][i-Tare-1]:hauteur_menu[Indice][i-Tare-1]);
                                if (vertical[Indice]) height=hauteur_menu[Indice][i-Tare-1]+"px";
			}
		}
}

	//Sous-menus
        cumul = 0;
        for(i=Depart;i<Depart+nbmenu[Indice];i++) {
		if (document.getElementById("ssmenu"+i))//undefined
		{
			with(document.getElementById("ssmenu"+i).style) {
				if (!suivre_le_scroll[Indice] || isIE || isIE5mac)
					position="absolute";
				else position="fixed";
				if (!vertical[Indice]) {
					top=top_ssmenu[Indice]+"px";
					left=(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+left_menu[Indice])+"px";
				} else {
					left=left_ssmenu[Indice]+"px";
					top=(((i-Tare-1)*espace_entre_menus[Indice])+cumul+1+top_menu[Indice])+"px";
				}
				if (isIE || isOpera || isIE5mac || !largeur_auto_ssmenu[Indice][i-Tare-1]) {
					if (isFinite(largeur_sous_menu[Indice]))
						width = largeur_sous_menu[Indice]+(largeur_sous_menu[Indice]!="auto"?"px":"");
					else
						width = largeur_sous_menu[Indice][i-Tare-1]+(largeur_sous_menu[Indice][i-Tare-1]!="auto"?"px":"");
				}
				else width = "auto";
				if (!vertical[Indice] && !isIE5mac) {
					//repositionnement si déborde à droite
					if ((width != "auto")
						&& ((left.replace(reg,'').valueOf()*1 + width.replace(reg,'').valueOf()*1) > largeur_fenetre))
						left = (largeur_fenetre-width.replace(reg,'').valueOf())+"px";
				}
				margin="0";
				zIndex="3";
			}
		}
		if ((!vertical[Indice] && isFinite(largeur_menu[Indice])) || (vertical[Indice] && isFinite(hauteur_menu[Indice]))) {
			cumul += (!vertical[Indice]?largeur_menu[Indice]:hauteur_menu[Indice]);
		}
		else {
			cumul += (!vertical[Indice]?largeur_menu[Indice][i-Tare-1]:hauteur_menu[Indice][i-Tare-1]);
		}
	}
}


function MontrerMenu(strMenu) {
	if(blnOk) {
		AnnulerCacher();
		CacherMenus();
		if (document.getElementById(strMenu))//undefined
			with (document.getElementById(strMenu).style)
				visibility="visible";
	}
	SelectVisible("hidden",document.getElementsByTagName('select'));
}

function CacherDelai() {
	if (blnOk) {
		timeout = setTimeout('CacherMenus()',delai);
	}
}
function AnnulerCacher() {
	if (blnOk && timeout) {
		clearTimeout(timeout);
	}
}
function CacherMenus() {
var Total_menus=0;
	if(blnOk) {
 //On calcule la somme total de menus
 for(i=0;i<nbmenu.length;i++) Total_menus+=nbmenu[i];
		for(i=1;i<=Total_menus;i++) {
			if (document.getElementById("ssmenu"+i))//undefined
				with(document.getElementById("ssmenu"+i).style)
					visibility="hidden";
		}
	}
	SelectVisible("visible",document.getElementsByTagName('select'));
}

function trimespaces() {
	//Contourne un bug d'IE5/win... il ne capte pas bien les css pour les <li>, donc on les vire !
	if(blnOk&&isIE5win) {
		for(i=1;i<=nbmenu[Indice];i++) {
			if (document.getElementById("ssmenu"+i))//undefined
				with(document.getElementById("ssmenu"+i))
					innerHTML = innerHTML.replace(/<LI>|<\/LI>/g,"");
		}
	}
}

function SelectVisible(v,elem) {
	if (blnOk && cacher_les_select && (isIE||isIE5win))
		for (var i=0;i<elem.length;i++) elem[i].style.visibility=v;
}
