///////////////////////////////////////////
//
// menu_fonction.js
//
// Fonctions permmettant de gerer un ou plusieurs menu dynamiques.
// Les donnees du menu se trouve dans un autre .js (data.js).
//
// Il y a 3 objets :
// - L'objet MENU qui represente le menu
// - L'objet DISPLAY_LEVEL qui represente l'affichage d'un niveau du menu
// - L'objet ELEMENT_MENU qui represente un element du menu
//
///////////////////////////////////////////

// Declaration des variables globales


var GEN_Separateur = '###';
var GEN_Separateur_open = '_';
var GEN_NiveauMax = 0;
// La profondeur de repertoires a laquelle on cherche une une occurence dans le menu 
var GEN_DeepFind = 3;
// Fin declaration des variables globales






///////////////////////////////////////////
/// Objet DISPLAY_LEVEL
///
/// Objet representant les proprietes d'un niveau du menu
///
///////////////////////////////////////////


function DISPLAY_LEVEL(puce_open,puce_close,puce_lien,css_open,css_close,couleur,tab)
{
	// Proprietes 
	this.puce_open		= puce_open;
	this.puce_close		= puce_close;
	this.puce_lien		= puce_lien;
	this.css_open		= css_open;
	this.css_close		= css_close;	
	this.couleur		= couleur;	
	this.tab		= tab;	
	
	
	// Methodes 
	this.GetPuceOpen 	= GetPuceOpen;
	this.GetPuceClose	= GetPuceClose;
	this.GetPuceLien	= GetPuceLien;
	this.GetCssOpen		= GetCssOpen;
	this.GetCssClose	= GetCssClose;
	this.GetCouleur		= GetCouleur;
	this.GetTab		= GetTab;	
}


function GetTab()
{	
	return this.tab;	
}


function GetCouleur()
{	
	return this.couleur;	
}

function GetPuceOpen()
{	
	return this.puce_open;	
}

function GetPuceClose()
{	
	return this.puce_close;	
}

function GetPuceLien()
{	
	return this.puce_lien;	
}

function GetCssOpen()
{	
	return this.css_open;	
}

function GetCssClose()
{	
	return this.css_close;	
}

/////////////////////// Fin Objet DISPLAY_LEVEL //////////////////////////




///////////////////////////////////////////
/// Objet DISPLAY_LEVEL
///
/// Objet representant les proprietes d'un niveau du menu
///
///////////////////////////////////////////

function ELEMENT_MENU(libelle,img,img_actif,url,niveau,open,visible)
{
	// Proprietes 
	this.libelle		= libelle;
	this.img		= img;
	this.img_actif		= img_actif;	
	this.url		= url;
	this.open		= open;
	this.visible		= visible;	
	this.niveau		= niveau;

	// Methodes 
	this.GetVisible		= GetVisible;	
	this.GetNiveau		= GetNiveau;
	this.GetOpen		= GetOpen;
	this.GetLibelle		= GetLibelle;
	this.GetUrl		= GetUrl;
	this.GetImg		= GetImg;
	this.GetImg_Actif	= GetImg_Actif;
	this.GetPere		= GetPere;
	this.SetLibelle		= SetLibelle;
	this.SetVisible		= SetVisible;
	this.SetOpen		= SetOpen;
	this.SetPere		= SetPere;		
}


function GetVisible()
{	
	return this.visible;	
}

function GetNiveau()
{	
	return this.niveau;	
}

function GetOpen()
{	
	return this.open;	
}

function GetLibelle()
{	
	return this.libelle;		
}

function GetUrl()
{	
	return this.url;	
}

function GetImg()
{	
	return this.img;	
}

function GetImg_Actif(cle)
{	
	return this.img_actif;	
}

function GetPere()
{	
	return this.pere;	
}



function SetLibelle(libelle)
{	
	 this.libelle = libelle;		
}


function SetVisible(visible)
{	
	 this.visible = visible;		
}

function SetOpen(open)
{	
	 this.open = open;		
}

function SetPere(pere)
{	
	 this.pere = pere;		
}


/////////////////////// Fin Objet DISPLAY_LEVEL //////////////////////////



///////////////////////////////////////////
/// Objet MENU
///
///
///////////////////////////////////////////


