HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/PHerau/toptennisteam.be/wwwroot/js/dnn.controls.dnnmenu.js
//BEGIN [Needed in case scripts load out of order]
if (typeof(dnn_control) == 'undefined')
	eval('function dnn_control() {}')
//END [Needed in case scripts load out of order]

dnn_control.prototype.initMenu = function (oCtl) 
{
	dnn.extend(dnn.controls.DNNMenuNode.prototype, new dnn.controls.DNNNode);

	if (oCtl)
	{
		dnn.controls.controls[oCtl.id] = new dnn.controls.DNNMenu(oCtl);
		dnn.controls.controls[oCtl.id].generateMenuHTML();
		return dnn.controls.controls[oCtl.id];
	}
}

//------- Constructor -------//
dnn_control.prototype.DNNMenu = function (o)
{
	this.ns = o.id;               //stores namespace for menu
	this.container = o;                    //stores container

	//--- Data Properties ---//  
	this.DOM = new dnn.xml.createDocument();
	this.DOM.loadXml(dnn.getVar(o.id + '_xml'));

	//--- Appearance Properties ---//
	this.mbcss = dnn.dom.getAttr(o, 'mbcss', '');
	this.mcss = dnn.dom.getAttr(o, 'mcss', '');
	this.css = dnn.dom.getAttr(o, 'css', '');
	this.cssChild = dnn.dom.getAttr(o, 'csschild', '');
	this.cssHover = dnn.dom.getAttr(o, 'csshover', '');
	this.cssSel = dnn.dom.getAttr(o, 'csssel', '');
	this.cssIcon = dnn.dom.getAttr(o, 'cssicon', '');

	this.sysImgPath = dnn.dom.getAttr(o, 'sysimgpath', '');
	this.imagePaths = dnn.dom.getAttr(o, 'imagepaths', '').split(',');
	this.imageList = dnn.dom.getAttr(o, 'imagelist', '').split(',');
	for (var i=0; i<this.imageList.length; i++)
	{
		var iPos = this.imageList[i].indexOf(']');
		if (iPos > -1)
			this.imageList[i] = this.imagePaths[this.imageList[i].substring(1, iPos)] + this.imageList[i].substring(iPos+1);
	}
	this.urlList = dnn.dom.getAttr(o, 'urllist', '').split(',');
	
	this.workImg = dnn.dom.getAttr(o, 'workimg', 'dnnanim.gif');	
	this.rootArrow = dnn.dom.getAttr(o, 'rarrowimg', '');
	this.childArrow = dnn.dom.getAttr(o, 'carrowimg', '');
	this.target = dnn.dom.getAttr(o, 'target', '');	
	this.defaultJS = dnn.dom.getAttr(o, 'js', '');	
	this.postBack = dnn.dom.getAttr(o, 'postback', '');
	this.callBack = dnn.dom.getAttr(o, 'callback', '');
	this.callBackStatFunc = dnn.dom.getAttr(o, 'callbacksf', '');
	this.selMenuNode=null;  
	this.rootNode = null;	
	this.orient = new Number(dnn.dom.getAttr(o, 'orient', dnn.controls.orient.horizontal));
	this.suborient = new Number(dnn.dom.getAttr(o, 'suborient', dnn.controls.orient.vertical));
	
	this.openMenus = new Array();
	this.moutDelay = dnn.dom.getAttr(o, 'moutdelay', 500);
	this.minDelay = new Number(dnn.dom.getAttr(o, 'mindelay', 250));

	this.anim = dnn.dom.getAttr(o, 'anim', '');	//expand
	this.useTables = (dnn.dom.getAttr(o, 'usetables', '1') == '1');
	this.enablePostbackState = (dnn.dom.getAttr(o, 'enablepbstate', '0') == '1');
	this.enablePostbackState = true;//F5 in FireFox seems to need this on...  for now always set to true until can provide a workaround.
	this.podInProgress = false;
	
	this.keyboardAccess = (dnn.dom.getAttr(o, 'kbaccess', '1') == '1');
	
	this.childControls = null;

	this.hoverMenuNode = null;
	this.selMenuNode=null;  
	this.rootNode = null;	
	if (this.keyboardAccess)
	{
	
		if (this.container.tabIndex <= 0)
		{
			this.container.tabIndex = 0;
			dnn.dom.addSafeHandler(this.container, 'onkeydown', this, 'keyboardHandler');
			dnn.dom.addSafeHandler(this.container, 'onfocus', this, 'focusHandler');
			dnn.dom.addSafeHandler(this.container, 'onblur', this, 'blurHandler');
		}
		else
		{
			var oTxt = document.createElement('input');
			oTxt.type = 'text';
			oTxt.style.width = 0;
			oTxt.style.height = 0;
			oTxt.style.background = 'transparent';
			oTxt.style.border = 0;
			oTxt.style.positioning = 'absolute';	
			if (dnn.dom.browser.isType(dnn.dom.browser.Safari))
			{
				oTxt.style.width = 1;	//safari doesn't like zero
				oTxt.style.height = 1;	
				dnn.dom.addSafeHandler(oTxt, 'onkeydown', this, 'keyboardHandler'); //'keydownHandler'); 
				dnn.dom.addSafeHandler(this.container.parentNode, 'onkeypress', this, 'safariKeyHandler');	//in order to cancel RETURN (if attach keypress to oTxt, Safari crashes...
			}
			else
				dnn.dom.addSafeHandler(oTxt, 'onkeypress', this, 'keyboardHandler');	
			dnn.dom.addSafeHandler(oTxt, 'onfocus', this, 'focusHandler');
			dnn.dom.addSafeHandler(oTxt, 'onblur', this, 'blurHandler');

			this.container.parentNode.appendChild(oTxt);
		}
	}
}

