//===========================================================================
// jnu2xmlmenu_c.asp
//
// Wrapper for multiple main menus
//
// Last updated by Henk de Jong 18-09-2001 21:00
//===========================================================================
// nu2XMLMenus, constructor
//===========================================================================
function nu2XMLMenus() {
	this.aMMenu = new Array();
	this.nMenuPos = null;
}

// Methods
nu2XMLMenus.prototype.init = nu2InitXMLMenu;
nu2XMLMenus.prototype.createArea = nu2CrMenuArea;
nu2XMLMenus.prototype.goto = nu2GotoMenu;
nu2XMLMenus.prototype.clrSP = nu2ClrSPM;
nu2XMLMenus.prototype.show = nu2ShowMenu;

//===========================================================================
// nu2InitXMLMenu, initialize nu2 menu system
// [sXMLMenuTag] (string) : XML Menu tag, default is NU2MENU
//===========================================================================
function nu2InitXMLMenu( sXMLMenuTag ) {
	var oMenuArea, oMenu;
	var oDoc = nu2MenuSys.XMLDocument;

	if( typeof(sXMLMenuTag) != "string" ) sXMLMenuTag = "NU2MENU";
	var oNodeList = oDoc.getElementsByTagName( sXMLMenuTag );	
	var bMCr = false;

	// nodeName = NU2MENU / MENU / MITEM	
	for( var i=0; i < oNodeList.length; ++i ) {		

		oMenu = new nu2XMLMenu();
		this.aMMenu[this.aMMenu.length] = oMenu;

		oMenuArea = this.createArea( oNodeList(i).attributes );
		if( !oMenuArea ) continue;
		document.body.appendChild( oMenuArea );
		
		oXMLM = oNodeList(i).childNodes;		
		
		for( var j=0; j < oXMLM.length; j++ ) {					
			if( oXMLM(j).nodeName != "MENU" ) continue;			
			oDivMenu = nu2CrMenuObj( oXMLM(j), this.aMMenu.length-1 );
			//oMenu.aMenu[oMenu.aMenu.length] = oDivMenu;
			oMenuArea.appendChild( oDivMenu );
			bMCr = true;
		}
	}	
	if( bMCr ) this.nMenuPos = 0;
	return true;
}

//===========================================================================
// nu2CrMenuArea, creates menu area
// oAtsNode (object) : attributes node from NU2MENU (xml element)
// returns (object) : area object (div)
//===========================================================================
function nu2CrMenuArea( oAtsNode ) {

	var oArea = document.createElement( "DIV" );
	for( var j=0; j < oAtsNode.length; j++ ) {
		switch( oAtsNode(j).nodeName .toUpperCase()) {
		case "ID" : 
			oArea.id = "_nu2ID_"+oAtsNode(j).nodeValue;
			break;
		case "TOP" : 
			oArea.style.top = oAtsNode(j).nodeValue;
			break;
		case "LEFT" :
			oArea.style.left = oAtsNode(j).nodeValue;
			break;
		}
	}
	with( oArea.style) {
		position = (top && left) ? "absolute" : "relative";
	}
	oArea.onmouseleave = function(){_nu2MObj.aMMenu[_nu2MObj.nMenuPos].clearSP();}
	return (oArea.id)?oArea:null;
}

//===========================================================================
// nu2GotoMenu, goto main menu
// nMenuPos (number) : number of main menu
//===========================================================================
function nu2GotoMenu( nMenuPos ) {
	if( nMenuPos < 0 ) return;
	if(	nMenuPos > (this.aMMenu.length-1) ) return;
	this.nMenuPos = nMenuPos;
}

//===========================================================================
// nu2ClrSPM, clears menu stackpointer for current selected main menu
//===========================================================================
function nu2ClrSPM(){
	if( this.nMenuPos < 0 ) return;
	this.aMMenu[this.nMenuPos].clearSP();	
}

//===========================================================================
// nu2ShowMenu, Show submenu for current selected main menu
// sParent (string) : name of parent menu
// sMenuName (string) : menu to show
// bHor( boolean) : true -> showmenu horizontal from parentmenu
//                  false -> showmenu vertical from parentmenu
//===========================================================================
function nu2ShowMenu( sParent, sMenuName, bHor ) {
	if( this.nMenuPos < 0 ) return;
	this.aMMenu[this.nMenuPos].handleSP( sParent, sMenuName, bHor );	
}

//===========================================================================
// nu2XMLMenu, single menusystem (one mainmenu with sub menus)
// constructor
//===========================================================================
function nu2XMLMenu() {
	this.sName = null;
	this.aSMStack = new Array();
}

// Methods
nu2XMLMenu.prototype.existsMenu = nu2ExistsMenu;
nu2XMLMenu.prototype.handleSP = nu2MSP;
nu2XMLMenu.prototype.clearSP = nu2ClrMSP;