function MENU(nom,layer_color,largeur,hauteur,left,top,bottom_menu,nom_tab_element,nom_tab_level,id)
{
	// Proprietes 
	this.nom			= nom;			// nom du menu
	this.layer_color		= layer_color;		// La couleur du layer composant le menu
	this.largeur			= largeur;		// La largeur du menu
	this.hauteur			= hauteur;		// La hauteur du menu (normalement = null)
	this.left			= left;			// L'absisse du coin superieur gauche du menu
	this.top			= top;			// L'ordonnee du coin superieur gauche du menu
	this.bottom_menu		= bottom_menu;		// Le contenu du bas du menu
	this.nom_tab_element		= nom_tab_element;	// Le nom du tableau contenant les datas des elements		 
	this.nom_tab_level		= nom_tab_level;	// Le nom du tableau contenant les datas des niveaux	
	this.tab_element_menu		= new Array();		// tableau d'objets ELEMENT_MENU
	this.tab_element_menu_inter	= new Array();		// tableau 
	this.tab_display_level		= new Array();		// tableau d'objets DISPLAY_LEVEL
	this.layer			= "";			// Le layer composant le menu
	this.GEN_Tbl 			= new Array();
	this.id 			= id;			// L'identifiant utilise dans le lien pour passee la position courante d'une page a une autre
	this.niv_pos_recherche = GEN_DeepFind;			// Le nombre de parent qu'on recherche dans les elements a partir de l'url
	
	// Methodes 
	this.Initialize_Menu		= Initialize_Menu;	
	this.Initialize_Data		= Initialize_Data;
	this.SetAllPere			= SetAllPere;
	this.Initialize_Visibility	= Initialize_Visibility;
	this.Add_Element_Menu		= Add_Element_Menu;
	this.GetCle			= GetCle;
	this.Update_Menu		= Update_Menu;
	this.Show_Menu			= Show_Menu;		
	this.Set_Menu			= Set_Menu;	
	this.Build_Layer		= Build_Layer;	
	this.NS_Initialize_Layer	= NS_Initialize_Layer;
	this.NS_BuildLayer		= NS_BuildLayer;	
	this.CloseEnreg			= CloseEnreg;		
	this.ToVisible			= ToVisible;		
	this.NiveauVisible		= NiveauVisible;	
	this.IsBrother			= IsBrother;	
	this.IsFils			= IsFils;	
	this.GetBrother			= GetBrother;			
	this.MakeActifParent		= MakeActifParent;
	this.New_Menu			= New_Menu;
	this.VerifyPosition		= VerifyPosition;
	this.Test_Position		= Test_Position;
	
				
}


//////////////////////////////////////////////////
//
// fonction Initialize_Menu()
// 
// Initialisation de variables 
//
//
//////////////////////////////////////////////////

function Initialize_Menu() 
{					
	// On initialise les datas du menu
	this.Initialize_Data()	
	// On attribue un pere pour chaque noeud de l'arbre
	this.SetAllPere();
	// On met tous les noeuds de niveau 0 a visible		
	this.Initialize_Visibility(0);					
}


//////////////////////////////////////////////////
//
// fonction Initialize_Data() 
// 
// Initialise les tableaux d'objets pour les elements et les niveaux
//
//////////////////////////////////////////////////

function Initialize_Data() 
{
	var Tab_Data 		= new Array();
	var tab_element		= eval(this.nom_tab_element);
	var tab_level		= eval(this.nom_tab_level);
	
	// Pour chaque element
	for (var l=0;l<tab_element.length;l++)
	{
		
		Tab_Data = tab_element[l].split(GEN_Separateur);
//alert(Tab_Data)			
		this.Add_Element_Menu(Tab_Data[0],Tab_Data[1],Tab_Data[2],Tab_Data[3],Tab_Data[4]);
	}

	// Pour chaque niveau
	for (var k=0;k<tab_level.length;k++)
	{
		
		Tab_Data = tab_level[k].split(GEN_Separateur);		
//alert(Tab_Data);		
		this.tab_display_level[Tab_Data[0]] = new DISPLAY_LEVEL(Tab_Data[1],Tab_Data[2],Tab_Data[3], Tab_Data[4], Tab_Data[5],Tab_Data[6],Tab_Data[7]);
	}        	
}



