// ########################################################################################################
// ########################################################################################################
// ########################################################################################################
// ########################################################################################################

// Le menu de navigation fonctionne de 2 façons en fonction des types de navigateurs :

//			- Pour Internet Explorer (script dans ce fichier)
					// C'est le script d'origine qui s'execute. Les calques des sous-menus se positionnent au fur et à mesure
					// de leur apparition avec la souris. Pour les positionner, le script utilise offsetTop et offsetLeft
					// pour récupérer les dimensions des calques parents
					
//			- Pour Safari (script dans ce fichier + à la fin de 'index.php')
					// Safari detecte les coordonnées d'un HTMLElement avec offsetTop ou offsetLeft que 
					// si celui-ci est un <DIV>. Seulement, Le script initial l'utilise aussi pour des <TABLE>,<TR>...
					// Normalement, Le script positionne les calques au fur et à mesures qu'on les fait apparaitre avec
					// le curseur de la souris. Pour Mac, j'ai desactivé cette fonction, on attends que tous le script
					// s'execute et on repositionne ensuite les calques avec le script situé en fin de 'index.php'
					// Je recupère les informations sur les calques (et notamment leur lien de parenté) grâce à un tableau
					// nommé 't_arbre_id_de_menu_cms' que j'ai construit au fur et à mesure de la construction des calques
					// eux-mêmes (cf. function cmDrawSubMenu()).
					
//	Tester sur :
//					---------------------------------------------------------------------------------
//					PC :
//					---------------------------------------------------------------------------------
//					Internet Explorer 4.0			=> NON (rien ne s'affiche)
//					Internet Explorer 5.0			=> OUI 
//					Internet Explorer 6.0			=> OUI 
//					FireFox	1.0						=> OUI 
//					Mozilla	1.7 					=> OUI 
//					Opera 7.52						=> OUI 
//					Opera 8.01						=> OUI 
//					Netscape 4.0					=> NON (rien en s'affiche)
//					Netscape 4.5					=> NON (rien en s'affiche)
//					Netscape 6.0					=> OUI 
//					Netscape 7.0					=> OUI 
//					Netscape 7.1					=> OUI 
//					---------------------------------------------------------------------------------
//					MAC :
//					---------------------------------------------------------------------------------
//					Safari 1.2						=> OUI 
//					Safari 312						=> NON (les sous-menu de profondeur 2 sont décalés)
//					Firefox 1.5						=> NON (les sous-menu de profondeur 2 sont décalés)
//					IE 5.2							=> NON (les sous-menu de profondeur 1 sont décalés)
//					Camino 0.8						=> NON (les sous-menu de profondeur 3 sont décalés)
//					---------------------------------------------------------------------------------
//					LINUX :
//					---------------------------------------------------------------------------------
//					Konqueror 3.2.3 				=> NON (les sous-menu de profondeur 1 sont décalés)
//					Mozilla 1.7.2 					=> OUI 

// ########################################################################################################
// ########################################################################################################
// ########################################################################################################
// ########################################################################################################

// *******************************************************************************
// Variables globales
// *******************************************************************************
var _cmIDCount = 0;
var _cmIDName = 'cmSubMenuID';		// for creating submenu id

var _cmTimeOut = null;			// how long the menu would stay
var _cmCurrentItem = null;		// the current menu item being selected;

var _cmNoAction = new Object ();	// indicate that the item cannot be hovered.
var _cmSplit = new Object ();		// indicate that the item is a menu split

var _cmItemList = new Array ();		// a simple list of items

var marge_entre_rubrique = "padding-left:5px;padding-right:5px;";

// *******************************************************************************
// Propriétés d'un noeud par défaut
// *******************************************************************************
var _cmNodeProperties =
{
  	// main menu display attributes
  	//
  	// Note.  When the menu bar is horizontal,
  	// mainFolderLeft and mainFolderRight are
  	// put in <span></span>.  When the menu
  	// bar is vertical, they would be put in
  	// a separate TD cell.

  	// HTML code to the left of the folder item
  	mainFolderLeft: '',
  	// HTML code to the right of the folder item
  	mainFolderRight: '',
	// HTML code to the left of the regular item
	mainItemLeft: '',
	// HTML code to the right of the regular item
	mainItemRight: '',

	// sub menu display attributes

	// HTML code to the left of the folder item
	folderLeft: '',
	// HTML code to the right of the folder item
	folderRight: '',
	// HTML code to the left of the regular item
	itemLeft: '',
	// HTML code to the right of the regular item
	itemRight: '',
	// cell spacing for main menu
	mainSpacing: 0,
	// cell spacing for sub menus
	subSpacing: 0,
	// auto dispear time for submenus in milli-seconds
	delay: 500
};


