/*////////////////////////////////////////////////////////////////////////*


		   Javascript Dropdown Menu 
				by
			   Dave Bobker
			   October 2006



*/////////////////////////////////////////////////////////////////////

	
	var m_Nodes=new Array;
	var m_root;						//root node (level=-1);
	var m_id=0;
	var m_main;
	var m_toptable;					//top table id="__toptable"
	var m_left;
	var m_top;
	var m_style;					//style= "horiz" or "vert"
	var m_tableshowing;				//id of table showing
	var m_html;						//top div innner html
	var m_currparid;
	var m_frame;					//frame to display links in
	var m_firstdiv;					//boolean=true if first menu so we don't start with "</div>"
	var m_Msgdiv;///////////////////////////
	var m_menus;					//array of all menu id's (node id's the menu has id="M_"+id
	var m_menucount;
	var m_lastcellidid;					//set oncellover, set to null on leaving all menus
	var m_lastmenuid;					//last menu id to be opened - so we can close it
	//var m_openmenus=new Array;			//list of menus to close when closemenus kicks in after timer fires				
	//var m_closeall;					//if true, close all open menus else only the last one
	var m_delay;
	var m_timer;					//the timer
	var m_timercancel;				//if true, do not close menus
	var m_DSBMenu;					//the menu container on the page

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		curleft = obj.offsetLeft;
		curtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		}
	}
	return [curleft,curtop];
}