//////////////////////////////////////////////////
//
// fonction SetAllPere()
// 
// Attribut pour chaque element son pere
//
//
//////////////////////////////////////////////////

function SetAllPere()
{
	var TabAncetre = new Array();
	
	// On parcours chaque element du menu 
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
		Id = this.tab_element_menu_inter[i];
		
		TabAncetre = String(Id).split(GEN_Separateur_open);
		 
		TabAncetre.length--;
		if (TabAncetre.length == 0)
		{
			//Pour les noeuds de premier niveau on met comme pere -1
			Pere = -1;
		}
		else
		{
			Pere = TabAncetre.join(GEN_Separateur_open);
		}
	
		this.tab_element_menu[Id].SetPere(Pere);
	}		
}


//////////////////////////////////////////////////
//
// fonction Initialize_Visibility(niveau)
// 
// Initialisation de la visibilite des elements de niveau inferieur ou egale a niveau
//
//
//////////////////////////////////////////////////

function Initialize_Visibility(niveau) 
{
	var Identifiant		= "";	
	var NiveauElement	= "";
	var LienUrl		= "";
	var IsItem		= "";
	var Pere		= "";
		

	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{		
		Identifiant = this.tab_element_menu_inter[i];
		NiveauElement =  this.tab_element_menu[Identifiant].GetNiveau();	
		
			
		if (NiveauElement <= niveau)
		{	 			 	
		 	this.tab_element_menu[Identifiant].SetVisible(true);	 			 	
		 	Pere = this.tab_element_menu[Identifiant].GetPere();		 	
		 	if (Pere != -1)
		 	{
		 		LienUrl = this.tab_element_menu[Pere].GetUrl();
		 		IsItem = (LienUrl == "")? false : true;
				if (!IsItem) 
				{
					this.tab_element_menu[Pere].SetOpen(true);
				}
			}					 	
		}		
	} 		 	 					 		
}




//////////////////////////////////////////////////
//
// fonction Add_Element_Menu() 
// 
// Ajoute un element au menu
//
//
//////////////////////////////////////////////////

function Add_Element_Menu(libelle,img,img_actif,url,niveau )
{

    // On ajoute une entre au tableau global GEN_Element
    // On constuit la cle du tableau associatif GEN_Element qui est sous la forme 1_2_3 selon le niveau precedent  
    Cle = this.GetCle(niveau);

    // On convertit le libelle au format html
    libelle = ConvertInHtml(libelle);             
    // On ajoute un element au tableau
    eval("this.tab_element_menu['" + Cle + "'] = new ELEMENT_MENU('" + libelle + "','" + img + "','" + img_actif + "','" + url + "'," + niveau + ",false ,false);");

    // On cree un tableau intermediaire afin de parcourir this.tab_element_menu
    this.tab_element_menu_inter[this.tab_element_menu_inter.length] = Cle;
}



//////////////////////////////////////////////////
//
// fonction GetCle(niv)
// 
// Retourne l'identifiant du noeud sous forme 1_2_2_3
//
//
//////////////////////////////////////////////////

function GetCle(niv)
{
	var Id = "";
	
	if (niv >= GEN_NiveauMax)
	{
		if (this.GEN_Tbl[niv])
		{
			this.GEN_Tbl[niv]++;
		}	
		else
		{
			this.GEN_Tbl[niv] = 1;
		}
	}
	else
	{
		// On reinitialise le tableau this.GEN_Tbl
		for (var i=(niv+1);i <= GEN_NiveauMax;i++)
		{
			this.GEN_Tbl[i] = 0;	
		} 
		if (this.GEN_Tbl[niv])
		{
			this.GEN_Tbl[niv]++;
		}	
		else
		{
			this.GEN_Tbl[niv] = 1;
		}	
	}
	
	GEN_NiveauMax = niv;
	Id = this.GEN_Tbl[0];
	for(var j=1;j<Number(niv)+1;j++)
	{
		Id += "_" + this.GEN_Tbl[j];	
	}
	return Id;
}



//////////////////////////////////////////////////
//
// fonction Show_Menu() 
// 
// Affiche le menu
// On parcoure le tableau des elements du menu et on les affiche s'ils sont visibles
//
//
//////////////////////////////////////////////////