// *******************************************************************************
// Génére un ID unique
// *******************************************************************************
function cmNewID ()
{
	return _cmIDName + (++_cmIDCount);
}

// *******************************************************************************
// Retourne une chaine avec les gestionnaires d'évènement associés
// *******************************************************************************
function cmActionItem (item, prefix, isMain, idSub, orient, nodeProperties)
{
	// var index = _cmItemList.push (item) - 1;
	_cmItemList[_cmItemList.length] = item;
	var index = _cmItemList.length - 1;
	idSub = (!idSub) ? 'null' : ('\'' + idSub + '\'');
	orient = '\'' + orient + '\'';
	prefix = '\'' + prefix + '\'';
	return ' onmouseover="cmItemMouseOver (this,' + prefix + ',' + isMain + ',' + idSub + ',' + orient + ',' + index + ');" onmouseout="cmItemMouseOut (this,' + nodeProperties.delay + ')" onmousedown="cmItemMouseDown (this,' + index + ')" onmouseup="cmItemMouseUp (this,' + index + ')"';
}

// *******************************************************************************
// Fonction pratique pour retourner un truc vide (un peu idiot ! non ?)
// *******************************************************************************
function cmNoActionItem (item, prefix)
{
	return item[1];
}

// *******************************************************************************
// Fonction pratique
// *******************************************************************************
function cmSplitItem (prefix, isMain, vertical)
{
	var classStr = 'cm' + prefix;
	if (isMain)
	{
		classStr += 'Main';
		if (vertical)
			classStr += 'HSplit';
		else
			classStr += 'VSplit';
	}
	else
		classStr += 'HSplit';
	var item = eval (classStr);
	return cmNoActionItem (item, prefix);
}

// *********************************************************
// Fonction permettant d'afficher les propriétés d'un objet
// *********************************************************		
	function affiche_proprietes(objet)
	{
		var noms="";
		cpt=0;
		cpt_propriete = 1;
		nbr_propriete = 0;
		nbr_element_par_page = 10;
		for (var nom in objet)
		{
			nbr_propriete++;
		}
		alert("Objet ("+nbr_propriete+" propriétés)\n\ntagName = "+objet.tagName+"\n\nid = "+objet.id+"\n\nname = "+objet.name);
		for (var nom in objet)
		{
			noms += cpt_propriete+" - "+nom + "=" + objet[nom] + "\n";
			noms += "--------------------------------------------\n";
			cpt++;
			cpt_propriete++;
			if (cpt==nbr_element_par_page)
			{
				alert(noms);
				cpt=0;
				noms="";
			}
		}
		alert(noms);
	}	

