// @(#) $Id: menu.js,v 1.2 2005/10/11 15:55:35 tom Exp $

/**
* @package lib5
* @subpackage widgets
* @version @(#) $Id: menu.js,v 1.2 2005/10/11 15:55:35 tom Exp $
*/


function MenuItem(id)
{
// parent
	function setParentMenu(menu)
	{
		this.parentMenu=menu;
	}
	function getParentMenu()
	{
		return(this.parentMenu);
	}


// children setup
	function setMenu(menu,dir)
	{
		this.direction=dir;
		this.childMenu=menu
		this.childMenu.setParentItem(this);
	}
	function getMenu()
	{
		return(this.childMenu);
	}


// debug
	function dump()
	{
		var res="MenuItem "+this.id+"\n";
		if(this.childMenu!=null)
			res+=this.childMenu.dump();
		return(res);
	}


// event handlers
	function enter()
	{
	var o;
		if(eventObject!=null)
		{
			if(eventObject.getParentMenu()==this.parentMenu || eventObject.getParentMenu().getParentItem()==this)
			{
				if(eventObject.getMenu()!=null)
					eventObject.getMenu().popDown();
			}
			else if(eventObject!=this.parentMenu.getParentItem())
			{
				if(eventObject.getMenu()!=null)
					eventObject.getMenu().popDown();
				o=eventObject.getParentMenu();
				while(o!=this.parentMenu && o!=null)
				{
					o.popDown();
					if(o.getParentItem()!=null)
						o=o.getParentItem().getParentMenu();
					else
						o=null;
				}
			}
			eventObject=null;
		}
		if(menuWidgetTimerId!=null)
			window.clearTimeout(menuWidgetTimerId);
		menuWidgetTimerId=null;
		if(this.childMenu!=null)
			this.popUpChildMenu();
	}


	function leave()
	{
		eventObject=this;
		menuWidgetTimerId=window.setTimeout(this.id+".mouseLeft()",100);
	}


	function click()
	{
		this.mouseLeft();
	}


// event helpers
	function mouseLeft()
	{
		if(this.childMenu!=null)
			this.childMenu.popDown();
		this.popDownParentMenus();
	}

	function popDownParentMenu()
	{
		if(this.parentMenu!=null)
			this.parentMenu.popDown();
	}


	function popDownParentMenus()
	{
		var o=this.parentMenu;
		while(o!=null)
		{
			o.popDown();
			if(o.getParentItem()!=null)
				o=o.getParentItem().getParentMenu();
			else
				o=null;
		}
	}


	function popUpChildMenu()
	{
		var o,dx,dy,x0,y0,x,y,h,w,g;
		if(this.childMenu==null)
			return;
		dir=this.direction;
		var objItem=document.getElementById(this.id);
		var m=document.getElementById(this.childMenu.id);
//	js_dump(m,1);

		o=objItem;
		dx=dy=0;
		while(o.offsetParent!=null)
		{
			if(o.style.position=="absolute")
				break;
			if(o.style.position!="fixed")
			{
				dx+=o.offsetLeft;
				dy+=o.offsetTop;
			}
			o=o.offsetParent;
		}
		x0=o.offsetLeft+dx;
		y0=o.offsetTop+dy;
// Strange condition
//		x0=dx;
//		y0=dy;
		h=objItem.offsetHeight; // this item
		w=objItem.offsetWidth;
		switch(dir)
		{
			case 3: //MENU_RIGHT_DOWN:
				x=x0+w+this.xOffset-1;
				y=y0+this.yOffset;
				break;
			case 2: //MENU_RIGHT_UP:
				x=x0+w+this.xOffset-1;
				y=y0+h-m.offsetHeight-this.yOffset;
				break;
			case 1: //MENU_LEFT_DOWN:
				x=x0-m.offsetWidth-this.xOffset+1;
				y=y0+this.yOffset;
				break;
			case 0: //MENU_LEFT_UP:
				x=x0-m.offsetWidth-this.xOffset+1;
				y=y0-m.offsetHeight+h-this.yOffset;
				break;
			case 7: //MENU_BOTTOM_RIGHT:
				x=x0;
				y=y0+h-1;
				break;
			case 6: //MENU_BOTTOM_LEFT:
				x=x0+w-m.offsetWidth;
				y=y0+h-1;
				break;
			case 5: //MENU_TOP_RIGHT:
				x=x0;
				y=y0-m.offsetHeight+1;
				break;
			case 4: //MENU_TOP_LEFT:
				x=x0+w-m.offsetWidth;
				y=y0-m.offsetHeight+1;
				break;
			default:
				x=0; y=0;
				break;
		}
		this.childMenu.popUp(x,y);
	}


	this.id=id;
	this.direction=null;
	this.parentMenu=null;
	this.childMenu=null;
	this.xOffset=this.yOffset=0;

	this.setParentMenu=setParentMenu;
	this.getParentMenu=getParentMenu;
	this.setMenu=setMenu;
	this.getMenu=getMenu;
	this.enter=enter;
	this.leave=leave;
	this.click=click;
	this.popDownParentMenu=popDownParentMenu;
	this.popDownParentMenus=popDownParentMenus;
	this.mouseLeft=mouseLeft;
	this.popUpChildMenu=popUpChildMenu;
	this.dump=dump;
}


//--------------------------------------------------------------------


function Menu(id)
{

	function addMenuItem(item)
	{
		this.items[this.items.length]=item;
		item.setParentMenu(this);
	}
	function getMenuItem(pos)
	{
		if(pos>=0 && pos<this.items.length)
			return(this.items[pos]);
		return(null);
	}


	function setParentItem(item)
	{
		this.parentItem=item;
	}
	function getParentItem()
	{
		return(this.parentItem);
	}


	function popUp(x,y)
	{
		var o=document.getElementById(this.id);
		if(o!=null)
		{
			o.style.left=x+"px";
			o.style.top=y+"px";
		}
	}


	function popDown()
	{
		if(this.parentItem==null)
			return;
		var o=document.getElementById(this.id);
		if(o!=null)
		{
			o.style.left="-2000px";
			o.style.top="0px";
		}
	}


	function dump()
	{
		var res="Menu "+this.id+"\n";
		for(i in this.items)
			res+=this.items[i].dump()+"\n";
		return(res);
	}


	this.id=id;
	this.items=new Array();
	this.parentItem=null;
	menuWidgetTimerId=null;
	eventObject=null;

	this.addMenuItem=addMenuItem;
	this.getMenuItem=getMenuItem;
	this.setParentItem=setParentItem;
	this.getParentItem=getParentItem;
	this.popDown=popDown;
	this.popUp=popUp;
	this.dump=dump;
}