function Show_Menu()
{			
	var Visible = "";
	// On ajoute la bal tableise de debut de
	//var Contenu = '<table with="'+ this.largeur + '" border="0" cellspacing="0">';
	var Contenu = '';
	// On parcours chaque element du menu et on constuit une ligne pour un element	
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
	
		Identifiant = this.tab_element_menu_inter[i];

		 Visible = this.tab_element_menu[Identifiant].GetVisible();		

		// On affiche les element visibles	 		 	 	 	 	 	 
		 if (Visible)
		 {
			// On construit le contenu de la ligne
		 	Contenu += this.Build_Layer(Identifiant);
		 }

	}
	// On ajoute la balise de fin de table 
	//Contenu += '</table>';
//alert(Contenu);	
    // On rajoute la fin du menu
	Contenu += this.bottom_menu;

	this.layer.write(Contenu);
	this.layer.show();	
}

//////////////////////////////////////////////////
//
// fonction Build_Layer(Identifiant)
// 
// Construit et retourne une ligne de table
// correspondant a un element du tableau
//
//
//////////////////////////////////////////////////


function Build_Layer(Identifiant)
{
	
	var corps = "";
	var Lien_Image = "";
	var css = "";
	var puce = "";
	var tab = 0;
	var IsCouleur  = false;
	var IsItem     = false;
	var IsMotImg   = false;
	var TxtCouleur = "";
	var car = '?';
			
	var Visible    = this.tab_element_menu[Identifiant].GetVisible();
	var Niveau     = this.tab_element_menu[Identifiant].GetNiveau() ;
	var Open       = this.tab_element_menu[Identifiant].GetOpen();	 
	var Libelle    = this.tab_element_menu[Identifiant].GetLibelle();
	var LienUrl    = this.tab_element_menu[Identifiant].GetUrl();
	var Img        = this.tab_element_menu[Identifiant].GetImg();
	var Img_Actif  = this.tab_element_menu[Identifiant].GetImg_Actif();	
		 	
	var Couleur = this.tab_display_level[Niveau].GetCouleur();
	var Tabulation1 = this.tab_display_level[Niveau].GetTab();
	var Tabulation2 = this.largeur - Tabulation1;
 	
 	// On initialise des booleens 
	IsItem = (LienUrl == "")? false : true;
	IsCouleur = (Couleur == "")? false : true;
	IsMotImg = (Img == "")? false : true;

	// On recupere les css et puces selon qu'il s'agit d'un element actif ou non
	if (Open)
	{	    
		css = this.tab_display_level[Niveau].GetCssOpen();   
	   	puce = this.tab_display_level[Niveau].GetPuceOpen();
	   	CurrentImg = Img;
	}
	else 
  	{  	    
  	    	css = this.tab_display_level[Niveau].GetCssClose();
  	 	puce = this.tab_display_level[Niveau].GetPuceClose();
  	 	CurrentImg = Img;	 
  	}
  	


	// MODIF CYL 18/12
	
	// Changer l'image quand la puce contient 'fleche bas'
	if(puce.indexOf('fleche_bas', 0) != '-1')
		CurrentImg = CurrentImg.replace('.gif', '_o.gif');

	// /MODIF
  	
  	// Si on utilise des mots images , on remplace le libelle par l'image (active ou non)  	
  	if (IsMotImg)
  	{
  		Libelle = '<img border="0" src="'+CurrentImg+'">';
  	}


	
	// On construit l'action selon qu'il s'agit d'un element qui peut se derouler ou un lien
	if (IsItem)
	{
		// On recupere la puce des liens
		puce = this.tab_display_level[Niveau].GetPuceLien();
		
		// Si le lien presente deja un ? c'est un & qu'il faut ajouter pour passer l'identifiant
		critere = /\?/;
		resultat = String(LienUrl).match(critere);
		if (resultat)
		{
			car = '&'	
		}
		Action = '<a href="'+LienUrl+car+this.id+'='+Identifiant+'" class="'+css+'">'+Libelle+'</a>';		
		var rappel = 1;
	}
	else
	{
		if(Identifiant == 3)
			Action = '<a href="/teiffel/'+ lang +'/ludique/espace_enfant/espace_enfants.html?id='+ Identifiant +'" class="'+ css +'">'+Libelle+'</a>';
		else
			Action = '<a href="#" class="'+ css +'" onMouseDown="return '+this.nom+'.New_Menu(\''+Identifiant+'\')">'+Libelle+'</a>';

		var rappel = 2;
	}
	// La couleur du niveau s'il y en a une
	if (IsCouleur)
	{
		TxtCouleur = ' bgcolor="#'+Couleur+'" ';
	}

	//alert(puce);
	if(puce.indexOf('carre', 0) != '-1' && css == 'op')
		puce = puce.replace('.gif', '_actif.gif');
	

	// On construit le html
	corps = '<table with="'+ this.largeur + '" border="0" cellspacing="0">';
	corps += '<tr with="'+ this.largeur + '">';	
	corps += '<td width="' + Tabulation1 + '" ' + TxtCouleur + 'valign="top" align="right"><img border="0" src="'+puce+'"></td>';

	corps += '<td width="' + Tabulation2 +'" '  + TxtCouleur +' class="' + css + '">'+Action+'</td>';
	corps += '</tr>';
	corps += '</table>';
	//alert(corps);
	return corps;
}