// *******************************************
// Dessine le sous-menu de manière récursive
// *******************************************
var t_arbre_id_de_menu_cms = Array();
var cpt_ligne_cms = 0;
var cpt_de_ligne = 0;
var cpt_sous_menu_racine = 0;
// -----------------------------------------------------------------------------------------------------------------------------
// <DIV> Propriété d'un calque d'un sous-menu :
//		id => 	cmSubMenuID<numero de l'ordre de leur création> (ex:cmSubMenuID6, cmSubMenuID7...)
//				Cas particulier : cmSubMenuID_FauxSousMenu_<numero de l'ordre de leur création>, signie que l'on a affaire
//				à un faux calque racine pour les rubriques qui n'ont pas de sous-menu (ex: cmSubMenuID_FauxSousMenu_0 ,...)
//		type_sous_menu => 	"racine" (signifie que le calque est un sous-menu racine - juste sous une rubrique)
//							"sous_sous_menu" (signifie que le calque est un sous-menu enfant)
//		num_ligne_cms =>	Numéro de la ligne du sous-menu parent ayant permis d'afficher le calque
//							Si aucun numero, cela signie que l'on a affaire à un sous-menu racine
// -----------------------------------------------------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------------------------------------------------
// <TABLE> Propriété du tableau d'un sous-menu :
//		id => 	table_cmSubMenuID<numero de la rubrique> (ex:table_cmSubMenuID6, table_cmSubMenuID7...)
// -----------------------------------------------------------------------------------------------------------------------------
function cmDrawSubMenu (subMenu, prefix, id, orient, nodeProperties, id_precedent, num_ligne_cms)
{
	if (num_ligne_cms == null)
	{
		num_ligne_cms = "";
	}
	
	// ---------------------------------------------------------------------------------------------------------------
	// Construction du tableau contenant l'arbre_id des sous-menu racine et de ses enfants
	// (à noter qu'une rubrique n'affichant aucun sous-menu en possède en fait 1 faux qui est invisible !)
	// ---------------------------------------------------------------------------------------------------------------
		if (id_precedent == null)
		{
			// sous-menu racine
			t_arbre_id_de_menu_cms[id] = id+"/";
			cpt_sous_menu_racine++;
			num_rubrique = cpt_sous_menu_racine;
		}	
		else
		{
			// sous_menu enfants
			t_arbre_id_de_menu_cms[id] = t_arbre_id_de_menu_cms[id_precedent]+id+"/";
			num_rubrique = '';
		}
	
	// ---------------------------------------------------------------------------------------------------------------
	// Construction du <div> qui contient lui-même le <table> du sous-menu
	// ---------------------------------------------------------------------------------------------------------------
		var str = '<div id="' + id + '" num_ligne_cms="'+num_ligne_cms+'" class="' + prefix + 'SubMenu">';
		str += 		'<table border=0 width="" id="table_sous_menu_'+ num_rubrique +'" summary="sub menu" cellspacing="' + nodeProperties.subSpacing + '" class="' + prefix + 'SubMenuTable">';
		var strSub = '';

		var item;
		var idSub;
		var hasChild;
		var i;	
		var classStr;
	
	// ---------------------------------------------------------------------------------------------------------------
	// Construction des <tr> et <td>
	// ---------------------------------------------------------------------------------------------------------------
		for (i = 5; i < subMenu.length; ++i)
		{
			item = subMenu[i];
			if (!item)
				continue;
	
			hasChild = (item.length > 5);
			idSub = hasChild ? cmNewID () : null;
			
			str += '<tr class="' + prefix + 'MenuItem"' + cmActionItem (item, prefix, 0, idSub, orient, nodeProperties) + '>';
	
			if (item == _cmSplit)
			{
				str += cmSplitItem (prefix, 0, true);
				str += '</tr>';			
				continue;
			}
	
			if (item[0] == _cmNoAction)
			{
				str += cmNoActionItem (item, prefix);
				str += '</tr>';
				continue;
			}
	
			classStr = prefix + 'Menu';
			classStr += hasChild ? 'Folder' : 'Item';
			
			// -----------------------------------
			// <td> avec image à gauche.
			// S'affiche pour créer un espace égal créé par l'image situé à droite.
			// -----------------------------------
			if (document.getElementById("largeur_puce_du_menu_de_navigation"))
			{
				largeur_puce = document.getElementById("largeur_puce_du_menu_de_navigation").value;
			}
			else
			{
				largeur_puce = 0;				
			}
			if (hasChild)
			{
				str += '<td class="cellule_menu_et_ss_menu" nowrap style="width:'+largeur_puce+'">';
				str += '';
				str += '</td>';
			}
			else
			{
				str += '<td class="cellule_menu_et_ss_menu" nowrap>';
				str += '</td>';
			}
			
			
			str += '<td class="cellule_menu_et_ss_menu">';
	
			if (item[0] != null && item[0] != _cmNoAction)
			{
				str += item[0];
			}
			else
			{
				str += hasChild ? nodeProperties.folderLeft : nodeProperties.itemLeft;
			}		
			
			str += '<td class="cellule_menu_et_ss_menu" nowrap>' + item[1];		
			
			if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
			{
				// --------------------------------------------------------------------
				// MAC OS + Safari
				// --------------------------------------------------------------------	
				if (hasChild)
				{
					// -----------------------------------
					// <td> avec image à droite
					// -----------------------------------
					cpt_ligne_cms++;
					str += '<td class="cellule_menu_et_ss_menu" nowrap>';	
					str += '<div id="div_ligne_sous_menu_'+cpt_ligne_cms+'" style="position:absolute;"></div>';	
					str += nodeProperties.folderRight;
					strSub += cmDrawSubMenu (item, prefix, idSub, orient, nodeProperties, id, cpt_ligne_cms);
					str += '</td>';
				}
				else
				{
					// -----------------------------------
					// <td> seul
					// -----------------------------------
					cpt_de_ligne++;					
					str += '<td class="cellule_menu_et_ss_menu" nowrap>';					
					str += nodeProperties.itemRight;
					str += '<img src="/images/none.gif" width="1" height="1">';
					str += '</td>';
				}				
			}
			else
			{
				// --------------------------------------------------------------------
				// Autres navigateurs
				// --------------------------------------------------------------------	
				if (hasChild)
				{
					// -----------------------------------
					// <td> avec image à droite
					// -----------------------------------
					str += '<td class="cellule_menu_et_ss_menu" nowrap>';				
					str += nodeProperties.folderRight;
					strSub += cmDrawSubMenu (item, prefix, idSub, orient, nodeProperties, id);
					str += '</td>';
				}
				else
				{
					// -----------------------------------
					// <td> seul
					// -----------------------------------
					str += '<td class="cellule_menu_et_ss_menu" nowrap>';
					str += nodeProperties.itemRight;
					str += '<img src="/images/none.gif" width="1" height="1">';
					str += '</td>';
				}			
			}
			str += '</td></tr>';
		}
	// ---------------------------------------------------------------------------------------------------------------
	// Fermeture des balises
	// ---------------------------------------------------------------------------------------------------------------
		str += '</table></div>' + strSub;
	
	return str;
}

