	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	//		                                                                           APPLICATION "SiteAtlantic																						
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	//     									 Composant javascript menu.js
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// PRINCIPE:
	//		Création d'un menu de sélection à plusieurs niveaux
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// FONCTIONNEMENT GENERAL:
	//
	// Organisation des menus et sous-menu:
	//	- Un sous-menu est constitué d'une liste non ordonnée <ul> dont chaque élément <li> représente un item du sous-menu. 
	//	- Chaque élément <li> renferme le lien racine
	//	- Lorsqu'à un item correspond un sous-menu de niveau inférieur, la balise <ul> de ce sous-menu est attachée comme enfant de la balise <li> correspondant
	//	  à cet item.
	//
	// Ouverture et fermeture des menus:
	//	Le menu racine de l'arborescence doit être créé au chargement de la page par activation de la fonction CreeMenuPrincipal() sur événement onload attaché à la balise
	//  	body. 
	//	Les sous-menus sont créés et ouverts dynamiquement en javascript:
	//	- L'événement onmouseover sur un item d'un menu provoque l'ouverture du sous-menu attaché, s'il existe
	//	- L'événement onmouseout sur un item d'un menu provoque la fermeture de tous les sous-menus de niveau inférieur.
	//
	// REMARQUES:   les conventions suivantes ont été adoptées:
	// 	- L'attribut id de la balise <ul> racine d'un sous-menu est de laforme Nxy ou xy est égal au niveau du sous-menu dans l'arborescence
	//	- Les attributs id des balises <li> (items) sont de la forme Ixy avec xy égal au rang de ces items dans la liste des items du sous-menu. 
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// TABLEAU DESCRIPTIF DE L'ARBORESCENCE DE MENUS:
	//  	Format:  Chaque menu ou sous-menu est représenté par un tableau composé de:
	//		    - Elément n° 0: contenant l'objet noeud racine du sous-menu dans le DOM (ou 0 si non créé)
	//		    - Elément n° 1: Titre (titre du lien racine)
	//		    - Element n° 2:  URL (URL du lien racine)
	//		    - Elements n° 3 et plus: sous-tableaux représentant les items du menu.
	//	Chacun de ces items constitue la racine d'un sous-menu structuré comme précédemment.
	//	REMARQUE:	Le modèle de tableau Menus défini ci-après est un exemple qui définit 3 niveaux de menus avec 2 items par niveau:
	
	/*
	var Menus = [
					[0, "Présentation de la documentation",'/Sysex_PRESENTATION.html'
					],
					[0, "Systèmes d'exploitation",'/SysEx_INTRO.html',
						[0, "Généralités", '/Sysex_GENE.html',
							[0, "Gestion de processus",'/Sysex-Processus.html'],
							[0, "Pilotes de périphériques",'/Sysex_Drivers.html'],
							[0, "Notion de Temps réel",'/Sysex_Temps_Réel.html']
						],
						[0, "Systèmes de type Unix", '/Sysex_Unix_INTRO.html',
							[0, "Norme POSIX",'/Sysex_UNIX_POSIX.html'],
							[0, "Linux",'/Sysex_Linux.html'],
							[0, "Lynx-OS",'/Sysex_Lynx_OS.html']
						],
						[0, "Window", '/Window_INTRO.html'
						],
					],
					[0, "Methodologie de Développement",'/MethodDev_INTRO.html',
						[0, "Definition du besoin", '/MethodDev_BESOIN_GEN.html',
							[0, "Approche fonctionnelle",'MethodDev_BESOIN_FONC.html'],
							[0, "Approche Objet",'MethodDev_BESOIN_OBJETS.html'],
							[0, "Une méthode simple",'MethodDev_BESOIN_SIMPLE.html']
						],
						[0, "Démarches de conception", '/MethodDev_DESIGN_INTRO.html',
							[0, "Approche fonctionnelle",'MethodDEV_DESIGN_FONC.html'],
							[0, "Approche par les données",'MethodDEV_DESIGN_DONNEES.html'],
							[0, "Démarche OBJETS",'MethodDEV_DESIGN_OBJ.html']
						],
						[0, "Démarches de validation", '/MethodDev_VALID_INTRO.html',
							[0, "Une méthode simple",'MethodDEV_VALID_SIMPLE.html']
						]
						[0, "Outils de conception", '/MethodDev_OUTILS_INTRO.html',
							[0, "Diagrammes de flux",'MethodDEV_OUTILS_FLUX.html']
							[0, "Outils UML",'MethodDEV_OUTILS_UML.html']
						]
					],
					[0, "Le webmastering",'/Webmaster_INTRO.html',
						[0, "Structure du web", '/Webmaster_STRUCT.html',
							[0, "Les matériels",'Webmaster_MATERIEL.html'],
							[0, "Les protocoles",'Webmaster_PROTOCOLES.html'],
							[0, "Les mécanismes",'Webmaster_PROTOCOLES.html']
						],
						[0, "Développements web", '/Webmaster_DEV.html',
							[0, "XHTML & CSS",'Webmaster_DEV_XHTML_CSS.html'],
							[0, "PHP",'Webmaster_DEV_PHP.html'],
							[0, "JAVASCRIPT",'Webmaster_DEV_JAVASCRIPT.html']
						]
					]
				];
	*/
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// AUTRES DONNEES GLOBALES
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// Id des Niveaux
	var	NiveauId = new Array ("N00", "N01", "N02", "N03", "N04", "N05", "N06", "N07", "N08", "N09", "N10", "N11", "N12", "N13", "N14", "N15" );
	// Id des Items
	var	ItemId = new Array ("I00", "I01", "I02", "I03", "I04", "I05", "I06", "I07", "I08", "I09", "I10", "I11", "I12", "I13", "I14", "I15" );
	// Nombre de niveaux de menus gérés (correspond à la table de description "Menus")
	var	Nb_Niveaux = 4;
	// Numeros des items actifs pour chaque niveau de menus
	var	ItemNiveau = new Array (-1, -1, -1);
	// Objets racines actifs de chaque niveau
	var	RacineNiveau = new Array (0, 0, 0);
	// Numero du dernier niveau ouvert
	var	NiveauOuvert = 0;
	// Attributs OnMouseover et OnMouseOut
	var OnMouseOver;
	var OnMouseOut;

	var sem_over;
	
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// REMARQUES: 
	// - en cas d'ajout de niveaux, la valeur de la donnée NB_Niveaux et la dimension des tableaux ItemNiveau et RacineNiveau doivent être réajustées
	// - Si le nombre de niveaux ou le nombre d'items d'un niveau dépassait 16, il faudrait agrandir les tables ItemId et NiveauId
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			

	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// FONCTION:		CreeMenuPrincipal
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// PRINCIPE:		Creation du menu principal
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// - Paramètre d'entrée:   	Aucun 
	// - Appel:				Sur événement onload
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	function CreeMenuPrincipal() 
	{
		var UL;
		var	Parent = document.getElementById ( "BlocMenu" );
		
	//	créer et attacher l'objet	<ul> racine du menu
		e = document.createElement('ul');
		e.id = NiveauId[0];
		e.className = "Menu";
		e.style.top = "0px";
		if ( navigator.appName == "Microsoft Internet Explorer" ) 	e.style.left = "-10px";	
		else														e.style.left = "0px";	
		UL = Parent.appendChild(e);
		
		
	//	TANT QUE (il existe des éléments sous-menus dans le tableau Noeuds )
		i 		= 0;
		while ( Menus[i] )
		{	
	//		Créer les objets <li>, correspondant aux items du menu et les attacher à l'objet <ul>
			e = document.createElement('li');
			e.id = ItemId[i+1];
			e.className = "ItemMenu";
			OnMouseOver = Parent.onmouseover;	// "Astuce": cette duplication d'attributs fonctionne avec IE et FF et permet d'éviter d'employer
			OnMouseOut = Parent.onmouseout;		// les fonctions addEventListener(FF)  et attachEvent(IE) avec transmission de paramètre
			e.onmouseover = OnMouseOver;
			e.onmouseout = OnMouseOut;
			LI = UL.appendChild(e);

	//		Créer les objets correspondant aux items du sous-menu et les attacher à chaque objet <li>:
	//		- Créer un lien vers le document
			e = document.createElement('a');
			if ( 	( Menus[i][2].indexOf ( ".pdf", 0 ) > -1 )  
				||  ( Menus[i][2].indexOf ( ".zip", 0 ) > -1 ) )
			{
				e.href = Menus[i][2];
			}
			else
			{
				e.href = "./Index.php";
			}
			
			A = LI.appendChild(e);	
				
	//		Créer et attacher le texte correspondant à chaque lien
			Chaine = Menus[i][1].replace(/DT_/g, "");
			Chaine = Chaine.replace(/.pdf/g, "");
			Chaine = Chaine.replace(/.zip/g, "");
			Texte = document.createTextNode ( Chaine );
			A.appendChild(Texte);
			
			i++;
	//	FIN FAIRE
		}		
		Parent.onmouseover = "";
		Parent.onmouseout = "";
	}
	
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// FONCTION:	OuvreMenu
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// PRINCIPE:	Ouverture d'un sous-menu
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// - Paramètre d'entrée:  
	//			Parent:		objet <li> correspondant à l'item du menu supérieur, auquel le sous-menu doit être attaché
	// - Appel:		Sur événement onmouseover sur un item de menu.
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	
	function OuvreMenu(Parent) 
	{
	//       Interdire la gestion des événements (pour I.E, qui semble mal gérer les événements multiples)
		Parent.onmouseover = "";
		Parent.onmouseout = "";
		
	// Données locales
		var	Item;
		var	UL, LI, A;
		var n, Niveau;
		var Texte;
		var Noeud = new Array();						// Racine de l'arborescence du sous-menu traité dans le tableau Menus
		var Chaine;
		
	//DEBUT		
	//	Récupération niveau et numero item appelant
		Texte = Parent.parentNode.id;
		Niveau = parseInt( Texte.substring(1,3), 10 );		// Niveau de l'appelant dans l'arborescence du menu		

		Texte = Parent.id;
		Item = parseInt( Texte.substring(1,3), 10 ) - 1;	// Item de l'appelant dans l'arborescence du menu		
		ItemNiveau [Niveau] = Item;						 	// Sauvegarde de l'item actif pour chaque niveau
		
	// 	Extraction du sous-tableau correspondant au sous-menu (dans le tableau Noeud)	
		if 		( Niveau == 0 ) Noeud = Menus [ ItemNiveau[0] ];	
		else if ( Niveau == 1 ) Noeud = Menus [ ItemNiveau[0] ][ ItemNiveau[1]+ 3 ];
		else if ( Niveau == 2 ) Noeud = Menus [ ItemNiveau[0] ][ ItemNiveau[1]+ 3 ][ ItemNiveau[2]+ 3 ];
		else 					Noeud = Menus [0];
		
	//	SI ( l'objet racine n'est pas créé et il existe un sous-menu ) ALORS
		if ( ( !Noeud[0] ) && ( Noeud[3] ) ) 
		{

	//		Créer et attacher l'objet	<ul> racine du sous-menu
			e = document.createElement('ul');
			e.id = NiveauId[Niveau+1];
			e.className = "Menu";
			
			e.style.top = (25*(Item)+25)+"px";
			
			if 		( navigator.appName == "Microsoft Internet Explorer" ) 	
			{
				e.style.left = "30%";	
				e.style.width = "110%"; 	// Si I.E., compense défaut de   largeur des blocs
			}
			else if ( navigator.appName == "netscape" )
			{
				e.style.left = "30%";	
			}
			else 
			{
				e.style.left = "30%";
			}
			
			UL = Parent.appendChild(e);
			Noeud[0] = UL;
			
	//		TANT QUE (il existe des éléments sous-menus dans le tableau Noeuds )
			i = 0;
			while ( Noeud[i+3] )
			{
	//			Créer les objets <li>, correspondant aux items du sous-menu et les attacher à l'objet <ul>
				e = document.createElement('li');
				e.id = ItemId[i+1];
				e.className = "ItemMenu";
				e.onmouseover = OnMouseOver; // "Astuce": cette duplication d'attributs fonctionne avec IE et FF et permet d'éviter d'employer
											 // les fonctions addEventListener(FF)  et attachEvent(IE) avec transmission de paramètre
				e.onmouseout = OnMouseOut;	 // Même remarque.
				
				LI = UL.appendChild(e);

	//			Créer les objets <a>, correspondant aux items du sous-menu et les attacher à chaque objet <li>
				e = document.createElement('a');
				
	// 			Cas ou la ressource est appelée directement (V5.2 et -)
				// e.href = Noeud[i+3][2];    
				//e.target = "_blank"; // Ouverture de la documentation dans une autre fenêtre
	
	// 			Cas ou la ressource est appelée par l'intermédiaire d'une page d'appel (V5.3 et +):  
				e.href = "./VisuDocumentation.php?URL="+Noeud[i+3][2];
				
				A = LI.appendChild(e);	
				
	//			Créer et attacher les textes correspondant à chaque objet <a>
				Chaine = Noeud[i+3][1].replace(/DT_/g, "");
				Chaine = Chaine.replace(/.pdf/g, "");
				Chaine = Chaine.replace(/.zip/g, "");
				Texte = document.createTextNode ( Chaine );
				A.appendChild(Texte);

				i++;
	//		FIN FAIRE
			}	
		}
		
	//	SINON (l'objet racine existe ou bien il n'existe pas de sous-menu ) 
		else
		{
	//		SI (L'objet racine existe ) ALORS on le rend visible
			if ( Noeud[0] ) 
			{
				Noeud[0].style.visibility = "visible";
			// FIN SI
			}
	//    	FINSI
		}
	
	//	Dernier niveau ouvert = niveau du sous-menu affiché
		NiveauOuvert = Niveau+1;

	//	Sauvegarde du noeud racine du sous-menu affiché dans un tableau rangé par niveau
		RacineNiveau[Niveau+1] = Noeud[0];
		
	//	Debug ( "Niveau ouvert", NiveauOuvert );
	
	//       Rétablir la gestion d'événements (pour I.E)
		Parent.onmouseover = OnMouseOver;
		Parent.onmouseout = OnMouseOut;
	// FIN
	}

	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// FONCTION:	FermeMenu
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// PRINCIPE:	Fermeture des sous-menu
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// - Appel:		Sur événement onmouseout sur un menu.
	// - Paramètre d'entrée:  
	//			Parent:		objet correspondant au menu
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	
	function FermeMenu(Parent) 
	{
	//       Interdire la gestion d'événements (pour I.E, qui semble mal gérer les événements multiples)
		Parent.onmouseout = "";
		Parent.onmouseover = "";
		

	//	Données locales
		var Niveau, n, Texte;

	// DEBUT	
	//	Récuperation du niveau de menu de l'item quitté
		Texte = Parent.parentNode.id;
		Niveau = parseInt( Texte.substring(1,3), 10 );		// Item de l'appelant dans l'arborescence du menu	

	//	SI ( On n'a pas changé de niveau de menu ) ALORS Terminer FINSI
		if ( Niveau == NiveauOuvert ) return;
		
	//	Pour ( tous les niveaux inférieurs au niveau de l'item quitté ) FAIRE
		for ( n = Nb_Niveaux-1; n>Niveau; n-- )
		{
	//		SI ( l'objet racine du niveau existe ) ALORS rendre invisible le sous-menu
			if ( RacineNiveau[n] )
			{
				RacineNiveau[n].style.visibility = "hidden";
			// FINSI
			}
	//	FIN FAIRE
		}
	//	Souvegarde du dernier niveau ouvert	
		NiveauOuvert = Niveau;		

	//       Rétablir la gestion d'événements (pour I.E)
		Parent.onmouseout = OnMouseOut;
		Parent.onmouseover = OnMouseOver;
	// FIN
	}
		
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// FONCTION:	Debug
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// PRINCIPE : affiche des données dans un cadre en fin de page ( <div id:Debug...: à sortir des commentaires pour l'utiliser)
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	// - Paramètre d'entrée:  
	//			Texte:		Nom de la donnée a afficher
	//			Valeur:		Valeur de la donnée a afficher
	//------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------			
	function Debug ( Texte, Valeur )
	{
		var e;
		
		e = document.getElementById ( "Debug" );
		e.innerHTML = 'DEBUG: Valeur de "'+Texte+'" = '+Valeur;
	}

