/**
 *	=========================================================================================
 *   left_menu.js:
 *			display a leftmenu : a menu to be display on the left of the screen, composed
 *			of roolover dynamic images. You can click on image node to toggle the display
 *			of submenus.
 *
 *	=========================================================================================
 */

timeOutId=null;

/**
 *
 *
 *
 *
 */
function toggleNodeLf(menuName, nodeName, updateState)
{
	if (updateState)
	{
		DHTML.UpdateState('?source='+menuName+'&selectNode='+nodeName+'&noRender=true');
	}
		
	leftMenu = menuList[menuName];
  
  // ================================================
  // close all node that is not the click node.
  // ================================================
  if (leftMenu.multiOpen==false)
  {
  	clickNode = leftMenu.allNode[nodeName];
  	parentNode = clickNode.parentNode;
  	
  	for (i=0;i<parentNode.childNode.length;i++) {
      	otherNode = parentNode.childNode[i];
      	
      	if (otherNode!=clickNode)
      		otherNode.isOpen = false;
  	}
	  	
	if (clickNode.isOpen)	clickNode.isOpen=false;
	else					clickNode.isOpen=true;
  }
  else
  {
  	node=leftMenu.allNode[nodeName];
  	if (node.isOpen)	node.isOpen=false;
    else				node.isOpen=true;
  }
  
  redisplayTreeLeft(leftMenu);
}

/**
 *
 *
 *
 *
 */
function redisplayTreeLeft(actmenu)
{
  // ================================================
  // first, hide all layer node.
  // ================================================
  if (actmenu.allNode.length==0) return;
  
  for (i=0;i<actmenu.allNode.length;i++) {
  	  node = actmenu.allNode[i];
      if (node!=null) {
		 		 divname="div_"+actmenu.name + "_" + node.nodeName;
		 		 obj = DHTML.getElement(divname);
		 		 
		 		 if (obj!=null)
		 		 	DHTML.hideObj(obj);
		 		 
		 		 if (actmenu.maxChildByLevel!=-1 && node.isRoot!=null && node.childNode!=null && node.childNode.length>actmenu.maxChildByLevel)
		 		 {
		 		 	DHTML.hideObj(DHTML.getElement(divname+"_up"));
		 		 	DHTML.hideObj(DHTML.getElement(divname+"_down"));
		 		 }
		 		 
		    }
  }

      
  // ================================================
  // we have to calc the toplayer size so positionning
  // of other page elements follow the layout
  // ================================================
  actmenu.y=0;
  actmenu.x=0;
  actmenu.xmax=0; 
  
  var objr=DHTML.getElement(actmenu.name+"-topmenu");

  hideArrow(objr,actmenu, actmenu.rootNode, "down");
  hideArrow(objr,actmenu, actmenu.rootNode, "up");
  
  // ================================================
  // go to the recusive functions
  // ================================================
  // Mode relative : ne pas imposer de hauteur.
  //  DHTML.setHeight(objr, 400);
  //@todo : frdep
  // ceci pose pb dans le menu sur certains themes, car la div passe dessus la mainsection (themes wave, nuage, light par exemple) 
  // Peut etre faudrait il tester que la largeur min. est de 150, et ne le setter que dans ce cas.
  // DHTML.setWidth(objr, 140);
  _redisplayTreeLeft(objr, actmenu, actmenu.rootNode, 0);
	
  // ================================================
  // fix the top layer size
  // ================================================
  if (!actmenu.y) {
  		// On est en mode "relatif", donc ne pas definir de hauteur. La zone s'agrandi automatiquement.
  		// Sous IE, objr est parfois non defini .. on force ds ce cas la hauteur ..
		// DHTML.setHeight(objr, 300);  	
  }
  else 
  {
	  DHTML.setHeight(objr, actmenu.y);
	}
  //DHTML.setWidth(objr, actmenu.xmax);

}

/**
 *
 *
 *
 *
 */