// *******************************************************************************
// Le menu principal (celui qu'on voit toujours affiché sous le bandeau)
// *******************************************************************************
var cpt_rubrique_sans_sous_menu = 0;
function cmDraw (id, menu, orient, nodeProperties, prefix)
{	
	//affiche_proprietes(nodeProperties);
	var obj = cmGetObject (id);
	
	if (!nodeProperties)
		nodeProperties = _cmNodeProperties;
	if (!prefix)
		prefix = '';
		
	// Voici les RUBRIQUES RACINES 
	var str = '<table width="100%" border="0" summary="main menu" class="' + prefix + 'Menu" cellspacing="' + nodeProperties.mainSpacing + '">';
	var strSub = '';

	if (!orient)
		orient = 'hbr';

	var orientStr = String (orient);
	var orientSub;
	var vertical;

	// draw the main menu items
	if (orientStr.charAt (0) == 'h')
	{
		// horizontal menu
		orientSub = 'v' + orientStr.substr (1, 2);
		str += '<tr>';
		vertical = false;
	}
	else
	{
		// vertical menu
		orientSub = 'v' + orientStr.substr (1, 2);
		vertical = true;
	}

	var i;
	var item;
	var idSub;
	var hasChild;
	var classStr;
	
	for (i = 0; i < menu.length; ++i)
	{		
		item = menu[i];

		if (!item)
			continue;
		
		num_rubrique = Math.floor((i+2)/2);
		
		if (item == _cmSplit)
		{
			style_td_separateur = "";
		}
		else
		{
			style_td_separateur = marge_entre_rubrique;
		}
		genre = "";
		if (i%2 == 0)
		{			
			if (i==(menu.length)-2)
			{
				genre = "rubrique_racine_numero_dernier";
			}
			else
			{
				genre = "rubrique_numero_"+num_rubrique;
			}
		}
		str += vertical ? '<tr' : '<td align="center"';
		str += ' class="' + prefix + 'MainItem"';
		str += ' style="'+style_td_separateur+'"';
		str += ' id="td_menu_principal_' + i + '"';
		str += ' genre="'+genre+'"';
		str += ' name="td_num_rubrique_'+num_rubrique+'"';
		hasChild = (item.length > 5);
		idSub = hasChild ? cmNewID () : null;
		
		num_rubrique = Math.floor((i+2)/2);
		str += cmActionItem (item, prefix, 1, idSub, orient, nodeProperties) + '>';
		
		// -----------------------------------------------------
		// Cellule séparatrice entre les rubriques
		// -----------------------------------------------------
		if (item == _cmSplit)
		{
			// 
			if (i < menu.length-1)
			{
				str += "<div id='div_menu_principal_separateur_"+i+"'>";
				if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape" && navigator.appVersion.substr(80,10) == "Safari/312")
				{
					// Pour MAC OS + Safari 3.1
					str += "|";
				}
				else
				{
					str += cmSplitItem (prefix, 1, vertical);
				}
			}
			str += vertical? '</tr>' : '</div></td>';
			continue;
		}

		// -----------------------------------------------------
		// ????
		// -----------------------------------------------------
		if (item[0] == _cmNoAction)
		{
			str += cmNoActionItem (item, prefix);
			str += vertical? '</tr>' : '</td>';
			continue;
		}

		classStr = prefix + 'Main' + (hasChild ? 'Folder' : 'Item');

		// -----------------------------------------------------
		// On met un contenu à gauche (C'est l'intitulé de la rubrique)
		// -----------------------------------------------------
		// L'intitulé de cette rubrique principale est contenu dans ce <span>
		str += vertical ? '<td' : '<span';
		str += vertical ? '' : ' id="span_menu_principal_'+i+'" style="position:relative;" ';
		str += ' class="' + classStr + 'Left">';	
		str += (item[0] == null) ? (hasChild ? nodeProperties.mainFolderLeft : nodeProperties.mainItemLeft)
					 : item[0];
		str += vertical ? '</td>' : '</span>';
		str += vertical ? '<td' : '<span';
		str += ' class="' + classStr + 'Text">';
		str += item[1];		
		// Fin de l'intitulé de la cette rubrique principale et donc fin du </span>
		str += vertical ? '</td>' : '</span>';

		// -----------------------------------------------------
		// On met un contenu à droite (? ça sert jamais ?)
		// -----------------------------------------------------
		str += vertical ? '<td' : '<span';
		str += ' class="' + classStr + 'Right">';
		str += hasChild ? nodeProperties.mainFolderRight : nodeProperties.mainItemRight;
		str += vertical ? '</td>' : '</span>';
		str += vertical ? '</tr>' : '</td>';

		if (hasChild)
		{
			// Création du sous-menu racine et de ses sous-menus enfants
			strSub += cmDrawSubMenu (item, prefix, idSub, orientSub, nodeProperties);
		}
		else
		{
			// Création d'un faux sous-menu racine (utile pour le script situé en fin de 'index.php'
			strSub += cmDrawSubMenu (item, prefix, "cmSubMenuID_FauxSousMenu_"+cpt_rubrique_sans_sous_menu, orientSub, nodeProperties);
			cpt_rubrique_sans_sous_menu++;
		}
	}
	if (!vertical)
		str += '</tr>';
	str += '</table>' + strSub;
	obj.innerHTML = str;
}

