//alert("debut menu_fonction.js");

// Declaration des variables globales

GEN_Element_Menu = new Array();
GEN_Element_Menu_Inter = new Array();
GEN_Display_Level = new Array();
var GEN_MyLayer = "";

var GEN_Separateur = '###';
var GEN_Separateur_open = '_';
var GEN_NiveauMax = 0;
GEN_Tbl = new Array();

// Fin declaration des variables globales









// Proprietes d'un affichage de niveau

function DISPLAY_LEVEL(puce_open,puce_close,puce_lien,css_open,css_close,couleur,tab)
{
	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;		
}

function GetTab(niveau)
{	
	return GEN_Display_Level[niveau].tab;	
}

function GetCouleur(niveau)
{	
	return GEN_Display_Level[niveau].couleur;	
}

function GetPuceOpen(niveau)
{	
	return GEN_Display_Level[niveau].puce_open;	
}

function GetPuceClose(niveau)
{	
	return GEN_Display_Level[niveau].puce_close;	
}

function GetPuceLien(niveau)
{	
	return GEN_Display_Level[niveau].puce_lien;	
}

function GetCssOpen(niveau)
{	
	return GEN_Display_Level[niveau].css_open;	
}

function GetCssClose(niveau)
{	
	return GEN_Display_Level[niveau].css_close;	
}

// Proprietes d'un element du menu

function ELEMENT_MENU(libelle,url,niveau,open,visible)
{
	this.libelle = libelle;
	this.url = url;
	this.open = open;
	this.visible = visible;	
	this.niveau = niveau;		
}

function GetVisible(cle)
{	
	return GEN_Element_Menu[cle].visible;	
}

function GetNiveau(cle)
{	
	return GEN_Element_Menu[cle].niveau;	
}

function GetOpen(cle)
{	
	return GEN_Element_Menu[cle].open;	
}

function GetLibelle(cle)
{	
	return GEN_Element_Menu[cle].libelle;		
}

function GetUrl(cle)
{	
	return GEN_Element_Menu[cle].url;	
}

function GetPere(cle)
{	
	return GEN_Element_Menu[cle].pere;	
}


function SetLibelle(cle,libelle)
{	
	 GEN_Element_Menu[cle].libelle = libelle;		
}

function SetVisible(cle,visible)
{	
	 GEN_Element_Menu[cle].visible = visible;		
}

function SetOpen(cle,open)
{	
	 GEN_Element_Menu[cle].open = open;		
}

function SetPere(cle,pere)
{	
	 GEN_Element_Menu[cle].pere = pere;		
}



//////////////////////////////////////////////////
//
// fonction Add_Element_Menu() 
// 
// Ajoute un element au menu
//
//
//////////////////////////////////////////////////

function Add_Element_Menu(libelle,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 = GetCle(niveau);
  
    // On convertit le libelle au format html
    libelle = ConvertInHtml(libelle);             
    // On ajoute un element au tableau    
    eval("GEN_Element_Menu['" + Cle + "'] = new ELEMENT_MENU('" + libelle + "','" + url + "'," + niveau + ",false ,false);");
    
    // On cree un tableau intermediaire afin de parcourir GEN_Element_Menu
    GEN_Element_Menu_Inter[GEN_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 (GEN_Tbl[niv])
		{
			GEN_Tbl[niv]++;
		}	
		else
		{
			GEN_Tbl[niv] = 1;
		}
	}
	else
	{
		// On reinitialise le tableau GEN_Tbl
		for (var i=(niv+1);i <= GEN_NiveauMax;i++)
		{
			GEN_Tbl[i] = 0;	
		} 
		if (GEN_Tbl[niv])
		{
			GEN_Tbl[niv]++;
		}	
		else
		{
			GEN_Tbl[niv] = 1;
		}	
	}
	
	GEN_NiveauMax = niv;
	Id = GEN_Tbl[0];
	for(var j=1;j<Number(niv)+1;j++)
	{
		Id += "_" + GEN_Tbl[j];	
	}
	return Id;
}

