﻿//	Classe subMenuList
//	La classe subMenuList permet de stocker les id des sous-menus
	function subMenuList()
	{
		this._subMenus = new Array() ;
		
		this.getSubMenuName = getSubMenuName ;
		this.addSubMenuId = addSubMenuId ;
		this.getSubMenuNumber = getSubMenuNumber ;
	}

	//	Methode qui renvoie le nombre d'elements du tableau
	function getSubMenuNumber()
	{
		return this._subMenus.length ;
	}
	
	//	Methode qui pointe sur un nom de sous-menu repere par un indice
	function getSubMenuName(num)
	{
		return this._subMenus[num] ;
	}
	
	//	Methode qui ajoute un sous-menu à la liste
	function addSubMenuId(subMenu)
	{
		if (subMenu != null)
		{
			this._subMenus[this.getSubMenuNumber()] = subMenu ;	
		}
	}

// variable globale
objet = new subMenuList() ;


//	classe menuBar
//	Son rôle est de representer la barre de menus de la page
//	Une barre de menu contient plusieurs cases et est caracterisee par
//		- sa largeur
//		- sa hauteur
//		- la couleur de ses bords
//		- la couleur lorsque le curseur navigue sur la barre
//		- la couleur lorsque le curseur ne navigue plus sur la barre


	function menuBar(borderColor, cellspacing, offBgColor, onBgColor, w, h)
	{
		
		//	Attributs
		this._menuCases = new Array() ;
		this._HTMLtag = null ;
		this._borderColor = borderColor ;
		this._cellspacing = cellspacing ;
		
		this._offBgColor = offBgColor ;
		this._onBgColor = onBgColor ;
		

		this._w = w ;
		this._h = h ;
		
		
		//	Methodes
		this.getHTMLtag = getHTMLtag ;
		this.getMenuCasesNumber = getMenuCasesNumber ;
		this.getMenuCase = getMenuCase ;
		this.getBorderColor = getBorderColor ;
		this.getCellspacing = getCellspacing ;

		this.getSubMenuFromBar = getSubMenuFromBar ;
		this.getSubMenuParentCase = getSubMenuParentCase ;
		this.getOffBgColor = getOffBgColor ;
		this.getOnBgColor = getOnBgColor ;
		
		this.getHeight = getHeight ;
		this.getWidth = getWidth ;
		
		this.setHTMLtag = setHTMLtag ;
		this.addMenuCase = addMenuCase ;
		this.addSubMenu = addSubMenu ;
		
		this.generateHTMLtag = generateMenuBarHTMLtag ;
		this.printHTMLtag = printHTMLtag ;
		
	}


//	classe subMenu
//	Son rôle est de representer un sous-menu de la barre de menus
//	Un sous-menu contient plusieurs cases et est caracterise par
//		- son id
//		- ses coordonnees (x, y)
//		- sa largeur
//		- sa hauteur
//		- la couleur de ses bords
	function subMenu(id, borderColor, cellspacing, x, y, w, h)
	{
		//	Attributs
		this._subMenuCases = new Array() ;
		this._HTMLtag = null ;
		
		this._id = id ;
		
		objet.addSubMenuId(id) ;		
		
		this._x = x ;
		this._y = y ;
		
		if (document.all == null)	// salete de Netscape 7.0 ;-)
		{
			this._x -= 38 ;
			this._y -= 8 ;
		}
		
		this._w = w ;
		this._h = h ;
		
		this._borderColor = borderColor ;
		this._cellspacing = cellspacing ;

		//	Methodes		
		this.getSubMenuCasesNumber = getSubMenuCasesNumber ;
		this.getSubMenuCase  = getSubMenuCase ;
		this.getHTMLtag = getHTMLtag ;
		this.getSubMenuId = getCaseId ;
		this.getBorderColor = getBorderColor ;
		this.getCellspacing = getCellspacing ;
		this.getXpos = getXpos ;
		this.getYpos = getYpos ;
		this.getHight = getHeight ;
		this.getWidth = getWidth ;
		
		this.setHTMLtag = setHTMLtag ;
		this.setXpos = setXpos ;
		this.setYpos = setYpos ;
		
		
		this.addSubMenuCase = addSubMenuCase ;
		
		this.generateHTMLtag = generateSubMenuHTMLtag ;
		this.printHTMLtag = printHTMLtag ;
	}
	
	
