/*
Version 3.21
MenuPane has parentMenuItem
MenuItem has childMenuPane
MenuItem.parentNode == <MenuItem.parentMenuPane>
Every MenuPane parent is TopMenuPane which position is static.
Implemented event propagation.
*/

function DefaultMenuItemModel()
{
	var self=new Object();
	if(document.documentElement.dir=="rtl")
		self.rtl=true;
	else
		self.rtl=false;
	self.cascadePointer="/js5/widgets/img/menucasc.gif"; // url with the image
	self.cascadePointerRtl="/js5/widgets/img/menucasc-rtl.gif";
	self.inactiveMenuItemStyle="";
	self.activeMenuItemStyle="";
	self.inactiveMenuItemClass=null;
	self.activeMenuItemClass=null;
	return(self);
}


function DefaultTopMenuItemModel()
{
	var self=new DefaultMenuItemModel();
	self.cascadePointer=null;
	self.cascadePointerRtl=null;
	return(self);
}


function DefaultMenuPaneModel() {
	var self=new Object();
	self.style="";
	self.className=null;
	return(self);
}


function DefaultTopMenuPaneModel() {
	var self=new DefaultMenuPaneModel();
	self.style=null;
	return(self);
}




function MenuItem(node) {
	var self=document.createElement("div");
	self.srcNode=node;
	self.action=null;
	self.toolTip=null;
	self.childMenuPane=null;
	self.model=null;
	self.childPopupDir=Menu.MENU_RIGHT_DOWN;



	self.setModel=function setModel(model)
	{
		self.model=model;
		if(self.model.rtl)
			self.childPopupDir=Menu.MENU_LEFT_DOWN;
		else
			self.childPopupDir=Menu.MENU_RIGHT_DOWN;
		if(self.srcNode!=null)
		{
			var n;
			if((n=self.srcNode.getAttribute("id"))!=null)
				self.itemId=n;
			if((n=self.srcNode.getAttribute("popupdir"))!=null)
				self.childPopupDir=parseInt(n);
			if((n=self.srcNode.getAttribute("inaclass"))!=null)
				self.model.inactiveMenuItemClass=n;
			if((n=self.srcNode.getAttribute("aclass"))!=null)
				self.model.activeMenuItemClass=n;
			if((n=self.srcNode.getAttribute("tooltip"))!=null && n.length>0) {
				self.toolTip=n;
				self.setAttribute("title",self.toolTip);
			}
			var cm;
			if((n=self.srcNode.style.cssText)!=null)
			{
				cm=new CssMerger(self.model.inactiveMenuItemStyle);
				cm.addCssText(n);
				self.model.inactiveMenuItemStyle=cm.cssText;
				cm=new CssMerger(self.model.activeMenuItemStyle);
				cm.addCssText(n);
				self.model.activeMenuItemStyle=cm.cssText;
			}
			if((n=self.srcNode.getAttribute("inastyle"))!=null)
			{
				cm=new CssMerger(self.model.inactiveMenuItemStyle);
				cm.addCssText(n);
				self.model.inactiveMenuItemStyle=cm.cssText;
			}
			if((n=self.srcNode.getAttribute("astyle"))!=null)
			{
				cm=new CssMerger(self.model.activeMenuItemStyle);
				cm.addCssText(n);
				self.model.activeMenuItemStyle=cm.cssText;
			}
			if((n=self.srcNode.getAttribute("cascptr"))!=null)
				self.model.cascadePointer=n;
			if((n=self.srcNode.getAttribute("cascptrrtl"))!=null)
				self.model.cascadePointerRtl=n;
		}
	}


	self.mouseOverEventHandler=function mouseOverEventHandler(e)
	{
		if(self.model.activeMenuItemStyle!=null)
			CssMerger.overwriteElementCss(self,self.model.activeMenuItemStyle);
		if(self.model.activeMenuItemClass!=null)
			self.className=self.model.activeMenuItemClass;
		self.style.cursor="pointer";
		if(e.target==self || e.srcElement==self)
		{
			if(self.toolTip!=null)
				window.status=self.toolTip;
		}
		if(self.childMenuPane!=null && !self.childMenuPane.isPoppedUp)
			self.childMenuPane.popup();

		if(self.childMenuPane!=null)
			self.childMenuPane.clearPopdown();

		e.cancelBubble=true;
		e.returnValue=false;
		try {
			self.parentNode.parentMenuItem.mouseOverEventHandler(e);
		} catch(ex) {}
		return(false);
	}


	self.mouseOutEventHandler=function mouseOutEventHandler(e)
	{
		if(self.model.inactiveMenuItemStyle!=null)
			CssMerger.overwriteElementCss(self,self.model.inactiveMenuItemStyle);
		if(self.model.inactiveMenuItemClass!=null)
			self.className=self.model.inactiveMenuItemClass;
		self.style.cursor="pointer";
		window.status="";
		if(self.childMenuPane!=null && self.childMenuPane.isPoppedUp)
			self.childMenuPane.popdown();

		e.cancelBubble=true;
		e.returnValue=false;
		try {
			self.parentNode.parentMenuItem.mouseOutEventHandler(e);
		} catch(ex) {}
		return(false);
	}


	self.clickEventHandler=function clickEventHandler(e)
	{
		self.mouseOutEventHandler(e);
		if(self.action!=null)
			self.action.clicked(e);
		e.cancelBubble=true;
		e.returnValue=false;
		return(false);
	}


	self.render=function render()
	{
		while(self.srcNode.childNodes.length>0)
			self.parseContent(self.srcNode.childNodes.item(0));
//		self.srcNode.parentNode.removeChild(self.srcNode);
		self.srcNode=null; // remove children instead
//		while(self.srcNode.firstChild!=null)
//			self.srcNode.removeChild(self.srcNode.firstChild);
		if(self.model.inactiveMenuItemStyle!=null)
			self.style.cssText=self.model.inactiveMenuItemStyle;
		if(self.model.inactiveMenuItemClass!=null)
			self.className=self.model.inactiveMenuItemClass;
		if(self.itemId!=null)
			self.setAttribute("id",self.itemId);
		self.style.cursor="pointer";
		// ie oddity
//		if(typeof(self.addEventListener)!="function")
//			CssMerger.overwriteElementCss(self,"width:100%");
		return(self);
	}


	self.addCascadePointer=function addCascadePointer() {
		if(self.childMenuPane!=null)
		{
			var img,o;
			if(!self.model.rtl && self.model.cascadePointer!=null)
			{
				self.appendChild(img=document.createElement("img"));
				img.setAttribute("src",self.model.cascadePointer);
				img.style.marginLeft = '10px';
			}
			else if(self.model.rtl && self.model.cascadePointerRtl!=null)
			{
				self.appendChild(img=document.createElement("img"));
				img.setAttribute("src",self.model.cascadePointerRtl);
			}
		}
	}


	self.parseContent=function parseContent(node)
	{
		if(node.nodeType==1 && node.nodeName=="A")
		{
			var s;
			self.action=new ActionContainer();
			if((s=node.getAttribute("href"))!=null && s.length>0)
				self.action.url=s;
			if((s=node.getAttribute("target"))!=null && s.length>0)
				self.action.target=s;
			if((s=node.getAttribute("js"))!=null)
				self.action.js=s;
			while(node.childNodes.length>0)
				self.appendChild(node.childNodes.item(0));
			node.parentNode.removeChild(node);
		}
		else
			self.appendChild(node);
	}


	self.setModel(new DefaultMenuItemModel());
	EventUtils.addEventListener(self,"mouseover",self.mouseOverEventHandler);
	EventUtils.addEventListener(self,"mouseout",self.mouseOutEventHandler);
	EventUtils.addEventListener(self,"click",self.clickEventHandler);


	return(self);
}