// *******************************************************************************
// onMouseOver
// *******************************************************************************
function cmItemMouseOver (obj, prefix, isMain, idSub, orient, index)
{
	//alert(obj+"---"+prefix+"---"+isMain+"---"+idSub+"---"+orient+"---"+index);
	clearTimeout (_cmTimeOut);

	if (!obj.cmPrefix)
	{
		obj.cmPrefix = prefix;
		obj.cmIsMain = isMain;
	}

	var thisMenu = cmGetThisMenu (obj, prefix);

	// insert obj into cmItems if cmItems doesn't have obj
	if (!thisMenu.cmItems)
		thisMenu.cmItems = new Array ();
	var i;
	for (i = 0; i < thisMenu.cmItems.length; ++i)
	{
		if (thisMenu.cmItems[i] == obj)
			break;
	}
	if (i == thisMenu.cmItems.length)
	{
		//thisMenu.cmItems.push (obj);
		thisMenu.cmItems[i] = obj;
	}

	// hide the previous submenu that is not this branch
	if (_cmCurrentItem)
	{
		// occationally, we get this case when user
		// move the mouse slowly to the border
		if (_cmCurrentItem == thisMenu)
			return;

		var thatPrefix = _cmCurrentItem.cmPrefix;
		var thatMenu = cmGetThisMenu (_cmCurrentItem, thatPrefix);
		if (thatMenu != thisMenu.cmParentMenu)
		{
			if (_cmCurrentItem.cmIsMain)
				_cmCurrentItem.className = thatPrefix + 'MainItem';
			else
				_cmCurrentItem.className = thatPrefix + 'MenuItem';
			if (thatMenu.id != idSub)
				cmHideMenu (thatMenu, thisMenu, thatPrefix);
		}
	}

	// okay, set the current menu to this obj
	_cmCurrentItem = obj;

	// just in case, reset all items in this menu to MenuItem
	cmResetMenu (thisMenu, prefix);

	var item = _cmItemList[index];
	var isDefaultItem = cmIsDefaultItem (item);

	if (isDefaultItem)
	{
		if (isMain)
			obj.className = prefix + 'MainItemHover';
		else
			obj.className = prefix + 'MenuItemHover';
	}

	if (idSub)
	{
		var subMenu = cmGetObject (idSub);
		cmShowSubMenu (obj, prefix, subMenu, orient);
	}

	var descript = '';
	if (item.length > 4)
		descript = (item[4] != null) ? item[4] : (item[2] ? item[2] : descript);
	else if (item.length > 2)
		descript = (item[2] ? item[2] : descript);

	window.defaultStatus = descript;
}