//	classe menuCase
//	Son rôle est de representer une case de la barre de menus
//	Une case est caracterisee par :
//		- son id (navigation dans le document HTML)
//		- son texte (affiche dans le menu)
//		- la classe de styles qui lui est associee
//		- sa position en abscisses (optionnel)
//		- le lien pointe lors d'un clic sur la case
//		- une couleur de fond
//		- une couleur de fond lorsque la souris pointe sur la case

	function menuCase(id, text, className, link, offColor, onColor)
	{
		//	Attributs
		this._HTMLtag = null;
		
		this._id = id ;
		this._text = text ;
		this._className = className ;
		//this._x = x ;
		this._subMenu = null ;
		
		if (link == "")
		{
			this._link = "javascript:void(0)" ;
		}
		else
		{
			this._link = link ;
		}
		
		this._offColor = offColor ;
		this._onColor = onColor ;
		
		//	Methodes
		this.getHTMLtag = getHTMLtag ;
		this.getCaseId = getCaseId ;
		this.getCaseText = getCaseText ;
		this.getCaseClassName = getCaseClassName ;
		this.getCaseLink = getCaseLink ;
		this.getCaseOffColor = getCaseOffColor ;
		this.getCaseOnColor = getCaseOnColor ;
		this.getSubMenu = getSubMenu ;
		//this.getXpos = getXpos ;
		
		this.setHTMLtag = setHTMLtag ;
		//this.setSubMenuId = setSubMenuId ;
		this.addSubMenuBar = addSubMenuBar ; 
		
		this.generateHTMLtag = generateHTMLtag ;
		this.printHTMLtag = printHTMLtag ;
	}
	
//	Methodes de l'objet menuBar

		//	Methode utilisee pour ajouter une case à la barre de menus
		function addMenuCase(caseID, caseText, caseClassName, link, navigable)
		{
			
			var offBgColor = this.getOffBgColor() ;
			var onBgColor = this.getOnBgColor() ;
			if (navigable == false)
			{
				onBgColor = this.getOffBgColor() ; 
			}
			
			var newMenuCase = new menuCase(caseID, caseText, caseClassName, link, offBgColor, onBgColor) ;
			
			if (newMenuCase != null)
			{
				var len = this._menuCases.length ;
				this._menuCases[len] = newMenuCase ;
			}
		}
		
		//	Methode utilisee pour ajouter un sous-menu à une case de la barre de menus
		function addSubMenu(subMenuParentId, subMenuId, left, top, width)
		{
			var menuParentCase = this.getSubMenuParentCase(subMenuParentId) ;
			if (menuParentCase != null)
			{
				var newSubMenu = new subMenu(subMenuId, this.getBorderColor(), this.getCellspacing(), left, top, width) ;
				menuParentCase.addSubMenuBar(newSubMenu) ;
			}
		}
		
		//	Methode qui pointe sur un sous-menu de la barre repere par l'Id de sa case
		function getSubMenuFromBar(subMenuId)
		{
			var subMenu = this.getSubMenuParentCase(subMenuId) ;
			if (subMenu != null)
			{
				return subMenu.getSubMenu() ;
			}
		}
		
		//	Methode utilisee pour pointer sur une case de la barre de menus reperee par son id
		function getSubMenuParentCase(caseId)
		{
			var result = null ;
			var found = false ;
			var i = 0 ;
			var count = this.getMenuCasesNumber() ;
			var menuCase = null ;
			
			while (i < count && found == false)
			{
				menuCase = this.getMenuCase(i) ;
				if (menuCase.getCaseId() == caseId)
				{
					result = menuCase ;
					found = true ;
				}
				i++ ;
			}
			
			return result ;
		}
		
		//	Methode utilisee pour retourner la couleur de fond hors navigation
		function getOffBgColor()
		{
			return this._offBgColor ;
		}
		
		//	Methode utilisee pour retourner la couleur de fond lors de la navigation
		function getOnBgColor()
		{
			return this._onBgColor ;
		}
		
		//	Methode utilisee pour retourner le nombre de cases que contient la barre de menus
		function getMenuCasesNumber()
		{
			return this._menuCases.length ;
		}
		
		//	Methode permettant de pointer sur une case de la barre de menus reperee par un index
		function getMenuCase(num)
		{
			return this._menuCases[num] ;
		}
		
		//	Methode utilisee pour generer le tag HTML de la barre de menus
		function generateMenuBarHTMLtag()
		{
			var tmp = "<table id='barre_menus' cellspacing='" + this.getCellspacing() + "' bgcolor='" + this.getBorderColor() + "' width='" + this.getWidth() + "' height='" + this.getHeight() + "'>" ;
			tmp +="<tr>" ;
			for (i = 0 ; i < this.getMenuCasesNumber(); i++)
			{
				this.getMenuCase(i).generateHTMLtag() ;
				tmp += this.getMenuCase(i).getHTMLtag() ;
			}
			tmp += "</tr></table>" ;
		
			this.setHTMLtag(tmp) ;
		}
		
		