/////////////////////////////////////////////////
//
// fonction Set_Menu()
// 
// Cree le layer composant le menu
// Cherche dans l'url s'il se trouve un id representant la position courante du menu 
// Affiche le menu
//
//////////////////////////////////////////////////

function Set_Menu()
{  

   var ElementActif = 0;
   var Element = 0;
   
   // On cree le layer qui va contenir le menu  
   //createLayer('Layer1' , null, this.left, this.top, this.largeur,this.hauteur , '', this.layer_color, 'hidden');

   // On cree l'objet qui gere ce layer
   this.layer = new DynLayer("Layer1");
   
   // On recupere les parametres de l'url	
   Input = ReadParse(document.URL);
   
   if (Input[this.id])
   {   		
	// L'id inclus les ancres, les supprimer.
   	Input[this.id] = Input[this.id].replace(new RegExp("#.*"), '');   		
   	ElementActif = Input[this.id];
   		
   } 
   // On verifie que l'url ne corresponde pas a un element du menu
   else
   {
//BENCH_StartRecord("verif");   		
   		Element = this.VerifyPosition(document.URL);

//BENCH_EndRecord("verif");    			
// si aucun element trouve recommencer la recherche avec le repertoire parent   			
   		if (Element != 0)
   		{   			
   			ElementActif = Element;   			
   		}
   		
   }

   // Si un element du menu a ete repere on l'active
   if (ElementActif != 0)
   {
   		// On met les parents open et visible des parents de l'element	
		this.MakeActifParent(ElementActif);
		// On active l'element
   		this.Update_Menu(ElementActif);
   }
   this.Show_Menu();
   
}


//////////////////////////////////////////////////
//
// fonction VerifyPosition(myUrl)
// 
// 
//
//
//////////////////////////////////////////////////

function VerifyPosition(myUrl)
{
	var InfoUrl = new Array();
	var InfoRep = new Array();
	var CurrentDir = "";
	var critere;
	var Element;
	var Cpt = 0;
	
	// On recupere la position dans l'url
	critere = new RegExp("http://[^/]+",["i"]);
	resultat = String(myUrl).match(critere);
	if (resultat)
	{
		InfoUrl = myUrl.split(resultat);
		CurrentDir = BaseName(InfoUrl[1]);
//alert(CurrentDir);
		while (Cpt < this.niv_pos_recherche) 
		{
			Element = this.Test_Position(CurrentDir);
			if (Element != 0)
			{
				return Element;
			}
			else
			{
				Cpt = Cpt + 1;
				CurrentDir = BaseName(CurrentDir);	
			}
		}
	}				
	return 0;
	
}

//////////////////////////////////////////////////
//
// fonction BaseName(Name)
// 
// 
//
//
//////////////////////////////////////////////////

function BaseName(Name)
{	
	var TabName = new Array();
	var BaseName = "";
	
	TabName = Name.split('/');
	for(var i=0;i<TabName.length-1;i++)
	{
		BaseName += "/" + TabName[i];	
	}
	return BaseName;
}

