// gestion menus déroulants
	var tree = new Array(); // table contenant les différents éléments du menu
	var img = new Array(); // table contenant les dimensions des images
	var indice = -1; // indice du tableau tree
	var indImg = -1; // indice du tableau img
	var mainDiv = null;
	var menuOver = true; // indique si un menu est actuellement en cours de "déroulement" (permet de fermer les menus déroulants)
// ====== FONCTIONS DEBOGUAGE ===============================================================================================	
	function infoTree(output) {
		var str = '';
		for(var i = 0; i < tree.length; i++) {
			str += 'i = ' + i + ' | ';
			str += 'ObjId = ' + tree[i].objId + ' | ';
			str += 'parentMenu = ' + tree[i].parentMenu + ' | ';
			str += 'parentItem = ' + tree[i].parentItem + ' | ';
			str += 'nextItem = ' + tree[i].nextItem + ' | ';
			str += 'childMenu = ' + tree[i].childMenu + ' | ';
			str += 'x = ' + tree[i].x + ' | ';
			str += 'y = ' + tree[i].y + ' | ';
			str += '\n';
		}
		if (arguments.length == 0) alert(str);
		else if (arguments[0]=='window') win.document.write(str);
	}
//	
	function infoImg(output) {
		var str = '';
		for(var i = 0; i < img.length; i++) {
			str += 'i = ' + i + ' | ';
			str += 'imgName = ' + img[i].imgName + ' | ';
			str += 'imgWidth = ' + img[i].imgWidth + ' | ';
			str += 'imgHeight = ' + img[i].imgHeight + ' | ';
			str += '\n';
		}
		if (arguments.length == 0) alert(str);
		else if (arguments[0]=='window') win.document.write(str);
	}
//	
	function trace(str) {
		win.document.write(str+'\n');
	}
// ====== FIN FONCTIONS DEBOGUAGE ===========================================================================================	
// ====== FONCTIONS TABLE IMG ===============================================================================================	
function addImg(iName, iWidth, iHeight) { // alimentation du tableau img et préchargement des images
	indImg ++;
	img[indImg] = new makeImg(iName, iWidth, iHeight);
	(new Image(iWidth,iHeight)).src = 'medias/' + iName + '_item_out.gif'; // préchargement des images
	(new Image(iWidth,iHeight)).src = 'medias/' + iName + '_item_over.gif'; // préchargement des images
}
//	
function makeImg(iName, iWidth, iHeight) { // fonction constructeur de l'objet img
	this.imgName = 'Item_' + iName;
	this.imgWidth = iWidth;
	this.imgHeight = iHeight;
}
//
	function findImg(id) { // recherche associative (retourne l'indice de l'objet id dans le tableau img
		var result = -1;
		for(var i = 0;i < img.length;i++) {
			if(img[i].imgName == id) {
				result = i;
				i = img.length;
			}
		}
		if (result == -1) alert('erreur findImg : \n id : ' + id + '\n img.length : ' + i);
		else return result;
	}
// ====== FIN FONCTIONS TABLE IMG ===========================================================================================	
// ====== FONCTIONS MENUS/ITEMS =============================================================================================
	function findObj(id) { // recherche associative (retourne l'indice de l'objet id dans le tableau tree)
		var result = -1;
		for(var i = 0;i < tree.length;i++) {
			if(tree[i].objId == id) {
				result = i;
				i = tree.length;
			}
		}
		if (result == -1) alert('erreur findObj : \n id : ' + id + '\n tree.length : ' + i);
		else return result;
	}
// 	
	function initMenu(zx,zy) {
		document.write('<DIV Id="topTree"></DIV>');
		mainDiv = document.getElementById('topTree');
		indImg ++;
		img[indImg] = new makeImg('tree',0,0);
		indice++;
		tree[indice] = new makeMenu('','top'); // stocke l'objet racine (root) dans le tableau tree
		tree[indice].nextItem = indice + 1;
		indice++;
		tree[indice] = new makeItem('','tree'); // stocke l'objet racine (root) dans le tableau tree
		tree[indice].parentMenu = indice - 1;
		tree[indice].x = zx;
		tree[indice].y = zy;
	}