//	Methodes de l'objet subMenu

		//	Methode qui renvoie le nombre de cases presentes dans le sous-menu
		function getSubMenuCasesNumber()
		{
			return this._subMenuCases.length ;
		}
		
		
		//	Methode qui pointe sur une case du tableau de cases du sous-menu reperee par un indice
		function getSubMenuCase(index)
		{
			return this._subMenuCases[index] ;
		}
		
		//	Methode qui ajoute une case au sous-menu
		function addSubMenuCase(subMenuId, subMenuText, subMenuClassName, subMenuLink, navigable, bar)
		{
			var link = "javascript:void(0)" ;
			if (subMenuLink != null)
			{
				link = subMenuLink ;
			}
			
			var subMenuCase = new menuCase(subMenuId, subMenuText, subMenuClassName, link, bar.getOffBgColor(), bar.getOnBgColor()) ;
			if (subMenuCase != null)
			{
				this._subMenuCases[this.getSubMenuCasesNumber()] = subMenuCase ;
			}
		}
		
		//	Methode qui genère le tag HTML du sous-menu
		function generateSubMenuHTMLtag()
		{
			var tmp="" ;
			
			if (this.getSubMenuCasesNumber() > 0)
			{
				tmp = "<div id='" + this.getSubMenuId() + "' style=\"position:absolute; top : " + this.getYpos() + "; left : " + this.getXpos() + "; visibility : hidden \">" ;
				tmp += "<table cellspacing='" + this.getCellspacing() + "' bgcolor='" + this.getBorderColor() + "' width='" + this.getWidth() + "'>" ;
				for (i = 0 ; i < this.getSubMenuCasesNumber(); i++)
				{
					tmp += "<tr>" ;
					this.getSubMenuCase(i).generateHTMLtag() ;
					tmp += this.getSubMenuCase(i).getHTMLtag() ;
					tmp += "</tr>" ;
				}
				
				tmp += "</table>" ;
				tmp += "</div>" ;
			}
			this.setHTMLtag(tmp) ;
		}
		
//	Methodes de l'objet menuCase
	
		//	Methode utilisee pour generer le tag HTML d'une case
		function generateHTMLtag()
		{
			//var tag = "<td id='" + this.getCaseId() + "' align='center' bgcolor='" + this.getCaseOffColor() + "' onMouseOver=\"javascript:this.style.background='" + this.getCaseOnColor() + "'; setVisible('" + this.getSubMenuId() + "')\" onMouseOut=\"javascript:this.style.background='" + this.getCaseOffColor() + "'; hide('" + this.getSubMenuId() + "')\"><a class='" + this.getCaseClassName() + "' href='" + this.getCaseLink() + "'>" + this.getCaseText() + "</a></td>" ;
			var sub = this.getSubMenu() ;
			var subMenuName = "" ;
			if (sub != null)
			{
				subMenuName = sub.getSubMenuId() ;
			}
			
			var tag = "<td class='" + this._className + "' id='" + this.getCaseId() + "' bgcolor='" + this.getCaseOffColor() + "' onMouseOver=\"javascript:this.style.background='" + this.getCaseOnColor() + "';hide_all(this); setVisible('" + subMenuName + "')\" onMouseOut=\"javascript:this.style.background='" + this.getCaseOffColor() + "';\"><a class='" + this.getCaseClassName() + "' href='index.php5?page=1&choix=" + this.getCaseLink() + "'>" + this.getCaseText() + "</a></td>" ;
			this.setHTMLtag(tag) ;
		}
		
		//	Methode utilisee pour retourner l'id de la case
		function getCaseId()
		{
			return this._id ;
		}
		
		//	Methode utilisee pour retourner le texte de la case
		function getCaseText()
		{
			return this._text ;
		}
		
		//	Methode utilisee pour retourner le nom de la classe de styles de la case
		function getCaseClassName()
		{
			return this._className ;
		}

		//	Methode utilisee pour retourner le lien pointe par la case
		function getCaseLink()
		{
			return this._link ;
		}
		
		//	Methode utilisee pour retourner la couleur de fond de la case
		function getCaseOffColor()
		{
			return this._offColor ;
		}
		
		//	Methode utilisee pour retourner la couleur de fond lorsque le pointeur de la souris navigue sur la case
		function getCaseOnColor()
		{
			return this._onColor ;
		}
		
		//	Methode utilisee pour retourner le sous-menu relatif à la case
		function getSubMenu()
		{
			return this._subMenu ;
		}
		
		//	Methode utilisee pour ajouter un sous-menu à la case
		function addSubMenuBar(subMenuBar)
		{
			this._subMenu = subMenuBar ;
		}