dnn_control.prototype.DNNMenu.prototype = 
{

//--- Generates menu HTML ---//
getXml: function () 
{
	return this.DOM.getXml();
},

generateMenuHTML: function() 
{
	this.childControls = new Array();
	this.rootNode = this.DOM.rootNode();
	this.container.className = this.mbcss;	

	for (var i=0; i<this.rootNode.childNodeCount(); i++)
		this.renderNode(this.rootNode.childNodes(i), this.container);

	this.update();		
},

renderNode: function(oNode, oCtr)
{
	var oMNode = new dnn.controls.DNNMenuNode(oNode);
	
	if (oMNode.selected)
		this.selMenuNode = oMNode;
	
	var oMBuilder;	
	if (this.useTables && oMNode.level > 0 && this.isNodeVertical(oMNode)) 
		oMBuilder = new dnn.controls.DNNMenuTableBuilder(this, oMNode, oCtr);		
	else
		oMBuilder = new dnn.controls.DNNMenuBuilder(this, oMNode, oCtr);

	if (this.isNodeVertical(oMNode))
		oMBuilder.newRow();

	oMBuilder.newCont();

	if (oMNode.lhtml.length > 0)
		oMBuilder.appendChild(this.renderCustomHTML(oMNode.lhtml));

	var oIcn = this.renderIcon(oMNode);
	oMBuilder.appendChild(oIcn);	//render icon
	if (this.useTables == false || oMNode.level == 0)
		oIcn.className = (oMNode.cssIcon.length > 0 ? oMNode.cssIcon : this.cssIcon);
	else	
		oMBuilder.subcont.className = (oMNode.cssIcon.length > 0 ? oMNode.cssIcon : this.cssIcon);	//assign style to container of icon

	if (oMNode.isBreak == false)
		oMBuilder.appendChild(this.renderText(oMNode), true);	//render text
		
	oMBuilder.newCell();			
	this.renderArrow(oMNode, oMBuilder.subcont);

	if (oMNode.rhtml.length > 0)
		oMBuilder.appendChild(this.renderCustomHTML(oMNode.rhtml));
				
	if (oMNode.toolTip.length > 0)
		oMBuilder.row.title = oMNode.toolTip;

	this.assignCss(oMNode);
	
	if (oMNode.enabled)
		dnn.dom.addSafeHandler(oMBuilder.row, 'onclick', this, 'nodeTextClick');
	
	dnn.dom.addSafeHandler(oMBuilder.row, 'onmouseover', this, 'nodeMOver');
	dnn.dom.addSafeHandler(oMBuilder.row, 'onmouseout', this, 'nodeMOut');
	dnn.dom.addSafeHandler(oMBuilder.container, 'onmouseover', this, 'menuMOver');
	dnn.dom.addSafeHandler(oMBuilder.container, 'onmouseout', this, 'menuMOut');

	if (oMNode.hasNodes || oMNode.hasPendingNodes)	//if node has children render container and hide if necessary
	{
		var oSub = this.renderSubMenu(oMNode);
		this.container.appendChild(oSub);
		
		for (var i=0; i<oNode.childNodeCount(); i++)	//recursively call child rendering
			this.renderNode(oNode.childNodes(i), oSub);
	}				
},

renderCustomHTML: function (sHTML) 
{
	var oCtr = dnn.dom.createElement('span');
	oCtr.innerHTML = sHTML;
	return oCtr;	
},

renderIcon: function (oMNode) 
{
	var oCtr = dnn.dom.createElement('span');
	if (oMNode.imageIndex > -1 || oMNode.image != '')
	{
		var oImg = this.createChildControl('img', oMNode.id, 'icn');
		oImg.src = (oMNode.image.length > 0 ? oMNode.image : this.imageList[oMNode.imageIndex]);
		oCtr.appendChild(oImg);
	}
	
	return oCtr;
},

renderArrow: function (oMNode, oCont) 
{
	if (oMNode.hasNodes || oMNode.hasPendingNodes)
	{
		var sImg = (oMNode.level == 0 ? this.rootArrow : this.childArrow);
		if (sImg.length > 0)
		{
			if (this.useTables && oMNode.level > 0)	//do not require tables to need special padding to properly show arrow, place a real image there and have browser space it appropriately
			{
				var oImg = dnn.dom.createElement('img');
				oImg.src = sImg;
				oCont.appendChild(oImg);			
			}
			else
			{
				oCont.style.backgroundImage = 'url(' + sImg + ')';
				oCont.style.backgroundRepeat = 'no-repeat';
				oCont.style.backgroundPosition = 'right';			
			}
		}
	}
},

renderText: function (oMNode) 
{
	var oCtr = this.createChildControl('span', oMNode.id, 't');
	oCtr.innerHTML = oMNode.text;	
	oCtr.style.cursor = 'pointer';		
	return oCtr;
},

renderSubMenu: function(oMNode)
{
	var oMBuilder;
	if (this.suborient == dnn.controls.orient.vertical) // (this.useTables)
		oMBuilder = new dnn.controls.DNNMenuTableBuilder(this, oMNode);		
	else
		oMBuilder = new dnn.controls.DNNMenuBuilder(this, oMNode);
	
	var oSub = oMBuilder.createSubMenu();
	oSub.style.position = 'absolute';
	oSub.style.display = 'none';
	oSub.className = this.mcss;
	return oSub;
},

//---- Methods ---//
hoverNode: function (oMNode) 
{
	if (this.hoverMenuNode != null)
	{
		this.hoverMenuNode.hover = false;
		this.assignCss(this.hoverMenuNode);
	}
	if (oMNode != null)
	{
		oMNode.hover = true;
		this.assignCss(oMNode);
	}
	this.hoverMenuNode = oMNode;
},

__expandNode: function (oContext) 
{
	this.expandNode(oContext, true);
},

expandNode: function (oMNode, bForce) 
{
	dnn.cancelDelay(this.ns + 'min');
		
	if (oMNode.hasPendingNodes)
	{
		if (this.podInProgress == false)
		{
			this.podInProgress = true;
			this.showWorkImage(oMNode, true);
			oMNode.menu = this;	//need to give reference back to self
			
			if (this.callBack.indexOf('[NODEXML]') > -1)
				eval(this.callBack.replace('[NODEXML]', dnn.escapeForEval(oMNode.node.getXml())));
			else
				eval(this.callBack.replace('[NODEID]', oMNode.id));
		}
	}
	else
	{
		if (this.minDelay == 0 || bForce)	
		{
			this.hideMenus(new dnn.controls.DNNMenuNode(oMNode.node.parentNode()));	//MinDelay???
			var oSub = this.getChildControl(oMNode.id, 'sub');
			if (oSub != null)
			{
				this.positionMenu(oMNode, oSub);
				this.showSubMenu(oSub, true);				
				this.openMenus[this.openMenus.length] = oMNode;
			}
		}
		else
			dnn.doDelay(this.ns + 'min', this.minDelay, dnn.createDelegate(this, this.__expandNode), oMNode);
	}
	return true;
},

showSubMenu: function(oSub, bShow)
{
	oSub.style.display = (bShow ? '' : 'none');
	dnn.dom.positioning.placeOnTop(oSub, bShow, this.sysImgPath + 'spacer.gif');
},

showWorkImage: function (oMNode, bShow)
{
	if (this.workImg != null)
	{
		var oIcn = this.getChildControl(oMNode.id, 'icn');	
		if (oIcn != null)
		{
			if (bShow)
				oIcn.src = this.sysImgPath + this.workImg;
			else
				oIcn.src = (oMNode.image.length > 0 ? oMNode.image : this.imageList[oMNode.imageIndex]);
		}
	}

},

isNodeVertical: function (oMNode)
{
	return ((oMNode.level == 0 && this.orient == dnn.controls.orient.vertical) || (oMNode.level > 0 && this.suborient == dnn.controls.orient.vertical));
},

hideMenus: function (oMNode) 
{
	for (var i=this.openMenus.length-1; i>=0; i--)
	{
		if (oMNode != null && this.openMenus[i].id == oMNode.id)
			break;
		this.collapseNode(this.openMenus[i]);
		this.openMenus.length = this.openMenus.length-1;
	}
},

collapseNode: function (oMNode) 
{
	var oSub = this.getChildControl(oMNode.id, 'sub');
	if (oSub != null)
	{
		this.showSubMenu(oSub, false);
		oMNode.expanded = null;
		oMNode.update();
		this.update();
		return true;
	}
},

positionMenu: function (oMNode, oMenu)
{
	var oPCtl = this.getChildControl(oMNode.id, 'ctr');
	if (dnn.dom.browser.isType(dnn.dom.browser.Safari, dnn.dom.browser.Opera))
	{
		if (oPCtl.tagName == 'TR' && oPCtl.childNodes.length > 0)
			oPCtl = oPCtl.childNodes[oPCtl.childNodes.length-1];	//fix for Safari... use TD instead of TR
	}
		
	var oPDims = new dnn.dom.positioning.dims(oPCtl);
	var oMDims = new dnn.dom.positioning.dims(oMenu);
	var iScrollLeft = dnn.dom.positioning.bodyScrollLeft();
	var iScrollTop = dnn.dom.positioning.bodyScrollTop()
	//Max = ViewPort + Scroll - Menu's relative offset
	var iMaxTop = dnn.dom.positioning.viewPortHeight() + iScrollTop - oPDims.rot;	
	var iMaxLeft = dnn.dom.positioning.viewPortWidth() + iScrollLeft - oPDims.rol;	
	var iNewTop = oPDims.t;
	var iNewLeft = oPDims.l;
	var iStartTop = oPDims.t;
	var iStartLeft = oPDims.l;

	if (this.isNodeVertical(oMNode))
	{
		iNewLeft = oPDims.l + oPDims.w;
		iStartTop = iMaxTop;
	}
	else
	{
		iNewTop = oPDims.t + oPDims.h;
		iStartLeft = iMaxLeft;
	}	
		
	if (iNewTop + oMDims.h >= iMaxTop)	//if menu doesn't fit below...
	{
		if (oPDims.rot + iStartTop - oMDims.h > iScrollTop)	//see if it fits above
			iNewTop = iStartTop - oMDims.h;
		//else						//cause menu to scroll...
	}
	
	if (iNewLeft + oMDims.w > iMaxLeft)	//if menu doesn't fit to right
	{
		if (oPDims.rol + iStartLeft - oMDims.w > iScrollLeft)  //see if it fits to left
			iNewLeft = iStartLeft - oMDims.w;
	}

	//horizontal submenus
	if (this.suborient == dnn.controls.orient.horizontal && this.isNodeVertical(oMNode) == false)
	{
		var oRDims = new dnn.dom.positioning.dims(this.container);
		iNewLeft = oRDims.l;	
	}
	oMenu.style.top = iNewTop + 'px';
	oMenu.style.left = iNewLeft + 'px';
},

selectNode: function (oMNode) 
{		
	if (this.selMenuNode != null)	//unselect previously selected node
	{
		this.selMenuNode.selected = null;
		this.selMenuNode.update('selected');
		this.assignCss(this.selMenuNode);
	}		
	
	oMNode.selected = (oMNode.selected ? null : true);
	oMNode.update('selected');
	this.assignCss(oMNode);
	
	this.selMenuNode = oMNode;
	this.update();

	if (oMNode.hasNodes || oMNode.hasPendingNodes)
		this.expandNode(oMNode, true);	//force display

	if (oMNode.selected)
	{
		var sJS = this.defaultJS;
		if (oMNode.js.length > 0)
			sJS = oMNode.js;
		
		this.enablePostbackState = true; 
		this.update();	//update xml even if enablePostbackState = false
		
		if (sJS.length > 0)
		{
			if (eval(sJS) == false)
				return;	//don't do postback if returns false
		}
		
		if (oMNode.clickAction == dnn.controls.action.postback)
			eval(this.postBack.replace('[NODEID]', oMNode.id));
		else if (oMNode.clickAction == dnn.controls.action.nav)
			dnn.dom.navigate(oMNode.getUrl(this), oMNode.target.length > 0 ? oMNode.target : this.target);
	}
	return true;		
},

assignCss: function (oMNode)
{
	var oCtr = this.getChildControl(oMNode.id, 'ctr');		
	var sCss = this.css;

	if (oMNode.level > 0 && this.cssChild.length > 0)
		sCss = this.cssChild;

	if (oMNode.css.length > 0)
		sCss = oMNode.css;

	if (oMNode.hover)
		sCss += ' ' + (oMNode.cssHover.length > 0 ? oMNode.cssHover : this.cssHover);
	if (oMNode.selected)
		sCss += ' ' + (oMNode.cssSel.length > 0 ? oMNode.cssSel : this.cssSel);
	
	oCtr.className = sCss;
},

update: function (bForce) 
{
	if (this.enablePostbackState || bForce)
		dnn.setVar(this.ns + '_xml', this.DOM.getXml());
	else
		dnn.setVar(this.ns + '_xml', '');
	return true;
},

//--- Event Handlers ---//
focusHandler: function (e) 
{
	var oMNode = this.hoverMenuNode;
	if (oMNode == null)
		oMNode = this.selMenuNode;
	if (oMNode == null)
		oMNode = new dnn.controls.DNNMenuNode(this.rootNode.childNodes(0));
	this.hoverNode(oMNode);
	this.container.onfocus = null;
},

blurHandler: function (e)
{
	if (this.hoverMenuNode != null)
		this.hoverNode(null);

	dnn.cancelDelay(this.ns + 'min');
	if (this.moutDelay > 0)
		dnn.doDelay(this.ns + 'mout', this.moutDelay, dnn.createDelegate(this, this.hideMenus));
	else
		this.hideMenus();
},

safariKeyHandler: function (e) 
{
	if (e.keyCode == KEY_RETURN)
	{
		if (this.hoverMenuNode != null && this.hoverMenuNode.enabled)
			this.selectNode(this.hoverMenuNode);
		return false;
	}
},

keyboardHandler: function (e) 
{
	if (e.keyCode == KEY_RETURN)
	{
		if (this.hoverMenuNode != null && this.hoverMenuNode.enabled)
			this.selectNode(this.hoverMenuNode);
		return false;
	}
	
	if (e.keyCode == KEY_ESCAPE)
	{
		this.blurHandler();
		return false;
	}
	
	if (e.keyCode >= KEY_LEFT_ARROW && e.keyCode <= KEY_DOWN_ARROW)
	{
		var iDir = (e.keyCode == KEY_UP_ARROW || e.keyCode == KEY_LEFT_ARROW) ? -1 : 1;
		var sAxis = (e.keyCode == KEY_UP_ARROW || e.keyCode == KEY_DOWN_ARROW) ? 'y' : 'x';

		var oMNode = this.hoverMenuNode;
		var oNewMNode;
		if (oMNode == null)
			oMNode = new dnn.controls.DNNMenuNode(this.rootNode.childNodes(0));
		
		var bHor = !this.isNodeVertical(oMNode);
		if ((sAxis == 'y' && !bHor) || (bHor && sAxis == 'x'))
		{
			this.hideMenus(new dnn.controls.DNNMenuNode(oMNode.node.parentNode()));
			oNewMNode = this.__getNextNode(oMNode, iDir);
		}		
		else 
		{
			if (iDir == -1)
			{
				oNewMNode = new dnn.controls.DNNMenuNode(oMNode.node.parentNode());
				if (oNewMNode.level == 0 && this.orient == dnn.controls.orient.horizontal)
					oNewMNode = this.__getNextNode(new dnn.controls.DNNMenuNode(oMNode.node.parentNode()), iDir);					
				this.hideMenus(oNewMNode);	
					
			}
			else if (iDir == 1)
			{
				if (oMNode.hasNodes || oMNode.hasPendingNodes)
				{
					if (oMNode.expanded != true)
					{
						this.expandNode(oMNode);
						if (this.podInProgress == false)
							oNewMNode = new dnn.controls.DNNMenuNode(oMNode.node.childNodes(0));
					}
				}
				else
				{
					var oNode = oMNode.node;
					while (oNode.parentNode().nodeName() != 'root')
						oNode = oNode.parentNode();
					oNewMNode = new dnn.controls.DNNMenuNode(oNode);
					oNewMNode = this.__getNextNode(oNewMNode, iDir);
					this.hideMenus(new dnn.controls.DNNMenuNode(oNewMNode.node.parentNode()));
				}
			}
		}
		if (oNewMNode != null && oNewMNode.node.nodeName() != 'root')
			this.hoverNode(oNewMNode);
		
		return false;
	}
	
},

__getNextNode: function (oMNode, iDir) 
{
	var oNode;
	var oParentNode = oMNode.node.parentNode();
	var iNodeIndex = oMNode.node.getNodeIndex('id');
	if (iNodeIndex + iDir < 0)	//if first node was selected and going left, select last node
		oNode = oParentNode.childNodes(oParentNode.childNodeCount()-1);
	else if (iNodeIndex + iDir > oParentNode.childNodeCount()-1)
		oNode = oParentNode.childNodes(0);
	else
		oNode = oParentNode.childNodes(iNodeIndex + iDir);
	
	var oRetNode = new dnn.controls.DNNMenuNode(oNode);	
	if (oRetNode.isBreak)
	{
		iNodeIndex += iDir;	//check next one
		if (iNodeIndex + iDir < 0)
			oNode = oParentNode.childNodes(oParentNode.childNodeCount()-1);
		else if (iNodeIndex + iDir > oParentNode.childNodeCount()-1)
			oNode = oParentNode.childNodes(0);
		else
			oNode = oParentNode.childNodes(iNodeIndex + iDir);
		return new dnn.controls.DNNMenuNode(oNode);
	}
	else
		return oRetNode;
},

callBackStatus: function (result, ctx) 
{
	var oMNode = ctx;
	var oMenu = oMNode.menu;
	
	if (oMenu.callBackStatFunc != null && oMenu.callBackStatFunc.length > 0)
	{
		var oPtr = eval(oMenu.callBackStatFunc);
		oPtr(result, ctx);	
	}
},

callBackSuccess: function (result, ctx) 
{
	var oMNode = ctx;
	var oNode = oMNode.node;
	var oMenu = oMNode.menu;
	
	oMenu.showWorkImage(oMNode, false);
	oNode.appendXml(result);

	var oSub = oMenu.getChildControl(oMNode.id, 'sub');	
	for (var i=0; i<oNode.childNodeCount(); i++)	
		oMenu.renderNode(oNode.childNodes(i), oSub);
	
	oMNode.hasPendingNodes = false;
	oMNode.hasNodes = true;

	oMenu.update();

	oSub = oMenu.getChildControl(oMNode.id, 'sub');
	oMenu.expandNode(new dnn.controls.DNNMenuNode(oNode));

	oMenu.callBackStatus(result, ctx);
	oMenu.podInProgress = false;
},

callBackFail: function (result, ctx) 
{
	window.status = result;
},

nodeTextClick: function(evt, element)
{

	var oNode = this.DOM.findNode('n', 'id', element.nodeid);
	if (oNode != null)
		this.selectNode(new dnn.controls.DNNMenuNode(oNode));
},

menuMOver: function(evt, element)
{
	dnn.cancelDelay(this.ns + 'mout');
},

menuMOut: function(evt, element)
{
	dnn.cancelDelay(this.ns + 'min');
	if (this.moutDelay > 0)
		dnn.doDelay(this.ns + 'mout', this.moutDelay, dnn.createDelegate(this, this.hideMenus));
	else
		this.hideMenus();
},

nodeMOver: function(evt, element)
{
	var oNode = this.DOM.findNode('n', 'id', element.nodeid);
	if (oNode != null)
	{
		var oMNode = new dnn.controls.DNNMenuNode(oNode);
		//this.hideMenus(new dnn.controls.DNNMenuNode(oNode.parentNode())); //MinDelay???
		oMNode.hover = true;
		this.assignCss(oMNode);
		this.expandNode(oMNode);
	}
},

nodeMOut: function(evt, element)
{
	var oNode = this.DOM.findNode('n', 'id', element.nodeid);
	if (oNode != null)
	{
		var oMNode = new dnn.controls.DNNMenuNode(oNode);
		this.assignCss(oMNode);
	}
},

createChildControl: function (sTag, sNodeID, sPrefix)
{
	var oCtl = dnn.dom.createElement(sTag);
	oCtl.ns = this.ns;
	oCtl.nodeid = sNodeID;
	oCtl.id = this.ns + sPrefix + sNodeID;
	this.childControls[oCtl.id] = oCtl; //cache the control for quicker lookups
	return oCtl;
}, 

getChildControl: function (sNodeID, sPrefix)
{
	var sId = this.ns + sPrefix + sNodeID;
	if (this.childControls[sId] != null)	//retrive from cache if available
		return this.childControls[sId];
	else
		return $(sId);
}
}