// 
	function addMenu(itemName,menuName,menuOrientation) { // ajout d'un nouveau menu
		var strTemp;
		var zx, zy; // coordonnées x et y du menu
		var initItemID = 'Item_init_' + menuName;
		indice++;
		tree[indice] = new makeMenu(itemName,menuName); // stocke l'objet menu dans le tableau tree
		if (arguments.length == 3) { 
			if (arguments[2] == 'h') tree[indice].vertical = false;// menu horizontal (vertical = option par défaut)
		}
		tree[indice].parentItem = findObj('Item_'+itemName);
		tree[indice].parentMenu = tree[tree[indice].parentItem].parentMenu; // le menu parent est le même que celui de l'itemParent
		tree[findObj('Item_' + itemName)].childMenu = indice; // met à jour l'objet item qui déclenche ce menu
		if (tree[tree[indice].parentMenu].vertical) { // si le menu parent est vertical
			zx = tree[findObj('Item_' + itemName)].x + img[findImg('Item_' + itemName)].imgWidth;
			zy = tree[findObj('Item_' + itemName)].y;
		}
		else {
			zx = tree[findObj('Item_' + itemName)].x;
			zy = tree[findObj('Item_' + itemName)].y + img[findImg('Item_' + itemName)].imgHeight;
		}
		tree[indice].x = zx; // abscisse (left)
		tree[indice].y = zy; // ordonnée
		if (tree[indice].vertical) { // cas d'un menu vertical
			strTemp = '<DIV ID="'+tree[indice].objId+'" STYLE="position:absolute; left:'+tree[indice].x+'px; top:'+tree[indice].y+'px;';
			strTemp += ' z-index:1; visibility:hidden;">\n';
			strTemp += '<TABLE BORDER="0" ALIGN="left" CELLPADDING="0" CELLSPACING="0" VSPACE="0" HSPACE="0">\n';
			strTemp += '	<TBODY>\n'; 
			strTemp += '		<TR>\n'; 
			strTemp += '			<TD><IMG SRC="medias/top_item_out.gif"></TD>\n';
			strTemp += '		</TR>\n';
			strTemp += '		<TR>\n'; 
			strTemp += '			<TD ID="'+initItemID+'"></TD>\n'; 
			strTemp += '		</TR>\n'; 
			strTemp += '		<TR>\n';
			strTemp += '			<TD><IMG SRC="medias/bottom_item_out.gif"></TD>\n';
			strTemp += '		</TR>\n';
			strTemp += '	</TBODY>\n'; 
			strTemp += '</TABLE>\n';
			strTemp += '</DIV>\n';
		}
		else { // cas d'un menu horizontal
			strTemp = '<DIV ID="'+tree[indice].objId+'" STYLE="position:absolute; left:'+tree[indice].x+'px; top:'+tree[indice].y+'px;';
			strTemp += ' z-index:1; visibility:hidden;">\n';
			strTemp += '<TABLE BORDER="0" ALIGN="left" CELLPADDING="0" CELLSPACING="0" VSPACE="0" HSPACE="0">\n';
			strTemp += '	<TBODY>\n'; 
			strTemp += '		<TR>\n'; 
			strTemp += '			<TD><IMG SRC="medias/left_item_out.gif"></TD>\n'; 
			strTemp += '			<TD ID="'+initItemID+'"></TD>\n'; 
			strTemp += '			<TD><IMG SRC="medias/right_item_out.gif"></TD>\n';
			strTemp += '		</TR>\n';
			strTemp += '	</TBODY>\n';
			strTemp += '</TABLE>\n';
			strTemp += '</DIV>\n';
		}
		mainDiv.innerHTML += strTemp;
	}