// *******************************************************************************
// onMouseOut
// *******************************************************************************
function cmItemMouseOut (obj, delayTime)
{
	if (!delayTime)
		delayTime = _cmNodeProperties.delay;
	_cmTimeOut = window.setTimeout ('cmHideMenuTime ()', delayTime);
	window.defaultStatus = '';
}

// *******************************************************************************
// onMouseDown
// *******************************************************************************
function cmItemMouseDown (obj, index)
{
	if (cmIsDefaultItem (_cmItemList[index]))
	{
		if (obj.cmIsMain)
			obj.className = obj.cmPrefix + 'MainItemActive';
		else
			obj.className = obj.cmPrefix + 'MenuItemActive';
	}
}

// *******************************************************************************
// onMouseUp
// *******************************************************************************
function cmItemMouseUp (obj, index)
{
	var item = _cmItemList[index];

	var link = null, target = '_self';

	if (item.length > 2)
		link = item[2];
	if (item.length > 3)
		target = item[3] ? item[3] : target;

	if (link != null)
	{
		window.open (link, target);
	}

	var prefix = obj.cmPrefix;
	var thisMenu = cmGetThisMenu (obj, prefix);

	var hasChild = (item.length > 5);
	if (!hasChild)
	{
		if (cmIsDefaultItem (item))
		{
			if (obj.cmIsMain)
				obj.className = prefix + 'MainItem';
			else
				obj.className = prefix + 'MenuItem';
		}
		cmHideMenu (thisMenu, null, prefix);
	}
	else
	{
		if (cmIsDefaultItem (item))
		{
			if (obj.cmIsMain)
				obj.className = prefix + 'MainItemHover';
			else
				obj.className = prefix + 'MenuItemHover';
		}
	}
}


// *******************************************************************************
// Construction du sous-menu racine et de ses enfants par récursivité
// *******************************************************************************
function cmMoveSubMenu (obj, subMenu, orient)
{	
	if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
	{
		// --------------------------------------------------------------------
		// MAC OS + Safari
		// --------------------------------------------------------------------		
		// On a désactivé le repositionnement en fonction des évènements de la souris 
		// Le positionnement est désormais réalisé à la fin du fichier 'index.php'
		var mode = String (orient);
		var p = subMenu.offsetParent;
		//alert(p.tagName);
		//alert(mode);	
		//affiche_proprietes(subMenu);
		if (mode.charAt(0) == 'h')
		{
			if (mode.charAt(1) == 'b')
			{
				subMenu.style.top = (cmGetYAt (obj, p) + obj.offsetHeight) + 'px';
			}
			else
			{
				subMenu.style.top = (cmGetYAt (obj, p) - subMenu.offsetHeight) + 'px';
			}
		}
		else
		{			
			if (mode.charAt (1) == 'b')
			{
				subMenu.style.top = (cmGetYAt (obj, p)) + 'px';
			}
			else
			{
				subMenu.style.top = (cmGetYAt (obj, p) + obj.offsetHeight - subMenu.offsetHeight) + 'px';
			}
		}
	}
	else
	{
		// --------------------------------------------------------------------
		// Les autres navigateurs
		// --------------------------------------------------------------------	
		var mode = String (orient);
		var p = subMenu.offsetParent;
		//alert(p.tagName);
		//alert(mode);	
		//affiche_proprietes(subMenu);
		if (mode.charAt(0) == 'h')
		{
			if (mode.charAt(1) == 'b')
			{	
				subMenu.style.top = (cmGetYAt (obj, p) + obj.offsetHeight) + 'px';
			}
			else
			{
				subMenu.style.top = (cmGetYAt (obj, p) - subMenu.offsetHeight) + 'px';
			}
			
			if (mode.charAt(2) == 'r')
			{
				subMenu.style.left = (cmGetXAt (obj, p)) + 'px';
			}
			else
			{
				subMenu.style.left = (cmGetXAt (obj, p) + obj.offsetWidth - subMenu.offsetWidth) + 'px';
			}
		}
		else
		{
			if (mode.charAt (2) == 'r')
			{
				subMenu.style.left = (cmGetXAt (obj, p) + obj.offsetWidth) + 'px';
			}
			else
			{
				subMenu.style.left = (cmGetXAt (obj, p) - subMenu.offsetWidth) + 'px';
			}
			
			if (mode.charAt (1) == 'b')
			{
				
				subMenu.style.top = (cmGetYAt (obj, p)) + 'px';
			}
			else
			{
				subMenu.style.top = (cmGetYAt (obj, p) + obj.offsetHeight - subMenu.offsetHeight) + 'px';
			}
		}
	}
}