//////////////////////////////////////////////////
//
// 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 = GetOpen(Identifiant);			
	// On recupere le niveau de cet element
	Niveau = GetNiveau(Identifiant);
	// On met tous les elements de ce niveau a close (action qui met aussi les sous elements a non visible)
	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	
	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<GEN_Element_Menu_Inter.length;i++)
	{		 
		 // On recupere le niveau de cet element
		 LevelItem = GetNiveau(GEN_Element_Menu_Inter[i]);
	
		 // Si un element est egal ou superieur a ce niveau l'etat est a close et non visible
		 if (niveau <= LevelItem)
		 {			
			if  (LevelItem > 0) 
			{			 			 				 		
		 		SetVisible(GEN_Element_Menu_Inter[i],false);
		 	}			 	
		 	SetOpen(GEN_Element_Menu_Inter[i],false);
		 }
	}
		
}







//////////////////////////////////////////////////
//
// fonction ToVisible(TabCleOpen);	
// 
// 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 = GetNiveau(Id);
		
        // On met ce noeud a open et visible	
	SetVisible(Id,true);
	SetOpen(Id,true);
		
	//Si le noeud etait ferme
	if (IsOpen == false)
	{		
	    	SetOpen(Id,true);       	    		    			
	   	NiveauVisible(Id,LevelItem+2);	    	    
	}
	//Si le noeud etait ouvert
	else
	{	
		SetOpen(Id,false);
		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<GEN_Element_Menu_Inter.length;i++)
	{
	 	Identifiant = GEN_Element_Menu_Inter[i];
	 	EstFils = IsFils(Identifiant,Id); 
	 	Frere = IsBrother(Identifiant,Id);
	 		 
	 	//if (( EstFils != null )|| (Frere) )
	 	if (( EstFils )|| (Frere) )
	 	{		 		 		 
	 		LevelItemGood = GetNiveau(Identifiant);
     
	        	if (LevelItemGood < LevelItem)
	        	{			     	 
	     	   	 	SetVisible(Identifiant,true);
	        	}
	        }
	 }	

}

//////////////////////////////////////////////////
//
// fonction Show_Menu() 
// 
// Affiche le menu
//
//
//////////////////////////////////////////////////

function Show_Menu()
{			
	var Contenu = '';
	// On parcours chaque element du menu 
	for (var i=0;i<GEN_Element_Menu_Inter.length;i++)
	{
		 Identifiant = GEN_Element_Menu_Inter[i];
		 
		 Visible = GetVisible(Identifiant);		
		 		 		 		 
		 // On affiche les element visibles	 		 	 	 	 	 	 
		 if (Visible)
		 {		 	
		 	// On construit le contenu du layer 
		 	Contenu += Build_Layer(Identifiant);		 			 			 				 			 	
		 }
	
	}	
    // On rajoute la fin du menu
	Contenu += GEN_BottomMenu;

	GEN_MyLayer.write(Contenu);
	GEN_MyLayer.show();	
}





function Build_Layer(Identifiant)
{
	
	var corps = "";
	var Lien_Image = "";
	var css = "";
	var img = "";
	var tab = 0;
			
	Visible = GetVisible(Identifiant);
	Niveau  = GetNiveau(Identifiant);
	Open    = GetOpen(Identifiant);
	Libelle = GetLibelle(Identifiant);
	LienUrl = GetUrl(Identifiant);	
		 	
	Couleur = GetCouleur(Niveau);
	Tabulation1 = GetTab(Niveau);
	Tabulation2 = GEN_Largeur - Tabulation1;
	
	IsItem = (LienUrl == "")? false : true;
	if (Open)
	{	    
	    css = GetCssOpen(Niveau);   
	   	img = GetPuceOpen(Niveau);	   
	}
	else 
  	{  	    
  	    	css = GetCssClose(Niveau);
  	  	img = GetPuceClose(Niveau);
  	}

	if (IsItem)
	{
		img = GetPuceLien(Niveau);
		Action = '<a href="'+LienUrl+'?id='+Identifiant+'" class="'+css+'">';		
		//Action = '<a href="'+LienUrl+'">';		
	}
	else
	{
		Action = '<a href="#" class="'+ css +'" onMouseDown="return new_menu(\''+Identifiant+'\')">';				
	}		
							
	corps = '<table with="'+ GEN_Largeur + '" border="0" cellspacing="0"><tr>';	
	corps += '<td width="'+Tabulation1+'" bgcolor="#'+Couleur+'" valign="top" align="right"><img border="0" src="'+img+'"></td><td width="'+Tabulation2+'" bgcolor="#'+Couleur+'" class="' + css + '">'+Action+Libelle+'</a></td>';										
	corps += '</tr></table>';
//alert(corps);
	return corps;
}