//////////////////////////////////////////////////
//
// fonction Test_Position(TheUrl)
// 
// 
//
//
//////////////////////////////////////////////////

function Test_Position(ThePosition)
{	
	var ThePos2Test  = "";
	var critere  = "";
	var TheUrl  = "";
	var TheUrl2Test  = "";
	var resultat  = "";

	ThePos2Test = ThePosition.replace(/\//g,"");
	critere = new RegExp(ThePos2Test, ["i"]);

//alert("critere : " + critere);
	// Pour chaque element on verifie un correspondance
	// On parcours chaque element du menu 
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
		Id = this.tab_element_menu_inter[i];
		TheUrl = this.tab_element_menu[Id].GetUrl();
		if (TheUrl != "")
		{
			TheUrl2Test = TheUrl.replace(/\//g,"");			
			resultat = String(TheUrl2Test).match(critere);
			
			//alert(TheUrl2Test+'\n'+critere+'\n=\n'+resultat);

			if (resultat)
			{
//alert("good : " + TheUrl);

					// MODIF CYL 07/01/2008
						// Sur la home, ne pas activer le menu
						//alert(critere);
						if(critere == '/teiffelfr/i' || critere == '/(?:)/i' || critere == '/teiffel/i' || critere == '//i' || critere == '/teiffeluk/i' || critere == '/teiffel/i')
						{
							//alert('ok');
							return 0;
						}
					// / MODIF
					
				return Id;
						
			}
		}
	}
	return 0;
}




//////////////////////////////////////////////////
//
// fonction New_Menu(Id)
// 
// Met a jour le menu selon l'element qui vient d'etre clique
// Affiche le menu
//
//
//////////////////////////////////////////////////

function New_Menu(Id)
{	
	this.Update_Menu(Id);
	this.Show_Menu();
	
	return false;	
}


//////////////////////////////////////////////////
//
// fonction Update_Menu(Identifiant) 
// 
// Met a jour les variables d'etats des elements du menu
//
//
//////////////////////////////////////////////////

function Update_Menu(Identifiant)
{
	// On recupere l'etat open de ce noeud
	IsOpen = this.tab_element_menu[Identifiant].GetOpen();				
	// On recupere le niveau de cet element
	Niveau = this.tab_element_menu[Identifiant].GetNiveau();	
	// On met tous les elements de ce niveau a close (action qui met aussi les sous elements a non visible)
	this.CloseEnreg(Niveau,Identifiant);
	// On met l'etat open de ce niveau a true , action qui met aussi visible cet element et tous ses sous-elements	
	this.ToVisible(Identifiant,IsOpen);	
	
	return(0);		
}

//////////////////////////////////////////////////
//
// fonction CloseEnreg(niveau,id)
// 
// Met a jour les etats open et visible
//
//
//////////////////////////////////////////////////

function CloseEnreg(niveau,id)
{
        var LevelItem = 0;	

	// On parcours chaque element du menu 
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{		 
		 // On recupere le niveau de cet element
		 LevelItem = this.tab_element_menu[this.tab_element_menu_inter[i]].GetNiveau();
		 
		 // Si un element est egal ou superieur a ce niveau l'etat est a close et non visible
		 if (niveau <= LevelItem)
		 {
			if  (LevelItem > 0)
			{
		 		this.tab_element_menu[this.tab_element_menu_inter[i]].SetVisible(false);
		 	}
		 	this.tab_element_menu[this.tab_element_menu_inter[i]].SetOpen(false);

		 }
	}
}



//////////////////////////////////////////////////
//
// fonction ToVisible(TabCleOpen,IsOpen);	
// 
// Fonction qui met a jours les etats open et visible
//
//
//////////////////////////////////////////////////

function ToVisible(Id,IsOpen)	
{
	var LevelItem = 0;
	var Cle = "";
		
	// On recupere le niveau de cet element
	LevelItem = this.tab_element_menu[Id].GetNiveau();
	
		
        // On met ce noeud a open et visible		
	this.tab_element_menu[Id].SetVisible(true);
	this.tab_element_menu[Id].SetOpen(true);
		
	// Si le noeud etait ferme
	if (IsOpen == false)
	{		
	    	this.tab_element_menu[Id].SetOpen(true);      	    		    			
	   	this.NiveauVisible(Id,LevelItem+2);	    	    
	}
	// Si le noeud etait ouvert
	else
	{	
		this.tab_element_menu[Id].SetOpen(false);
		this.NiveauVisible(Id,LevelItem+1);			
	}		
}

//////////////////////////////////////////////////
//
// fonction NiveauVisible(Id,LevelItem) 
// 
// Met les fils et les freres de Id de niveau inferieur a LevelItem a visible
//
//
//////////////////////////////////////////////////

function NiveauVisible(Id,LevelItem)
{	
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
	 	Identifiant = this.tab_element_menu_inter[i];
	 	EstFils = this.IsFils(Identifiant,Id); 
	 	Frere = this.IsBrother(Identifiant,Id);
	 		 
	 	//if (( EstFils != null )|| (Frere) )
	 	if (( EstFils )|| (Frere) )
	 	{		 		 		 
	 		LevelItemGood =  this.tab_element_menu[Identifiant].GetNiveau() ;
   
	        	if (LevelItemGood < LevelItem)
	        	{			     	 
	     	   	 	this.tab_element_menu[Identifiant].SetVisible(true);
	        	}
	        }
	 }	
}