// *******************************************************************************
// Affiche le sous-menu et le positionne aux bonnes coordonnées 
// *******************************************************************************
function cmShowSubMenu (obj, prefix, subMenu, orient)
{
	if (!subMenu.cmParentMenu)
	{
		//alert(obj);
		var thisMenu = cmGetThisMenu (obj, prefix);
		subMenu.cmParentMenu = thisMenu;
		if (!thisMenu.cmSubMenu)
		{
			thisMenu.cmSubMenu = new Array ();
		}
		thisMenu.cmSubMenu[thisMenu.cmSubMenu.length] = subMenu;
	}

	// position the sub menu
	cmMoveSubMenu (obj, subMenu, orient);
	subMenu.style.visibility = 'visible';

	// --------------------------------------------------------------------
	// On IE, controls such as SELECT, OBJECT, IFRAME (before 5.5)
	// are window based controls.  So, if sub menu and these controls
	// overlap, sub menu would be hid behind them.  Thus, one needs to
	// turn the visibility of these controls off when the
	// sub menu is showing, and turn their visibility back on
	// --------------------------------------------------------------------
	if (document.all)
	{
		subMenu.cmOverlap = new Array ();
		cmHideControl ("IFRAME", subMenu);
		cmHideControl ("SELECT", subMenu);
		cmHideControl ("OBJECT", subMenu);
	}
	
}

//
// reset all the menu items to class MenuItem in thisMenu
//
function cmResetMenu (thisMenu, prefix)
{
	if (thisMenu.cmItems)
	{
		var i;
		var str;
		var items = thisMenu.cmItems;
		for (i = 0; i < items.length; ++i)
		{
			if (items[i].cmIsMain)
				str = prefix + 'MainItem';
			else
				str = prefix + 'MenuItem';
			if (items[i].className != str)
				items[i].className = str;
		}
	}
}

// *******************************************************************************
// Appelé par le Timer pour cahcé le menu
// *******************************************************************************
function cmHideMenuTime ()
{
	if (_cmCurrentItem)
	{
		var prefix = _cmCurrentItem.cmPrefix;
		cmHideMenu (cmGetThisMenu (_cmCurrentItem, prefix), null, prefix);
	}
}

// *******************************************************************************
// Cache le sous-menu et ses parents jusqu'au sous-menu racine
// (à condition que le sous-menu ne soit pas déjà caché)
// *******************************************************************************
function cmHideMenu (thisMenu, currentMenu, prefix)
{
	var str = prefix + 'SubMenu';

	// hide the down stream menus
	if (thisMenu.cmSubMenu)
	{
		var i;
		for (i = 0; i < thisMenu.cmSubMenu.length; ++i)
		{
			cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
		}
	}

	// hide the upstream menus
	while(thisMenu && thisMenu != currentMenu)
	{
		cmResetMenu (thisMenu, prefix);
		if (thisMenu.className == str)
		{
			thisMenu.style.visibility = 'hidden';
			cmShowControl (thisMenu);
		}
		else
			break;
		thisMenu = cmGetThisMenu (thisMenu.cmParentMenu, prefix);
	}
}

// *******************************************************************************
// Cache le sous-menu si celui-ci n'est pas déjà caché
// *******************************************************************************
function cmHideSubMenu (thisMenu, prefix)
{
	if (thisMenu.style.visibility == 'hidden')
		return;
	if (thisMenu.cmSubMenu)
	{
		var i;
		for (i = 0; i < thisMenu.cmSubMenu.length; ++i)
		{
			cmHideSubMenu (thisMenu.cmSubMenu[i], prefix);
		}
	}
	cmResetMenu (thisMenu, prefix);
	thisMenu.style.visibility = 'hidden';
	cmShowControl (thisMenu);
}

// *******************************************************************************
// Que pour Internet Explorer :
// Cache le sous-menu grâce à une iframe ?
// *******************************************************************************
function cmHideControl (tagName, subMenu)
{
	var x = cmGetX (subMenu);
	var y = cmGetY (subMenu);
	var w = subMenu.offsetWidth;
	var h = subMenu.offsetHeight;

	var i;
	for (i = 0; i < document.all.tags(tagName).length; ++i)
	{
		var obj = document.all.tags(tagName)[i];
		if (!obj || !obj.offsetParent)
			continue;

		// check if the object and the subMenu overlap

		var ox = cmGetX (obj);
		var oy = cmGetY (obj);
		var ow = obj.offsetWidth;
		var oh = obj.offsetHeight;

		if (ox > (x + w) || (ox + ow) < x)
			continue;
		if (oy > (y + h) || (oy + oh) < y)
			continue;
		//subMenu.cmOverlap.push (obj);
		subMenu.cmOverlap[subMenu.cmOverlap.length] = obj;
		//EVO:FR:02/06/04:Je désactive la disparition des contrôles autres que de formulaires
		//	Je ne vois pas vraiment pkoi cela a été fait comme çà
		switch(obj.type)
		{
		    case "select-one":
        		obj.style.visibility = "hidden";
		        break;
		    default:
		        break;
		}
	}
}