function CreateMenu(parms){
		var x;

	//first create the root node
		m_DSBMenu=document.getElementById("DSBMenu");

		//if (m_DSBMenu==null) alert("Cannot find 'DSBMenu' element on page");

		m_root=new CreateRootNode(parms);
		m_Nodes["ROOTNODE"]=m_root;
		m_style=m_root.style;
		if (m_root.menudelay == undefined) m_delay=0;
		else m_delay=parseInt(m_root.menudelay,10);
		m_menucount=0;
		m_menus=new Array;
		m_lastcellid=null;
		m_frame=m_root.frame;
		if (m_frame !=undefined){
			x=document.getElementsByName(m_frame);
			if (x.length==0) m_frame=null;
			else m_frame=x[0];
		}
		else m_frame=null;

		if (m_frame !=null) m_frame.onmouseover=FrameOver;

		m_html="";
		m_firstdiv=999;
		m_Msgdiv=document.getElementById("Msg");			//for debugging purposes

}

	function FrameOver(){
		closeall();
	}


	function CreateRootNode(parms){

		var str1="left;top;itemwidth;itemheight;";
		var elt;
		var x;

		this.id="ROOTNODE";
		this.level=-1;
		this.lastchild=null;
		this.firstchild=null;
		var arr=parms.split(";");

		for (j=0;j<arr.length;j++){
			elt=arr[j];
			x=elt.split(":");
			if (str1.indexOf(x[0]+";") != -1){ 
				if (x[0]=="itemwidth") x[0]="width";
				if (x[0]=="itemheight") x[0]="height";
				this[x[0]]=parseInt(x[1],10);
			}
			else{
				 this[x[0]]=x[1];
			}
		}
		x=findPos(m_DSBMenu);
		this.left=x[0];
		this.top=x[1];
	}

					
	function Node(parid,parms){
		var j;
		var x;
		var a;
		var str="parent level prev id lastchild";
		var str1="left;top;itemwidth;itemheight;";
		var str2="background;background1;fontcolour;fontcolour1;icon;icon1;backimage;backimage1"//inheritable from previous node


		var parentNode;
		var prevNode;

		this.lastchild=null;	
		this.parent=parid;

		if (parid==0) {
			parentNode=m_root;
			this.parent="ROOTNODE";
		}
		else {
			parentNode=m_Nodes[parid];
			this.parent=parid;
		}

		this.level=parentNode.level+1;
		//inherit properties:  from parent if this is first, else from previous
		
		for (a in parentNode){	//inherit all parent properties
			if (str.indexOf(a)==-1) this[a]=parentNode[a];
		}

		if (parentNode.lastchild !=null){	//overwrite with prev node properties
			prevNode=m_Nodes[parentNode.lastchild];
		
			for (a in prevNode){
				if (str2.indexOf(a+";")!=-1) {
					this[a]=prevNode[a];
				}
			}
		}


		//load all properties
			
		var arr=parms.split(";");

		for (j=0;j<arr.length;j++){
			elt=arr[j];
			x=elt.split(":");


			if (str1.indexOf(x[0]+";") != -1){ 
				if (x[0]=="itemwidth") x[0]="width";
				if (x[0]=="itemheight") x[0]="height";
				this[x[0]]=parseInt(x[1],10);
			}
			else{
				 this[x[0]]=x[1];
			}
		}
		m_Nodes[this.id]=this;
		this.prev=parentNode.lastchild;
		if (this.prev==null) m_Nodes[this.parent].firstchild=this.id;
		m_Nodes[this.parent].lastchild=this.id;

	}
	



	function AddColCell(node){ 
		var prevNode;
		var parentNode=m_Nodes[node.parent];
		var parid=node.parent;

		if (node.prev==null){		//first cell in col menu
			
			if (parid=="ROOTNODE"){			//must be first cell of vertical style menu
				node.left=parentNode.left;
				node.top=parentNode.top;
			}
			else{
				if (!m_firstdiv) m_html +="</div>";		//close div if not first
				else m_firstdiv=0;		
					
				m_html +="<div id='M_" + node.parent;
				m_menus[node.parent]=true;
				

				if ((m_style=="horiz") && (parentNode.parent=="ROOTNODE")){	//DSB: amended 20-Sep-2007
			
					node.left=parentNode.left;					//do sub menu under parent cell 
					node.top=parentNode.top+parentNode.height-2;
				}
				else{
					node.left=parentNode.left + parentNode.width-3;		//do sub menu to right of menu cell
					node.top=parentNode.top;
				}

				m_html += "' style='display:none'>";

			}		
		}

		else {		//second or subsequent cell is just below previous one
			prevNode=m_Nodes[node.prev];
			node.left=prevNode.left;
			node.top=prevNode.top + prevNode.height;
		}


	      m_html +=defineHTML(node);
		

}





	function AddNode(parid,parms){			//called by page script
	
		if (parid==0){			//root level node
			node=new Node(0,parms);
			if (m_style=="horiz"){
				AddRowCell(node); //sets left, top
			}
			else{
				AddColCell(node);	//sets left, top//////////////////////

			}
		}
		else{		//parid !=0
			if (m_Nodes[parid]==undefined) alert(parid + " is not a valid id of a parent node");
			node=new Node(parid,parms);
			AddColCell(node);		//sets left, top/////////////////
		}

		
	}
	





	function EndMenu(){
		
		var elt;
		var cells;
		var j;
		var node;
		var x;
		var str;
		var arr;
		var divid;



		m_html +="</div>";

		//alert(m_html);		///////////////////////////////////////// debug //////////////////////////////////

		/*
		str=m_html;
		str=str.replace(/</g,"&lt;");
		str=str.replace(/>/g,"&gt;");
		m_Msgdiv.innerHTML=str;				////////////////////////////////////
		*/

		elt=document.getElementById("DSBMenu");
		elt.innerHTML=m_html;

		
		//next register all events including  for document

		//document.onkeydown=keydown;
	

		for (id in m_Nodes) {
			if (id !="ROOTNODE"){
				elt=document.getElementById("C_"+id);			////added 12/10/2006
				elt.onmouseover=cellover;
				elt.onmouseout=cellout;
				elt.onmousedown=celldown;
				elt =document.getElementById("I_"+id);	
				if (elt){	///////////////
					elt.onmousedown=celldown;	///////////////
					elt.onmouseover=cellover;
					elt.onmouseout=cellout;
				}
			
			}
		}
	}

	


	function AddRowCell(node) //Only called when an element in top row (style=horiz)
	{
		var prevNode;
		var parentNode=m_Nodes[node.parent];
		var parid=node.parent;

		
		if (node.prev==null){		//first cell in menu
			node.left=parentNode.left;
			node.top=parentNode.top;
		}

		else {		//second or subsequent cell is to right of previous one
			prevNode=m_Nodes[node.prev];
			node.left=prevNode.left + prevNode.width;
			node.top=prevNode.top;
		}


	      m_html +=defineHTML(node);
		
		
		


	}
	
	function defineHTML(node){
		var background=node.background;
		var backimage=node.backimage;
		var icon=node.icon;
		var fontcolour=node.fontcolour;

		// get cursor style		
		var cursor="default";
		if (node.link !=undefined) cursor="pointer";
		if (node.submit !=undefined) cursor="pointer";
		if (node.framesrc !=undefined) cursor="pointer";
		if (node.alert !=undefined) cursor="pointer";


		var p_html="<span id='C_" + node.id + "' style=\""; 		//////added 12/10/2006
		p_html += " position:absolute";
		p_html += ";width:" + node.width + "px";
		p_html += ";height:" + node.height + "px";
		p_html += ";left:" + node.left + "px";
		p_html += ";top:" + node.top + "px";
		if (node.font) p_html += ";font-family:"+node.font;			////  15 Oct 2006
		if (node.fontsize) p_html += ";font-size:"+node.fontsize;		///   15 Oct 2006
		if (node.border) p_html += ";border-width:" + node.border + "px;border-style:solid";
		if (node.bold) p_html +=";font-weight:bold";
		p_html += ";cursor:" + cursor;
		if ((backimage !=undefined) && (backimage != "none")) p_html += "; background-image:url(" + backimage + ")";
		else if ((background != undefined) && (background != "transparent")) p_html += "; background-color:"+ background;
		if (fontcolour != undefined) p_html += "; color:"+ fontcolour;
		p_html += "\">"
		if ((icon) && (icon != "none")) p_html += "<img id=\"I_" + node.id + "\" src=\"" + icon + "\" width='16px' height='16px'>";
		p_html +=  "&nbsp;" +  node.text;
		p_html +="</span>";
		return p_html;
	}		

