//=========================================================================== // 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 = ""; oMItems = oMenuNode.childNodes; // read menuitems for( var k=0; k < oMItems.length; k++ ) { if( oMItems(k).nodeName != "MITEM" ) continue; if( k==0 || !bHor ) sHtml += "" sHtml += ""; if( !bHor || (oMItems.length-1)==k ) sHtml += ""; } sHtml += "
"+ oMItems(k).text; if( !bHor ) sHtml += ""; break; case "URL" : sHtml += "\"" + ((!bHor)?" colspan=\"2\"":"") + ">"+ oMItems(k).text+""; break; } } sHtml +="
"; 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 = ""; oMItems = oMenuNode.childNodes; // read menuitems for( var k=0; k < oMItems.length; k++ ) { if( oMItems(k).nodeName != "MITEM" ) continue; if( k==0 || !bHor ) sHtml +="" sHtml += "" + ""; if( !bHor || (oMItems.length-1)==k ) sHtml += ""; } sHtml += "
"+ oMItems(k).text + ""; break; case "URL" : sHtml += "_nu2MObj.show( '"+sMenuName+"' ,'"+sMenuName+"',false);\" colspan=\"2\">"+ ""+ oMItems(k).text+""; break; } } sHtml +="
"; 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;