//DNNMenuBuilder object
dnn_control.prototype.DNNMenuBuilder = function (oMenu, oMNode, oCont)
{
	this.menu = oMenu;
	this.menuNode = oMNode;
	this.isVertical = oMenu.isNodeVertical(oMNode);
	this.container = oCont;	
	this.row = null;
	this.subcont = null;
}

//DNNMenuBuilder specific methods
dnn_control.prototype.DNNMenuBuilder.prototype = 
{
appendChild: function(oCtl, bNewCell)
{
	this.subcont.appendChild(oCtl);	
},

newCell: function() {},

newCont: function()
{
	if (this.isVertical)
		this.row = this.menu.createChildControl('div', this.menuNode.id, 'ctr');	//container for Node
	else
		this.row = this.menu.createChildControl('span', this.menuNode.id, 'ctr');	//container for Node
	this.subcont = this.row;
	this.container.appendChild(this.subcont);
},

newRow: function()
{
	//if (this.container.childNodes.length > 0)
	//	this.container.appendChild(document.createElement('br'));
},

createSubMenu: function()
{
	return this.menu.createChildControl('DIV', this.menuNode.id, 'sub');	//Not using SPAN due to FireFox bug...
}
}

//DNNMenuTableBuilder object inherits DNNMenuBuilder
dnn_control.prototype.DNNMenuTableBuilder = function (oMenu, oMNode, oCont)
{
	this.base = dnn.controls.DNNMenuBuilder;
	this.base(oMenu, oMNode, oCont);	//invoke base class constructor
	//RootTable???
	/*if (oCont != null && oCont.rows.length > 0)
		this.row = oCont.rows[oCont.rows.length-1];*/
}

