/*************************************************************************
  Gestion des <div> HTML statiques(Layers) et dynamiques(menu dynamique)
  Harrison & Wolf
  version : 2.0
  Date de création : 21/11/03
  Date de modification : 05/01/05
*************************************************************************/



// INITIALISATION DU SCRIPT
var menuList = new Array();
var nbMenus;
var popTimer = 0;
believeTimer=false;

if (clientIs.ns) document.captureEvents(Event.MOUSEDOWN);
document.onclick = clickHandle;

function clickHandle(evt)
{
	// Gère la chaine d'evenement (click souris)
	believeTimer=true;
	hideall();
	if (clientIs.ns) document.routeEvent(evt);
}

/*************************************************************************
  wrappers (fonctions pouvant apparaitre dans le code d'une page HTML
*************************************************************************/

/*************************************************************************
  fonctions d'ouverture de menu statiques ou dynamiques (openMenu)
*************************************************************************/

function openMenuBas(layerName,navRef)
{
	openMenuAt(layerName,navRef,0,-27);
}

function openMenuHaut(layerName,navRef)
{
	openMenuAt(layerName,navRef,0,10);
}




function openMenuAt(layerName,navRef,xoffset,yoffset)
{
	if(!navRef) return ;
	//pos = getElementPosition(navRef);
	pos = new point(navRef); // Récupère la position de l'image shim de reference. La class point se trouve dans common.js v3                                                                      
	pos.x = (!xoffset) ? 0 : xoffset;
	pos.y = (!yoffset) ? 0 : yoffset;
	
	var menuObj = getMenuByName(layerName);

	if(!menuObj) 
	{
		//alert(menuName);
		
		menuObj=new HWLAYER(layerName);		
		menuObj.setRef(layerName);
		if(!menuObj.getRef()) return ;
		registerMenu(menuObj);

	}
	
	if(!menuObj) return; 

	var layerObj = menuObj.layerObject.getStyle();
                                                                           
	if(!layerObj) // l'objet <div> n'existe pas ! Vérifiez la déclaration CSS et l'attribut id de la div
	{
		debug("La <div> (layer ou menu dynamique) '"+layerName+"' n'existe pas!");
		closeMenu('');	
		return;
	}
	
	menuObj.setPosition(pos.getPosition().x + pos.x , pos.getPosition().y + pos.y); // on repositionne le layer/menu avant son apparition

	openMenu(layerName);  // Le layer/menu apparait
}

// Fonction faisant apparaitre la <div> HTML. On peut l'utiliser seul avec des <div> statiques 
function openMenu(menuName)
{
	// Utilisation: onMouseOver="openMenu('attribut id de la <div>')"
	believeTimer = false;
	clearTimeout(popTimer);
	//LG alert("menuname= "+menuName);
	if (typeof(menuName) != "string") return;
	//if(!menuName || menuName==null) return;	
	//if(getArrayPos(lay,menuName)<0) lay[lay.length]=menuName;

 
	menuObj = getMenuByName(menuName)

	if(!menuObj) 
	{
		//alert(menuName);
		menuObj=new HWLAYER(menuName);
		menuObj.setRef(menuName);
		
		if(!menuObj.getRef()) return ;
		
		registerMenu(menuObj);
	}
	
	hideall(menuName);

	menuObj.display();
}
function closeMenu(menuName) 
{
	// Utilisation: onMouseOut="closeMenu()"
	believeTimer = true;
	if (typeof(menuName) != "string")
	//if (!menuName ||menuName==null )
		//appel venant de la page html suite à un mouseOut
		{ 
			popTimer = setTimeout("hideall()", 500);
		}
	else
		//appel du à l'ouverture d'un autre menu
		{
			hideall(menuName);
		}
}