//
	function addItem(menuName,itemName, urlName) {
		var zl = img[findImg('Item_' + itemName)].imgWidth;
		var zh = img[findImg('Item_' + itemName)].imgHeight;
		var strTemp;
		indice++;
		tree[indice] = new makeItem(menuName,itemName); // stocke l'objet menu dans le tableau tree
		tree[indice].parentMenu = findObj('Menu_' + menuName);
		if (tree[tree[indice].parentMenu].vertical) { // si le menu parent est vertical
			strTemp  = '<TABLE CELLPADDING="0" CELLSPACING="0" VSPACE="0" HSPACE="0">\n';
			strTemp += '	<TR>\n';
			strTemp += '		<TD ID="' + tree[indice].objId + '"><A HREF="javascript:void(handleItem(\''+itemName+'\',\'onClick\',\''+urlName+'\'))"\n';
			strTemp += '			onMouseOut="handleItem(\''+itemName+'\',\'onMouseOut\')"\n';
			strTemp += ' 			onMouseOver="handleItem(\''+itemName+'\',\'onMouseOver\')">';
			strTemp += '<IMG SRC="medias/'+itemName+'_item_out.gif" WIDTH="'+zl+'" HEIGHT="'+zh+'" BORDER="0" ALT="'+itemName+'_item_out.gif"></A></TD>\n';
			strTemp += '	</TR>\n';
			strTemp += '</TABLE>\n';
		}
		else {
			strTemp  = '<A ID="' + tree[indice].objId + '" HREF="javascript:void(handleItem(\''+itemName+'\',\'onClick\',\''+urlName+'\'))"';
			strTemp += 'onMouseOut="handleItem(\''+itemName+'\',\'onMouseOut\')"\n';
			strTemp += ' onMouseOver="handleItem(\''+itemName+'\',\'onMouseOver\')">';
			strTemp += '<IMG SRC="medias/'+itemName+'_item_out.gif" WIDTH="'+zl+'" HEIGHT="'+zh+'" BORDER="0" ALT="'+itemName+'_item_out.gif"></A>';
//			strTemp  = '<TD ID="' + tree[indice].objId + '"><A HREF="javascript:void(handleItem(\''+itemName+'\',\'onClick\'))"\n';
//			strTemp += 'onMouseOut="handleItem(\''+itemName+'\',\'onMouseOut\')"\n';
//			strTemp += ' onMouseOver="handleItem(\''+itemName+'\',\'onMouseOver\')">';
//			strTemp += '<IMG SRC="medias/'+itemName+'_item_out.gif" WIDTH="'+zl+'" HEIGHT="'+zh+'" BORDER="0" ALT="'+itemName+'_item_out.gif"></A></TD>\n';
		}
//
//		if (tree[tree[indice].parentMenu].vertical) 
		var obj = document.getElementById('Item_init_' + menuName);
		if (tree[tree[indice].parentMenu].nextItem == -1) { // nous sommes en présence du 1er item
			obj.innerHTML = strTemp;
		}
	else { // ajout d'un item supplémentaire
			obj.innerHTML += strTemp;
		}
		tree[indice].nextItem = -1;
		var last = lastItem(tree[indice].parentMenu);
		tree[last].nextItem = indice; 
//
		if (tree[tree[indice].parentMenu].vertical) {
			tree[indice].x = tree[tree[indice].parentMenu].x; // abscisse = celle du menu parent de l'item
			tree[indice].y = tree[tree[indice].parentMenu].y + calcI(tree[tree[indice].parentMenu].nextItem,tree[tree[indice].parentMenu].vertical); // ordonnée (top)
		}
		else {
			tree[indice].x = tree[tree[indice].parentMenu].x + calcI(tree[tree[indice].parentMenu].nextItem,tree[tree[indice].parentMenu].vertical); // abscisse = celle du menu parent de l'item
			tree[indice].y = tree[tree[indice].parentMenu].y; // 
		}
//		 if (document.all) {
//			  this.currentItemChild.children[1].innerHTML += strTemp;
//		 } else {
//			  this.currentItemChild.innerHTML += strTemp;
//		 }
	}