//////////////////////////////////////////
//			DYNAMIC ROUTINES
///////////////////////////////////////

	function cellover(event){
		var menu;
		var id=this.id.substr(2,this.id.length-2);		//strip "X_" from id     
		var id1;								//source cell
		var elt;
		var node=m_Nodes[id];

		if (window.event) {		//IE
			event=window.event;
			elt=event.fromElement;
			event.cancelBubble=true;
		}

		else {
			elt=event.relatedTarget;
			event.cancelBubble=true;
		}

		if (elt.id == undefined) id1=null;
		else if (elt.id.substr(0,2)=="I_") id1=elt.id.substr(2,elt.id.length-2);
		else if (elt.id.substr(0,2)=="C_") id1=elt.id.substr(2,elt.id.length-2);
		else id1=null;

		if (id==id1) return;


		//if we are coming back in after accidentally going out - cancel timer

		m_timercancel=true;


		switchon(id);
		
		//find where you came in from

		if (id1==null){			//coming in from outside close anything not in this chain
			for (id in m_menus){
				 m_menus[id]=true;		//mark all for closing
			}
			id=node.parent;
			while (id !="ROOTNODE"){
				m_menus[id]=false;
				id=m_Nodes[id].parent;
			}
			for (id in m_menus){
				if (m_menus[id]==true){
					menu=document.getElementById("M_" + id);
					if (menu != undefined) menu.style.display="none";
				}
			}
		}
		else if (m_Nodes[id].parent==id1){ 	//coming into this node from parent node - do not close
			switchoff(id1);
			//return;			//DSB: deleted 20-Sep-2007
		} 
		else{					//coming in from a sibling or child:  close fromElement's menu if any
			switchoff(id1);
			menu=document.getElementById("M_"+id1);	
			if (menu != undefined) menu.style.display="none";
		}

		//if this node has a menu, open it

		menu=document.getElementById("M_"+node.id);	
		if (menu != undefined){
			 menu.style.display="";
		}

	}
	
	function cellout(event){
		
		var id;
		var id1;			//id1 is target id of node or null if moving out
		var elt;
		var node;

		
		var id=this.id.substr(2,this.id.length-2);		//strip "X_" from id     

		if (window.event) {		//IE
			event=window.event;
			elt=event.toElement;
			event.cancelBubble=true;
		}

		else {
			elt=event.relatedTarget;
			event.cancelBubble=true;
		}


		if (elt.id == undefined) id1=null;
		else if (elt.id.substr(0,2)=="I_") id1=elt.id.substr(2,elt.id.length-2);
		else if (elt.id.substr(0,2)=="C_") id1=elt.id.substr(2,elt.id.length-2);
		else id1=null;


		//first check if we are moving within cell i.e. from img to cell or vice versa
		//if so get out
		node=m_Nodes[id];

		if (id1==null){		//moving right out of all menus
			switchoff(id);
			closeall();
			return;
		}

		

		
	}

	function switchoff(id){
		var node=m_Nodes[id];
		var elt=document.getElementById("C_"+id);

		if (node.background !=undefined) elt.style.backgroundColor=node.background;
		if (node.fontcolour !=undefined) elt.style.color=node.fontcolour;
		if (node.icon !=undefined) {
			elt=document.getElementById("I_" + id);
			if (elt != undefined) elt.src=node.icon;
		}
	}

	function switchon(id){
		var node=m_Nodes[id];
		var elt=document.getElementById("C_"+id);

		if (node.background1 !=undefined) elt.style.backgroundColor=node.background1;
		if (node.fontcolour1 != undefined) elt.style.color=node.fontcolour1;
		if (node.icon1 !=undefined) {
			elt=document.getElementById("I_" + id);
			if (elt != undefined) elt.src=node.icon1;
		}
	}
		

	function closeall(){
		m_timercancel=false;
		m_timer=setTimeout('closemenus()',m_delay);
	}

	
	function closemenus(){
		if (m_timercancel) return;
		for (id in m_menus){
			elt=document.getElementById("M_" + id);
			elt.style.display="none";
		}
	}


	function celldown(){
		var id=this.id.substr(2,this.id.length-2);		//strip "X_" from id     
		var node=m_Nodes[id];
		var a;
		var form;
		var frameheight;
		var script;
		
		m_timercancel=false;
		closemenus();




		a=node.submit;
		if (a !=undefined){
			x=document.getElementsByTagName("FORM");
			if (x.length==0) return;
			form=x[0];
			form.action=a;
			closemenus();
			form.submit();
			return;
		}
		
		frameheight=node.frameheight;
		
		frame=node.frame;

		var a=node.link;
		if (a !=undefined){
			closemenus();
			window.location=a;
			return;
		}
		var a=node.http;
		if (a !=undefined){
			closemenus();
			window.location="http:\/\/" + a;
			return;
		}
		a=node.alert;
		if (a !=undefined){
			alert(node.alert);
			return;
		}
 		a = node.framesrc;
		if (a==undefined) return;
		if (m_frame==null) return;

		if (frameheight !=undefined){
			m_frame.height=parseInt(frameheight,10);
		}
		
		m_frame.src=a;
	}