function TopMenuItem(node)
{
	var self=new MenuItem(node);
	self.setModel(new DefaultTopMenuItemModel());
	if(self.model.rtl)
		self.childPopupDir=Menu.MENU_BOTTOM_LEFT;
	else
		self.childPopupDir=Menu.MENU_BOTTOM_RIGHT;
	var n;
	if(node!=null && (n=node.getAttribute("popupdir"))!=null)
		self.childPopupDir=parseInt(n);

	return(self);
}







function MenuPane(node) {
	var self=document.createElement("div");
	self.srcNode=node;
	self.popdownTimerId=null;
	self.direction=Menu.MENU_VERT;
	self.menuPaneId=null;
	self.isPoppedUp=false;
	self.parentMenuItem=null;
	self.model=null;
	if(arguments.length>1)
		self.direction=arguments[1];
	var n;


	self.setModel=function setModel(model) {
		self.model=model;
		self.className=self.model.className;
		self.style.cssText=self.model.style;

		if(self.srcNode!=null)
		{
			if((n=self.srcNode.getAttribute("menudir"))!=null)
				self.direction=n;
			if((n=self.srcNode.style.cssText)!=null) {
				CssMerger.overwriteElementCss(self,n);
			}
			if((n=self.srcNode.getAttribute("class"))!=null)
				self.className=n;
			if((n=self.srcNode.getAttribute("id"))!=null)
			{
				self.menuPaneId=n;
				self.setAttribute("id",self.menuPaneId);
			}
		}

		self.style.position="absolute";
		self.style.display="none";
	}


	self.addMenuItem=function addMenuItem(item)
	{
		self.appendChild(item.render());
		if(self.direction==Menu.MENU_HORIZ)
			item.style.display="inline";
		else
			item.style.display="block";
	}



	self.popup=function popup()
	{
		var cont=self.parentMenuItem;
		var p=Conv.relative2Page(cont);
		var x,y;
		var h=cont.offsetHeight;
		var w=cont.offsetWidth;

		switch(self.parentMenuItem.childPopupDir)
		{
			case Menu.MENU_RIGHT_DOWN:
				x=p.x+w;
				y=p.y;
				break;
			case Menu.MENU_RIGHT_UP:
				x=p.x+w;
				y=p.y-self.offsetHeight+h;
				break;
			case Menu.MENU_LEFT_DOWN:
				x=p.x-self.offsetWidth;
				y=p.y;
				break;
			case Menu.MENU_LEFT_UP:
				x=p.x-self.offsetWidth;
				y=p.y-self.offsetHeight+h;
				break;
			case Menu.MENU_BOTTOM_RIGHT:
				x=p.x;
				y=p.y+h;
				break;
			case Menu.MENU_BOTTOM_LEFT:
				x=p.x+w-self.offsetWidth;
				y=p.y+h;
				break;
			case Menu.MENU_TOP_RIGHT:
				x=p.x;
				y=p.y-self.offsetHeight;
				break;
			case Menu.MENU_TOP_LEFT:
				x=p.x+w-self.offsetWidth;
				y=p.y-self.offsetHeight;
				break;
			default:
				break;
		}

		var x1=x+self.offsetWidth;
		var y1=y+self.offsetHeight;
		if(x<0)
			x=p.x+w;
		if(y<0)
			y=p.y;

		if(window.innerWidth)
		{
			if(x1>window.innerWidth)
				x=p.x-self.offsetWidth;
			if(y1>window.innerHeight)
				y=p.y-self.offsetHeight+h;
		}
		else
		{
			if(x1>document.body.offsetWidth)
				x=p.x-self.offsetWidth;
			if(y1>document.body.offsetHeight)
				y=p.y-self.offsetHeight+h;
		}

		p=Conv.page2Relative(self.offsetParent,new Point(x,y));
		self.style.display="block";
		self.style.left=p.x+"px";
		self.style.top=p.y+"px";
		self.isPoppedUp=true;
	}


	self.popdown=function popdown()
	{
		self.popdownTimerId=window.setTimeout(self.popdownTimeoutEventHandler,222,null);
	}


	self.popdownTimeoutEventHandler=function popdownTimeoutEventHandler(e)
	{
		self.style.display="none";
		self.isPoppedUp=false;
		self.popdownTimerId=null;
	}


	self.clearPopdown=function clearPopdown()
	{
		if(self.popdownTimerId!=null)
		{
			window.clearTimeout(self.popdownTimerId);
			self.popdownTimerId=null;
		}
	}


	self.setModel(new DefaultMenuPaneModel());
	return(self);
}