/*************************************************************************
  fonctions internes ne devant pas apparaitre sur le document HTML
*************************************************************************/
function hideall(menuName)
{
	if (!believeTimer && (typeof(menuName) != "string") && clientIs.ns && !clientIs.ns6 && !clientIs.ns7) return false;
	
	
	if(menuName) 
	{
		var menuObj = getMenuByName(menuName);
		if(menuObj) var parentArray = menuObj.getParentArray(menuName);
		//alert(parentArray);
	}
	
	for(var i=0;i<nbMenus;i++)
	{	
		if(menuList[i].name==menuName || !menuList[i].layerObject.displayed) continue;
		//menuObj = getMenuByName(menuName);
		//alert(menuName+" "+menuList[i].getParentArray());
		if(menuObj)
			if(menuObj.isParent(menuList[i].name)) continue;
	//		if(getArrayPos(parentArray,menuList[i])>0) continue;
	//alert(menuList[i]);
		menuList[i].layerObject.hide();
	}
}



function getMenuByName(menuName)
{
	var menuObj ;
	var nbLayers = menuList.length
	var i;
	for(i=0;i<nbLayers;i++)
		if(menuList[i].name==menuName)
			return menuList[i];
	return null;
}
function registerMenu(newMenu)
{
	menuList[menuList.length] = newMenu;
	nbMenus = menuList.length;
}

/*************************************************************************
  class HWLAYER
  Definition: c'est la classe layer de base.
  Elle permet de gérer des <div id="nomDeLayer"> HTML statique(layer) ou dynamique(menu dynamique)
*************************************************************************/

function HWLAYER(name)
{ 
	this.name = name;
	this.refName =name;
	this.ref = null;
	this.visible = ((clientIs.ie || clientIs.ns6 || clientIs.ns7) ? ("visible") : "show" );
	this.hidden = ((clientIs.ie || clientIs.ns6 || clientIs.ns7) ? ("hidden") : "hide" );
	this.displayed=false;
	this.layerObject = this;
	this.getStyle = function()
	{
		if(clientIs.ns && !clientIs.ns6 && !clientIs.ns7) return this.getRef();
		//var obj = document.getElementById(this.name);
		
		return this.getRef().style;
		//return (!obj) ? null : obj.style;
	}
	this.setRef = function (refName){
		
		this.refName = refName; 	// nom de l'element de référence ( image ! layer (à tester)?! )
		//this.ref = (clientIs.ns && !clientIs.ns6) ? document.images[this.refName] : document.getElementById(this.refName) ;
		

		if(clientIs.dom)
			this.ref = document.getElementById(this.refName);
		else
			this.ref = MMNOAUTOLINK_findObj(this.refName);
			
		if(!this.ref || this.ref==null) this.ref==null;
		return this.ref;
	}
	this.getRef = function (){
	
		//if(!this.ref) this.ref = (clientIs.ns && !clientIs.ns6) ? document.images[this.refName] : document.getElementById(this.refName) ;
			
		if(!this.ref) this.setRef(this.refName);
		
		return this.ref;
	}

	this.display = function(){
		
		if (typeof(this.refName) != "string" || this.refName=="") return;
	
		//if(!this.refName || this.refName==null) return;
		
		if(!this.ref) this.setRef(this.refName);
		
		if(!this.ref) return;
		if(this.displayed) return ;
		

		this.ref.onmouseout =closeMenu;
		this.ref.onmouseover= openMenu;
		
		//this.ref.onmouseout =this.hide;
		//this.ref.onmouseover= this.display;
		var tmpStyle = this.getStyle();
		//alert("Displaying "+this.refName+"<br> "+tmpStyle.left+tmpStyle.top+" "+ this.visible);
		//if(!tmpStyle) return ;
		//this.getRef().visibility = "show"

		tmpStyle.visibility = this.visible;		
		this.displayed = true;
	}

	this.hide = function(){
		if(!this.displayed) return ;
		var tmpStyle = this.getStyle();
		//if(!tmpStyle) return ;
		tmpStyle.visibility = this.hidden;
		this.displayed = false;
	}
	this.setPosition = function(x,y){
		var tmpStyleObj = this.getStyle();
		tmpStyleObj.left = x;
		tmpStyleObj.top = y;
	}
	this.getPosition = function(){
		var tmpStyleObj = this.getStyle();
		var a = new point()
		a.x = tmpStyleObj.left ;
		a.y = tmpStyleObj.top ;
		return a;
	}
	this.getParentArray = function(){
		return null;
	}
}