//	Methodes generiques	
		
		//	Methode utilisee pour retourner le tag HTML de l'objet
		function getHTMLtag()
		{
			return this._HTMLtag ;
		}
		
		//	Methode utilisee pour retourner l'espacement des cellules de l'objet
		function getCellspacing()
		{
			return this._cellspacing ;
		}		
		
		//	Methode utilisee pour retourner la couleur des bords de l'objet
		function getBorderColor()
		{
			return this._borderColor ;
		}
		
		//	Methode utilisee pour retourner la position "left" de l'objet
		function getXpos()
		{
			return this._x;
		}
		
		//	Methode utilisee pour retourner la position "top" de l'objet
		function getYpos()
		{
			return this._y;
		}
	
		//	Methode utilisee pour retourner la largeur de l'objet
		function getWidth()
		{
			return this._w;
		}
		
		//	Methode utilisee pour retourner la hauteur de l'objet
		function getHeight()
		{
			return this._h;
		}
	
		//	Methode utilisee pour assigner un tag HTML à l'objet
		function setHTMLtag(tag)
		{
			if (tag != null)
			{
				this._HTMLtag = tag ;
			}
		}
		
		//	Methode utilisee pour assigner la valeur "left" de l'objet
		function setXpos(xPos)
		{
			this._x = xPos ;
		}
		
		//	Methode utilisee pour assigner la valeur "top" de l'objet
		function setYpos(yPos)
		{
			this._y = yPos ;
		}
		
		//	Methode utilisee pour ecrire le tag HTML de l'objet dans le document HTML
		function printHTMLtag()
		{
			if (this.getHTMLtag() == null)
			{
				this.generateHTMLtag() ;
			}
			
			document.write(this.getHTMLtag()) ;
		}
		
		
//	Fonctions globales

function setVisible(subMenuId)
{
	if (subMenuId && subMenuId != "")
	{
		tmp = document.getElementById(subMenuId) ;
		if (tmp != null)
		{
			tmp.style.visibility = "visible" ;
		}
	}
}

function hide(subMenuId)
{
	if (subMenuId && subMenuId != "")
	{
		tmp = document.getElementById(subMenuId) ;
		if (tmp != null)
		{
			tmp.style.visibility = "hidden" ;
		}
	}
}


//	Methode qui cache tous les sous-menus
	function hide_all(src)
	{
		if (src == null || src.id.substring(0,2) != "ss")
		{
			for (i = 0; i < objet.getSubMenuNumber(); i++)
			{
				hide(objet.getSubMenuName(i)) ;
			}
		}
	}
	
	
//	Methode qui place les sous menus
	function writeSubMenus()
	{
		var sous_menus = new Array("histoire", "résumés", "traductions", "young", "videos", "collection") ;
		var ssMenu ;
		var i ;
		var xVal = 0 ;
		for (i = 0; i < sous_menus.length; i++)
		{
			ssMenu = document.getElementById(sous_menus[i]) ;
			xVal = 0 ;
			while (ssMenu)
			{
				xVal += ssMenu.offsetLeft ;
				ssMenu = ssMenu.offsetParent ;
			}
			/* ecriture des tags HTML */
			if (sous_menus[i] != null)
			{
				menuBar.getSubMenuFromBar(sous_menus[i]).setXpos(xVal-1) ;
				menuBar.getSubMenuFromBar(sous_menus[i]).printHTMLtag() ;
			}
		}
	}
	
	function reloading()
	{
		location.reload() ;	
	}