function new_menu(Id)
{	
	Update_Menu(Id);
	Show_Menu();
	return false;	
}


//////////////////////////////////////////////////
//
// fonction Initialize_Menu()
// 
// Initialisation de variables 
//
//
//////////////////////////////////////////////////

function Initialize_Menu() 
{				
	// On initialise les datas du menu
	Initialize_Data()
	
	// On attribue un pere pour chaque noeud de l'arbre
//alert("avant SetAllPere");	
	SetAllPere();
//alert("apres SetAllPere");	
	// On met tous les noeuds de niveau 0 a visible		
	Initialize_Visibility(0);
//alert("apres Initialize_Visibility");		
				
}

//////////////////////////////////////////////////
//
// 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<GEN_Element_Menu_Inter.length;i++)
	{		
		Identifiant = GEN_Element_Menu_Inter[i];
		NiveauElement = GetNiveau(Identifiant);	
		
			
		if (NiveauElement <= niveau)
		{	 			 	
		 	SetVisible(Identifiant,true);		 			 	
		 	Pere = GetPere(Identifiant);		 	
		 	if (Pere != -1)
		 	{
		 		LienUrl = GetUrl(Pere);
		 		IsItem = (LienUrl == "")? false : true;
				if (!IsItem) 
				{
					SetOpen(Pere,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 = GetPere(Id1);
	Pere2 = GetPere(Id2);
	
	if (Pere1 == Pere2) 
	{
		return true;	
	}	
	// Il ne sont pas freres
	return false;
}       

//////////////////////////////////////////////////
//
// fonction IsFils(FilsPresume,PerePresume)
// 
// Retourne true  si Fils est bien le fils de PerePresume
//
//
//////////////////////////////////////////////////


function IsFils(FilsPresume,PerePresume) 
{		
	Pere = GetPere(FilsPresume);
	
	if (Pere == -1)
	{
		return false;
	}
	else if (PerePresume == Pere)
	{
		return true;	
	}
	else
	{
		return (IsFils(Pere,PerePresume));
	}		
}     


//////////////////////////////////////////////////
//
// fonction GetBrother(id,true)
// 
// Renvoie un tableau contenant les freere de id 
//
//
//////////////////////////////////////////////////

function GetBrother(id,type)
{
	TabFrere = new Array();
	Frere = new Array();
	var ElementId = "";
	var LienUrl = "";
	var IsFrere = false;

	// On parcours chaque element du menu 
	for (var i=0;i<GEN_Element_Menu_Inter.length;i++)
	{
		ElementId = GEN_Element_Menu_Inter[i];
		IsFrere = IsBrother(id,ElementId);
		
		if ((IsFrere) && (id != ElementId) )
		{
			LienUrl = GetUrl(ElementId);
			if ( (type == 'noeud') && (!LienUrl) )
			{
				TabFrere[TabFrere.length] = ElementId;	
			}
			else if ( (type == 'feuille') && (LienUrl) )
			{
				TabFrere[TabFrere.length] = ElementId;		
			}
			else
			{
				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<GEN_Element_Menu_Inter.length;i++)
	{
		Id = GEN_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);
		}
	
		SetPere(Id,Pere);
	}		
}

//////////////////////////////////////////////////
//
// fonction MakeActifParent(Pere)
// 
// Met les noeuds des parents a open et visible 
//
//
//////////////////////////////////////////////////

function MakeActifParent(Id)
{
	var Pere = "";		
	Frere = new Array();
	
	Pere = GetPere(Id);

	while (Pere != -1)
	{
		SetVisible(Pere,true);
		SetOpen(Pere,true);
		// On fait la meme chose avec ses freres  
		Frere = GetBrother(Pere);	
		
		for(var i=0;i<Frere.length;i++)
		{	
			SetVisible(Frere[i],true);	
		}		
		Pere = GetPere(Pere);					
	}
		
}

//////////////////////////////////////////////////
//
// fonction menu()
// 
// fonction qui est appelle au chargement de la page html
//
//
//////////////////////////////////////////////////

function menu()
{       
   // On cree le layer qui va contenir le menu
   createLayer('Layer1' , null, GEN_Left, GEN_Top, GEN_Largeur,null , '', '#ffffff', 'hidden');
   
   // On cree l'objet qui gere ce layer
   GEN_MyLayer = new DynLayer("Layer1");
   
   // On recupere les parametres de l'url	
   Input = ReadParse(document.URL);
   if (Input["id"])
   {
   		// On met les parents open et visible des parents de l'element	
		MakeActifParent(Input["id"]);
		// On active l'element   	
   		Update_Menu(Input["id"]);
   } 
   Show_Menu();
}



//////////////////////////////////////////////////
//
// fonction ConvertInHtml(Chaine)
// 
// Return chaine au format html
//
//
//////////////////////////////////////////////////


function ConvertInHtml(Chaine)
{
	critere = /'/g;	
	Chaine = Chaine.replace(critere,"\\'");
	return Chaine;
}


function MM_findObj(n, d) { //v4.0
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && document.getElementById) x=document.getElementById(n); return x;
}

//////////////////////////////////////////////////
//
// fonction GetHauteurLayer(objName) 
// 
// Retourne la hauteur du layer objName
//
//
//////////////////////////////////////////////////


function GetHauteurLayer(objName) 
{ 
	
  if ((obj=MM_findObj(objName))!=null) with (obj)
    if (navigator.appName=='Netscape') 
    {
    	return clip.height
    }
    else 
    {
    	return offsetHeight
    };
}

//////////////////////////////////////////////////
//
// 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<GEN_Element_Menu_Inter.length;i++)
	{
		
		Identifiant = GEN_Element_Menu_Inter[i];
		ContenuElement = Build_Layer(Identifiant);
		ContenuLayer += ContenuElement;
        }
	
    // On rajoute la fin du menu
    ContenuLayer += GEN_BottomMenu;
    return ContenuLayer;
}


//////////////////////////////////////////////////
//
// fonction Initialize_Data() 
// 
//
//
//////////////////////////////////////////////////

function Initialize_Data() 
{
	 Tab_Data = new Array();
	


    for (var l=0;l<GEN_Tab_Element.length;l++)
	{
		
		Tab_Data = GEN_Tab_Element[l].split(GEN_Separateur);	
		Add_Element_Menu(Tab_Data[0],Tab_Data[1],Tab_Data[2]);   
    }

    // Pour chaque element
	for (var k=0;k<GEN_Tab_Level.length;k++)
	{
		
		Tab_Data = GEN_Tab_Level[k].split(GEN_Separateur);		
//alert(Tab_Data);		
		GEN_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 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_CreateLayer()
{
	if (is.ns)
	{	
   
  	var Retour = NS_Initialize_Layer(); 
    //alert(Retour);  
  	Retour += '<table><tr><td><img src="" width="32" height="'+GEN_Top+'"></td></tr></table>';
    //document.write('<div id="hauteurmax" style="position:absolute; left: 10px; top:0px;height:0px;visibility: hidden">'+Retour+'</div>');        
  	document.write('<div id="hauteurmax" style="position:absolute;visibility: hidden"; top:'+GEN_Top+'px;>'+Retour+'</div>');        
    //eval("document." + Id + ".visibility = '" + Etat + "';");	
  //document.hauteurmax.visibility = "hidden";
//document.write('<div id="hauteurmax" style="position:absolute;visibility: hidden; left: 10px; top:'+GEN_NSHeight+'px;height:0px"></div>');        
    //var Height_Layer = GetHauteurLayer('hauteurmax');
//alert(Height_Layer)  ;  
    //var TopMax = Height_Layer + GEN_Top;
//alert(TopMax);    
    //document.write('<div id="tempo" style="position:absolute;visibility: visible; left: 10px; top:'+TopMax+'px;height:0px"></div>');        
	}   
}

// Initialisation du menu
Initialize_Menu(); 



  

        