//////////////////////////////////////////////////
//
// fonction IsBrother(Id1,Id2)
// 
// Retourne true  si les 2 noeuds passes sont freres
// Ils sont freres sssi ils sont le meme pere
//
//////////////////////////////////////////////////


function IsBrother(Id1,Id2) 
{
	Pere1 = this.tab_element_menu[Id1].GetPere();
	Pere2 = this.tab_element_menu[Id2].GetPere();
	
	if (Pere1 == Pere2) 
	{
		return true;	
	}	
	// Il ne sont pas freres
	return false;
}       

//////////////////////////////////////////////////
//
// fonction IsFils(FilsPresume,PerePresume)
// 
// Retourne true  si FilsPresume, est bien le fils de PerePresume
//
// fonction recursive
// 
//
//////////////////////////////////////////////////


function IsFils(FilsPresume,PerePresume) 
{		
	Pere = this.tab_element_menu[FilsPresume].GetPere();
	
	// Si on arrive a la racine , c'est qu'on a pas trouve le pere
	if (Pere == -1)
	{
		return false;
	}
	else if (PerePresume == Pere)
	{
		return true;	
	}
	// On rappelle cette fonction avec le pere de FilsPresume
	else
	{
		return (this.IsFils(Pere,PerePresume));
	}		
}     


//////////////////////////////////////////////////
//
// fonction GetBrother(id)
// 
// Renvoie un tableau contenant les freres de l'element identifie par id 
//
//
//////////////////////////////////////////////////

function GetBrother(id)
{
	TabFrere = new Array();
	Frere = new Array();
	var ElementId = "";
	var LienUrl = "";
	var IsFrere = false;

	// On parcours chaque element du menu 
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
		ElementId = this.tab_element_menu_inter[i];
		IsFrere = this.IsBrother(id,ElementId);
		
		if ((IsFrere) && (id != ElementId) )
		{
			LienUrl = this.tab_element_menu[ElementId].GetUrl();
			TabFrere[TabFrere.length] = ElementId;			
		}				
	}
	
	return TabFrere;
}

//////////////////////////////////////////////////
//
// fonction SetAllPere()
// 
// Attribut pour chaque element son pere
//
//
//////////////////////////////////////////////////

function SetAllPere()
{
	// On parcours chaque element du menu 
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
		Id = this.tab_element_menu_inter[i];
		
		TabAncetre = String(Id).split(GEN_Separateur_open);
		 
		TabAncetre.length--;
		if (TabAncetre.length == 0)
		{
			//Pour les noeuds de premier niveau on met comme pere -1
			Pere = -1;
		}
		else
		{
			Pere = TabAncetre.join(GEN_Separateur_open);
		}
	
		this.tab_element_menu[Id].SetPere(Pere);
	}		
}

//////////////////////////////////////////////////
//
// fonction MakeActifParent(Id)
// 
// Met les noeuds des parents de l'element identifie par Id a open et visible 
//
//
//////////////////////////////////////////////////