//===========================================================================
// nu2ExistsMenu, check if menu exists in menu stack
// sMenu (string) : menu name
// returns -1 -> not found
//         > -1 position in stack
//===========================================================================
function nu2ExistsMenu( sMenu ) {
	var aSP = this.aSMStack;
	for(var i=0; i < aSP.length; i++ ) {
		if( aSP[i]==sMenu ) return i;
	}
	return -1;
}

//===========================================================================
// nu2MSP, menu stack pointer
// is menu in stack list then removes the underlaying menus
// is menu not in stack list then add menu to stack
// sMenu (object) : menu name
// bHor( boolean) : true -> showmenu horizontal from parentmenu
//                  false -> showmenu vertical from parentmenu
//===========================================================================
function nu2MSP( sParent, sMenu, bHor ) {

	if( !_nu2IsLoaded ) return;	

	// if menu exist then remove underlaying menus from stack and hide them

	var nPos = this.existsMenu( "nu2s_"+sMenu );
	var aSP = this.aSMStack;
	var aLen = aSP.length;
		
	var bFound = false;	
	if( aSP[aLen-1] != "nu2s_" + sParent ) {
		var i;
	
		for( i=0; i< aLen; i++ ) {
			if( aSP[i] == "nu2s_" + sParent ) {				
				bFound = true;
				break;
			}
		}
	
		if( bFound ) {
			// delete childmenus	
			for( var j=0; j < ((aLen - i)-1); j++ ) {
				ctsDisplayDiv( aSP.pop(), 'none' );
			}
		}		
	}

	if( sParent != sMenu ) {
		aSP.push( "nu2s_"+sMenu );
		nu2ShowSubMenu( sMenu, bHor );		
	}
			}

//===========================================================================
// nu2ClrMSP, clears all entries from menu stack pointer
//===========================================================================
function nu2ClrMSP() {
	if( !_nu2IsLoaded ) return;
	var aSP = this.aSMStack;
	while( aSP.length>0 ) {
		ctsDisplayDiv( aSP.pop(), 'none' );
	}
}


//===========================================================================
// Global functions / methods
//===========================================================================

//===========================================================================
// nu2CrMainTable, create main menu
// oMenuNode (object) : XML MENU object
// bHor (boolean) : true -> create horizontal menu
//                  false -> create vertical menu
// returns (string) : created html string
//===========================================================================
function nu2CrMainTable( oMenuNode, nMenuPos, bHor ) {
	var sHtml = "<table class=\"nu2Toolbar\">";
	
	oMItems = oMenuNode.childNodes;		
	// read menuitems
	for( var k=0; k < oMItems.length; k++ ) {		
		if( oMItems(k).nodeName != "MITEM" ) continue;				
				
		if( k==0 || !bHor ) sHtml += "<tr>"
		sHtml += "<td nowrap onmouseenter=\"_nu2MObj.goto("+nMenuPos+");_nu2MObj.clrSP();";
		// read mitem attributes
		oAts = oMItems(k).attributes;		
		for( var m=0; m < oAts.length; m++ ) {
			switch( oAts(m).nodeName.toUpperCase() ) {
			case "SHOWMENU" : 
				sHtml += "_nu2MObj.show( '_', '"+oAts(m).nodeValue+"'," + !bHor +");\">"+
						 oMItems(k).text;
				if( !bHor ) 
					sHtml += "</td><td><img src=\"gfx/r.gif\" width=6 height=9>";
				break;
			case "URL" :
				sHtml += "\"" + ((!bHor)?" colspan=\"2\"":"") +
						 "><a href=\"" + oAts(m).nodeValue+"\">"+
						 oMItems(k).text+"</a>";
				break;
			}
		}
		sHtml +="</td>";
		if( !bHor || (oMItems.length-1)==k ) sHtml += "</tr>";		
	}
	sHtml += "</table>";
	return sHtml;
}

//===========================================================================
// nu2CrMainTable, create sub menu
// oMenuNode (object) : XML MENU object
// bHor (boolean) : true -> create horizontal menu
//                  false -> create vertical menu
// returns (string) : created html string
//===========================================================================
function nu2CrSubTable( sMenuName, oMenuNode, nMenuPos, bHor ) {
	var sHtml = "<table class=\"nu2SubMenu\">";

	oMItems = oMenuNode.childNodes;		
	// read menuitems
	for( var k=0; k < oMItems.length; k++ ) {		
		if( oMItems(k).nodeName != "MITEM" ) continue;				
				
		if( k==0 || !bHor ) sHtml +="<tr>"
		sHtml += "<td nowrap onmouseenter=\"_nu2MObj.goto("+nMenuPos+");";
		// read mitem attributes
		oAts = oMItems(k).attributes;		
		for( var m=0; m < oAts.length; m++ ) {
			switch( oAts(m).nodeName.toUpperCase() ) {
			case "SHOWMENU" : 
				sHtml += "_nu2MObj.show( '"+sMenuName+"', '"+oAts(m).nodeValue+"',true);\">"+
						 oMItems(k).text + "</a></td>" +
					 	 "<td><img src=\"gfx/r.gif\" width=6 height=9>";
				break;
			case "URL" :
				sHtml += "_nu2MObj.show( '"+sMenuName+"' ,'"+sMenuName+"',false);\" colspan=\"2\">"+
					 "<a href=\"" + oAts(m).nodeValue+"\">"+
					 oMItems(k).text+"</a>";
				break;
			}
		}
		sHtml +="</td>";
		if( !bHor || (oMItems.length-1)==k ) sHtml += "</tr>";
	}
	sHtml += "</table>";
	return sHtml;
}