//DNNMenuTableBuilder specific methods
dnn_control.prototype.DNNMenuTableBuilder.prototype = 
{
appendChild: function(oCtl, bNewCell)
{
	if (bNewCell)
		this.newCell();
	this.subcont.appendChild(oCtl);	
},

newCont: function()
{
	this.subcont = this.newCell();	//TD	
},

newCell: function()
{
	var  oTD = dnn.dom.createElement('td');
	this.row.appendChild(oTD);	
	this.subcont = oTD;//
	return oTD;
},

newRow: function()
{
	this.row = this.menu.createChildControl('tr', this.menuNode.id, 'ctr');	//TR
	var oTBs = dnn.dom.getByTagName('TBODY', this.container);
	oTBs[0].appendChild(this.row);
},

createSubMenu: function()
{		
	var oSub = this.menu.createChildControl('table', this.menuNode.id, 'sub');
	oSub.border = 0;
	oSub.cellPadding = 0;
	oSub.cellSpacing = 0;
	oSub.appendChild(dnn.dom.createElement('tbody'));
	return oSub;
}
}

dnn_control.prototype.DNNMenuNode = function (oNode)
{
	this.base = dnn.controls.DNNNode;
	this.base(oNode);	//invoke base class constructor
	
	//menu specific attributes
	this.hover = false;
	this.expanded = oNode.getAttribute('expanded', '0') == '1' ? true : null;
	this.selected = oNode.getAttribute('selected', '0') == '1' ? true : null;
	this.clickAction = oNode.getAttribute('ca', dnn.controls.action.postback);
	this.imageIndex = new Number(oNode.getAttribute('iIdx', '-1')); 
	this.urlIndex = new Number(oNode.getAttribute('uIdx', '-1')); 
	this.isBreak = oNode.getAttribute('break', '0') == '1' ? true : false;	//probably move to base DNNNode
	this.lhtml = oNode.getAttribute('lhtml', '');
	this.rhtml = oNode.getAttribute('rhtml', '');
}

//DNNMenuNode specific methods
dnn_control.prototype.DNNMenuNode.prototype = 
{
childNodes: function (iIndex)
{
	if (this.node.childNodes[iIndex] != null)
		return new dnn.controls.DNNMenuNode(this.node.childNodes[iIndex]);
},
getUrl: function (oMenu)
{
	if (this.urlIndex > -1)
		return oMenu.urlList[this.urlIndex] + this.url;
	else
		return this.url;
}
}

//BEGIN [Needed in case scripts load out of order]
if (typeof(dnn_controls) != 'undefined')
{
	dnn.extend(dnn_controls.prototype, dnn_control.prototype);
	dnn.controls = new dnn_controls();
}
//END [Needed in case scripts load out of order]