function _redisplayTreeLeft(objr, actmenu, node, i)
{
	divname="div_"+actmenu.name +"_" + node.nodeName;
	imgname="img_"+actmenu.name +"_" + node.nodeName;
	//alert(divname);

	// not done at the first level
	x1=0;

	if (node.isRoot==false) {
		var obj  	= DHTML.getElement(divname);
		var obji 	= DHTML.getElement(node.nodeName);
		var objimg  = DHTML.getElement(imgname);
		// calc the current max x
		//if (node.parentNode.isRoot && i==0) actmenu.x+=DHTML.getWidth(obj);
		
		
		if (obj!=null)
		{
			x1=DHTML.getWidth(obj);
	
			// set this node position		
			xi = DHTML.getX(objr);
			yi = DHTML.getY(objr);
	
		
			// Dans certains cas, actmenu.y n'est pas defini dans IE et les items sont donc superposes .. 
			if (!actmenu.y) {
				// alert('ALERT : actmenu.y NAN ' + 'actmenu.name:' + actmenu.name + ' i:' + i);
  				 //setY_compat(obj, (i*10) + yi);
			}
			else {
				//setY_compat(obj, (actmenu.y) + yi);
			}
			setX_compat(obj, ((node.level-1)*actmenu.indent) + xi);
			showObj(obj);
			
			var hobj = 0;
			
			if (objimg!=null)
			{
				hobj = DHTML.getHeight(objimg)+1;
				
			}
			else
			{
				hobj = DHTML.getHeight(obj);
			}
			
			if (DHTML.getHeight(obj)>hobj*1.1)
			{
				hobj = DHTML.getHeight(obj);	
			}
			
			
			
			
			// actmenu.y+=hobj;
		}
	}
	
	x2 = 0;
	var obj  = DHTML.getElement(divname+"_sub");	
	if (obj != null)
	{
		x2 = DHTML.getWidth(obj);
		y2 = DHTML.getHeight(obj);
		
		//actmenu.y-=5;
	}
	
	// be sure to save the max x.
	if (actmenu.x+x1+10>actmenu.xmax) actmenu.xmax = actmenu.x+x1+10;
	if (actmenu.x+x2+10>actmenu.xmax) actmenu.xmax = actmenu.x+x2+10;

	// if it's node is open or isRoot, we have to recurse
	// to display the submenus.
	
	//
	if (((node.isOpen) || (node.isRoot)) && (node.childNode.length>0)) {
		var i=0;
		actmenu.x+=actmenu.indent;
		
		var firstIndex = 0;
		var lastIndex = 0;
		
		if (node.childNode!=null)
		{
			lastIndex = node.childNode.length;

			if (actmenu.maxChildByLevel!=-1 && node.childNode.length>actmenu.maxChildByLevel)
			{
				if (node.currentIndex==null)
					node.currentIndex = 0;
					
				firstIndex = firstIndex + node.currentIndex;
				lastIndex = firstIndex + actmenu.maxChildByLevel;
				if (lastIndex > node.childNode.length)
				   lastIndex = node.childNode.length;
				   
				setArrowPosition(objr, actmenu, node, "up");
			}
		}

		// walk this node subnode.
		for (i=firstIndex;i<lastIndex;i++)
		{
				cnode=node.childNode[i];
				if (cnode!=null) 
					_redisplayTreeLeft(objr, actmenu, node.childNode[i], i);
					
			
		}

		if (actmenu.maxChildByLevel!=-1 && node.childNode!=null && node.childNode.length>actmenu.maxChildByLevel)
		{
			setArrowPosition(objr, actmenu, node, "down");
		}		
		

	}
	
	
}

function hideArrow(objr, actmenu, node, suffix)
{
	divname="div_" + actmenu.name + "_" + node.nodeName + "_" +  suffix;
	var obj  = DHTML.getElement(divname);

	DHTML.hideObj(obj);
	DHTML.setStyle(obj, "display", "'none'");
	DHTML.setHeight(obj, 0);
}


function setArrowPosition(objr, actmenu, node, suffix)
{
	divname="div_" + actmenu.name + "_" + node.nodeName + "_" +  suffix;
	var obj  = DHTML.getElement(divname);

	//if (obj==null) return;
	// set this node position		
	xi = DHTML.getX(objr);
	yi = DHTML.getY(objr);
	
	setY_compat(obj, (actmenu.y) + yi);
	setX_compat(obj, ((node.level-1)*actmenu.indent) + xi + 80);
	DHTML.showObj(obj);
	
	// next node will be display above this layer, calc next y
	//actmenu.y+=DHTML.getHeight(obj);	
}

function moveMenu(sens, nodeName, menuName)
{
	leftMenu = menuList[menuName];
	
	clickNode = leftMenu.allNode[nodeName];
	clickNode.currentIndex = clickNode.currentIndex + sens;
	
	if (clickNode.currentIndex<0) clickNode.currentIndex = 0;
	
	if (clickNode.currentIndex + leftMenu.maxChildByLevel > clickNode.childNode.length)
		clickNode.currentIndex = clickNode.childNode.length - leftMenu.maxChildByLevel;
		
	
	redisplayTreeLeft(leftMenu);
	if (timeOutId!=null) window.clearTimeout(timeOutId);
	timeOutId = window.setTimeout(moveMenu2, 10);
	timeOutSens = sens;
	timeOutNodeName = nodeName;
	timeOutMenuName = menuName;
}

function moveMenu2()
{
	moveMenu(timeOutSens, timeOutNodeName, timeOutMenuName);
	if (timeOutId!=null) window.clearTimeout(timeOutId);
	timeOutId = window.setTimeout(moveMenu2, 10);
}

function stopMenu()
{
	window.clearTimeout(timeOutId);
}