function TopMenuPane(node) {
	var dir=Menu.MENU_HORIZ;
	var n;
	if(node!=null && (n=node.getAttribute("menudir"))!=null)
		dir=n;
	var self=new MenuPane(node,dir);
	self.setModel(new DefaultTopMenuPaneModel());
//	js_dump(self.style);
	self.style.position="";
	self.style.display=""; // CHECK
	return(self);
}




function Menu()
{
	var self=new Object();
	self.rootNode=null;

	self.getRootNode=function getRootNode()
	{
		return(self.rootNode);
	}

	self.setRootNode=function setRootNode(node)
	{
		self.rootNode=node;
	}

	self.insertMenu=function insertMenu(contId) {
		var cont=document.getElementById(contId);
		if(cont!=null)
			cont.appendChild(self.rootNode);
	}

	return(self);
}


Menu.MENU_HORIZ=0;
Menu.MENU_VERT=1;

Menu.MENU_LEFT_UP=0;
Menu.MENU_LEFT_DOWN=1;
Menu.MENU_RIGHT_UP=2;
Menu.MENU_RIGHT_DOWN=3;
Menu.MENU_TOP_LEFT=4;
Menu.MENU_TOP_RIGHT=5;
Menu.MENU_BOTTOM_LEFT=6;
Menu.MENU_BOTTOM_RIGHT=7;



function XMLMenu(srcMenuElementId)
{
	var self=new Menu();
	self.srcMenuElement=document.getElementById(srcMenuElementId);

	self.build=function build(parentMenuItem,node) {
		if(node.nodeName=="DIV")
		{
			var menuPane;
			if(parentMenuItem==null) {
				menuPane=new TopMenuPane(node);
				self.rootNode=menuPane;
			} else {
				menuPane=new MenuPane(node);
				parentMenuItem.childMenuPane=menuPane;
				self.rootNode.appendChild(menuPane);
				menuPane.parentMenuItem=parentMenuItem;
				parentMenuItem.addCascadePointer();
			}
			var i,o,last;
			last=null;
			for(i=0;i<node.childNodes.length;i++)
			{
				o=node.childNodes.item(i);
				if(o.nodeName=="SPAN")
				{
					if(parentMenuItem==null)
						last=new TopMenuItem(o);
					else
						last=new MenuItem(o);
					menuPane.addMenuItem(last);
				}
				else if(o.nodeName=="DIV" && last!=null)
				{
					self.build(last,o);
				}
			}
		}
	}


	self.build(null,self.srcMenuElement);
	self.srcMenuElement.parentNode.removeChild(self.srcMenuElement);
	return(self);
}