// *******************************************************************************
// Affiche le sous-menu
// *******************************************************************************
function cmShowControl (subMenu)
{
	if (subMenu.cmOverlap)
	{
		var i;
		for (i = 0; i < subMenu.cmOverlap.length; ++i)
		{
			subMenu.cmOverlap[i].style.visibility = "";
		}
	}
	subMenu.cmOverlap = null;
}

// *******************************************************************************
// Retourne le menu ou le tableau de sous-menu quand 'item' est à l'intérieur
// *******************************************************************************
function cmGetThisMenu (obj, prefix)
{
	//affiche_proprietes(obj);
	var str1 = prefix + 'SubMenu';
	var str2 = prefix + 'Menu';
	while(obj)
	{
		if (obj.className == str1 || obj.className == str2)
		{
			return obj;
		}
		obj = obj.parentNode;
	}
	return null;
}

// *******************************************************************************
// Retourne l'objet dont on passe l'id en parametre
// *******************************************************************************
function cmIsDefaultItem (item)
{
	//affiche_proprietes(item);
	if (item == _cmSplit || item[0] == _cmNoAction)
	{
		return false;
	}
	return true;
}

// *******************************************************************************
// Retourne l'objet dont on passe l'id en parametre
// *******************************************************************************
function cmGetObject (id)
{
	if (document.all)
	{
		//affiche_proprietes(document.all[id]);
		return document.all[id];
	}
	else
	{
		return document.getElementById(id);
	}
}

// *******************************************************************************
// Retourne la coordonnée absolue X d'un objet
// *******************************************************************************
function cmGetX (obj)
{
	if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
	{
		// --------------------------------------------------------------------
		// MAC OS + Safari
		// --------------------------------------------------------------------	
		// Safari ne sait récupérer le 'offsetTop' que des DIV mais pas des TABLE, TD...
	}
	else
	{
		var x = 0;
	
		do
		{
			x += obj.offsetLeft;
			obj = obj.offsetParent;
		}
		while(obj);
		return x;
	}
}

// *******************************************************************************
// Retourne la coordonnée absolue X d'un objet 
// en étant sur que l'objet en parametre 1 n'est pas l'objet du parametre 2
// *******************************************************************************
function cmGetXAt (obj, elm)
{
	if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
	{
		// --------------------------------------------------------------------
		// MAC OS + Safari
		// --------------------------------------------------------------------	
		// Safari ne sait récupérer le 'offsetTop' que des DIV mais pas des TABLE, TD...
	}
	else
	{
		var x = 0;
	
		while(obj && obj != elm)
		{
			x += obj.offsetLeft;
			obj = obj.offsetParent;
		}
		return x;
	}
}

// *******************************************************************************
// Retourne la coordonnée absolue X d'un objet 
// *******************************************************************************
function cmGetY (obj)
{
	if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
	{
		// --------------------------------------------------------------------
		// MAC OS + Safari
		// --------------------------------------------------------------------
		// Safari ne sait récupérer le 'offsetTop' que des DIV mais pas des TABLE, TD...
	}
	else
	{
		var y = 0;
		do
		{
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		while(obj);
		return y;
	}
}

// *******************************************************************************
// Retourne la coordonnée absolue Y d'un objet
// en étant sur que l'objet en parametre 1 n'est pas l'objet du parametre 2.
// *******************************************************************************
function cmGetYAt (obj, elm)
{
	if (navigator.platform.indexOf("Mac") != -1 && navigator.appName == "Netscape")
	{
		// --------------------------------------------------------------------
		// MAC OS + Safari
		// --------------------------------------------------------------------	
		// Safari ne sait récupérer le 'offsetTop' que des DIV mais pas des TABLE, TD...
	}
	else
	{
		var y = 0;
		while(obj && obj != elm)
		{
			y += obj.offsetTop;
			obj = obj.offsetParent;
		}
		return y;
	}	
}