//===========================================================================
// nu2CrMenuObj, creates menu object (main & sub menu)
// oMenuNode (object) : XML MENU object
// returns (object) : created menu object/element (div)
//===========================================================================
function nu2CrMenuObj( oMenuNode, nMenuPos ) {

	var bHor = false;
	var bIsParentMenu = false;
	
	// create div element (menu)
	oDiv = document.createElement( "DIV" );
	oDiv.style.position = "absolute";
	with( oDiv.style ) {
		top = "0px";
		left = "0px";
	}
	var sMenuID = null;
	// read menu attributes
	oAts = oMenuNode.attributes;
	for( var i=0; i < oAts.length; i++ ) {				
		sMenuItem = oAts(i).nodeValue.toUpperCase();
		switch( oAts(i).nodeName ) {
		case "ID" : 
			sMenuID = oAts(i).nodeValue;
			oDiv.id = "nu2s_" + sMenuID
			break;
		case "VIEW" : if( sMenuItem=="HORIZONTAL" ) bHor = true;
			break;
		case "NODE" : if( sMenuItem=="PARENT" ) bIsParentMenu=true;
		}
	}
	if(!sMenuID) return null;
	if( bIsParentMenu ) {
		oDiv.style.display = "block";
		oDiv.innerHTML = nu2CrMainTable( oMenuNode, nMenuPos, bHor );
	}
	else {
		oDiv.style.display = "none";		
		oDiv.innerHTML = nu2CrSubTable( sMenuID, oMenuNode, nMenuPos, bHor );		
	}
	return oDiv;
}

//===========================================================================
// nu2GetAreaID, Area-ID for oMenuElement
// oMenuElement (object) : Menu element, (td or tr html tag)
//===========================================================================
function nu2GetAreaID( oMenuElement ) {
	var oEl = oMenuElement;
	var i=0;
	while( (oEl = oEl.parentElement) != null) {
		if( oEl.id ) {
			if( oEl.id.substr(0,7) == "_nu2ID_" ) return oEl.id;		
		}	
	}
	return null;
}

//===========================================================================
// nu2ShowSubMenu, show sub menu
// sSubmenu (string) : name of submenu
// bHor( boolean) : true -> showmenu horizontal from parentmenu
//                  false -> showmenu vertical from parentmenu
//===========================================================================
function nu2ShowSubMenu( sSubmenu, bHor ) {	
	if( !_nu2IsLoaded ) return;
	var oMenu = window.event.srcElement;
	
	if( bHor ) {
		oMenu = oMenu.parentElement;
		if( !(oMenu && oMenu.tagName=="TR") ) return;
	}
	
	var sAreaID = nu2GetAreaID( oMenu );
	if( !sAreaID ) return;

	oMenuBar = document.getElementById( sAreaID );
	var xpos = ctsGetOffsetLeft( oMenuBar );
	var ypos = ctsGetOffsetTop( oMenuBar );

	if( bHor ) {
		ypos = (ctsGetOffsetTop( oMenu )-3)-ypos;
		xpos = (ctsGetOffsetLeft( oMenu )+ oMenu.offsetWidth-2)-xpos;
	}
	else {
		ypos = (ctsGetOffsetTop( oMenu ) + oMenu.offsetHeight+2)-ypos;
		xpos = (ctsGetOffsetLeft( oMenu )-3)-xpos;
	}
	
	var oTbs = ctsFindObj( "nu2s_"+sSubmenu );
	if( oTbs ) {
		ctsSetDivPos( oTbs, xpos, ypos );
		ctsDisplayDiv( "nu2s_"+sSubmenu, 'block' );
	}
}

//===========================================================================
// nu2MenuOnload, initializes menu system
//===========================================================================
function nu2MenuOnload() {
	_nu2IsLoaded = true;
	_nu2MObj = new nu2XMLMenus();	
	_nu2MObj.init();
	// call other onloads
	_nu2MOnload();
}

var _nu2MObj = null;
var _nu2IsLoaded = false;
var _nu2MOnload = (window.onload) ? window.onload : new Function;
window.onload = nu2MenuOnload;