// 
	function getO() { // fonction utilisée comme méthode des objets menu et item pointant sur le code HTML correspondant
		return document.getElementById(this.objId);
	}
//
	function hideM() { // fonction permettant de masquer le menus ainsi que ses menus parents
		this.getObj().style.visibility = 'hidden';
	}
//
	function hideAllMenu(objMenu) { // fonction permettant de masquer tous les menus "enfants" de ce menu
	var obj = objMenu;
		do {
			obj = tree[obj.nextItem];
			if (obj.childMenu != -1) {
				tree[obj.childMenu].hideMenu();
				hideAllMenu(tree[obj.childMenu]);
			}
		} while (obj.nextItem != -1);
	}
//
	function showM() { // fonction permettant d'afficher le menus ainsi que ses menus parents
		this.getObj().style.visibility = 'visible';
	}
	function lastItem(itemObj) { // fonction retournant le dernier item d'un chaînage
		if(tree[itemObj].nextItem == -1) return itemObj;
		else return lastItem(tree[itemObj].nextItem);
	}
//
	function calcI(itemObj,itemVertical) {  // calcule le delta y d'un item par rapport au y du menu parent
		if (tree[itemObj].nextItem == -1) return 0;
		else {
			if (itemVertical) return img[findImg(tree[itemObj].objId)].imgHeight + calcI(tree[itemObj].nextItem,itemVertical);
			else return img[findImg(tree[itemObj].objId)].imgWidth + calcI(tree[itemObj].nextItem,itemVertical);
		}
	}
//
	function makeMenu(itemName,menuName) { // fonction constructeur de l'objet menu
		this.objId = 'Menu_' + menuName; // identifiant du menu
		this.parentMenu = -1; // nom du Menu parent
		this.nextItem = -1; // nom du 1er Item du menu
		this.parentItem = -1; // nom de l'Item parent (celui qui déclenche le menu)
		this.x = 0;
		this.y = 0;
		this.vertical = true;
		this.getObj = getO;
		this.hideMenu = hideM;
		this.showMenu = showM;
	}
//
	function makeItem(menuName,itemName) { // fonction constructeur de l'objet item
		this.objId = 'Item_' + itemName; // identifiant de l'item
		this.parentMenu = -1; // pointeur sur le menu parent (auquel appartient l'item
		this.nextItem = -1; // pointeur sur l'item suivant dans le menu
		this.childMenu = -1; // menu déclenché par l'item (si -1 pas de menu)
		this.x = 0;
		this.y = 0;
		this.getObj = getO;
	}
// 	
	function handleItem(button,event_type,url) {   //change button image depending on event
	var numItem = findObj('Item_' + button);
	var objItem = tree[numItem];
	var imgObj;
	var path = '';
	if (tree[objItem.parentMenu].vertical) imgObj=objItem.getObj().childNodes[0].childNodes[0];
	else imgObj=objItem.getObj().childNodes[0];
	var strOver = 'medias/' + button + '_item_over.gif';
	var strOut = 'medias/' + button + '_item_out.gif';
		switch (event_type) {
			case 'onClick' :
				if (url!='') {
					document.location.href=path+url;
					hideAllMenu(tree[findObj('Menu_root')]);
				}
				break;
			case 'onMouseOver' :
				menuOver = true;
				hideAllMenu(tree[objItem.parentMenu]);
				imgObj.src=strOver;
				if (objItem.childMenu != -1) {  // affichage du menu enfant s'il y en a 1
					tree[objItem.childMenu].showMenu();
				}
				break;
			case 'onMouseOut' :
				menuOver = false;
				imgObj.src=strOut;
				 break;
		}
	}
// ==========================================================================================================================
function closeMenu() { // vérifie si les menus peuvent-être fermés (suite à click en dehors d'un menu)
	if (!menuOver) {
		hideAllMenu(tree[findObj('Menu_root')]);
	}
}