function MakeActifParent(Id)
{
	var Pere = "";		
	Frere = new Array();
	
	Pere = this.tab_element_menu[Id].GetPere();

	while (Pere != -1)
	{
		this.tab_element_menu[Pere].SetVisible(true);
		this.tab_element_menu[Pere].SetOpen(true);
		// On fait la meme chose avec ses freres  
		Frere = this.GetBrother(Pere);	
		
		for(var i=0;i<Frere.length;i++)
		{	
			this.tab_element_menu[Frere[i]].SetVisible(true);	
		}		
		Pere = this.tab_element_menu[Pere].GetPere();					
	}
		
}



//////////////////////////////////////////////////
//
// fonction NS_Initialize_Layer() 
// 
// Retourne le contenu du menu.
// Utilise pour Netscape car il n'affiche pas les layers qui deborde de la fenetre.
//
//////////////////////////////////////////////////

function NS_Initialize_Layer() 
{
	var ContenuLayer = "";
	var ContenuElement = "";
	var Identifiant = "";

	
    // Pour chaque element
	for (var i=0;i<this.tab_element_menu_inter.length;i++)
	{
		
		Identifiant = this.tab_element_menu_inter[i];
		ContenuElement = this.Build_Layer(Identifiant);
		ContenuLayer += ContenuElement;
        }
	
    // On rajoute la fin du menu
    ContenuLayer += this.bottom_menu;
    return ContenuLayer;
}



//////////////////////////////////////////////////
//
// fonction NS_BuildLayer() 
// 
// Fonction qui initialise un layer avec tous les elements possibles pour que le scroll apparaisse.
// utilise pour Nestcape
// utilise le layer hauteurmax defini dans la page html
//
//////////////////////////////////////////////////

function NS_BuildLayer()
{			 
  	// On initialise le contenu du layer
  	var Retour = this.NS_Initialize_Layer();		 
  	// On ajoute au contenu du layer une table de hauteur this.top 
  	Retour += '<table><tr><td><img src="" width="32" height="'+this.top+'"></td></tr></table>';  
  	// On ecrit le layer
  	document.write('<div id="hauteurmax" style="position:absolute;visibility: hidden"; top:'+this.top+'px;>'+Retour+'</div>');        
      
}


/////////////////////// Fin Objet MENU //////////////////////////




//////////////////////////////////////////////////
//
// fonction ConvertInHtml(Chaine)
// 
// Return chaine au format html
//
//
//////////////////////////////////////////////////


function ConvertInHtml(Chaine)
{
	critere = /'/g;	
	Chaine = Chaine.replace(critere,"\\'");
	return Chaine;
}


/////////////////////////////////////////////////
//
// fonction menu()
// 
// fonction qui est appelle au chargement de la page html
//
//
//////////////////////////////////////////////////

function menu()
{  
//alert("1");	
	MyMenu.Set_Menu(); 
//alert("la");
//var retour = BENCH_PrintRecord('ms');   
//alert(retour);
//alert("2");		
//MyMenu2.Set_Menu();	
//alert("3");	
}

/////////////////////////////////////////////////
//
// fonction NS_CreateLayer()
// 
// fonction utilise pour Netscape
// fonction appelee dans la page html 
//
//
//////////////////////////////////////////////////

function NS_CreateLayer()
{  
	if (is.ns)
	{	
	//	MyMenu.NS_BuildLayer();
//MyMenu2.NS_BuildLayer();		
	}		 

}


// Creation du menu
MyMenu = new MENU('MyMenu',GEN_Layer_Color,GEN_Largeur,GEN_Hauteur,GEN_Left,GEN_Top,GEN_BottomMenu,'GEN_Tab_Element','GEN_Tab_Level','id');

// Initialisation du menu
MyMenu.Initialize_Menu(); 

// Creation du menu
//MyMenu2 = new MENU('MyMenu2',GEN_Layer_Color2,GEN_Largeur2,GEN_Left2,GEN_Top2,GEN_BottomMenu2,'GEN_Tab_Element2','GEN_Tab_Level2','id2');
// Initialisation du menu
//MyMenu2.Initialize_Menu();

     
