///
///
///
///
///
///
Type.registerNamespace('dnn.controls');
dnn.extend(dnn.controls, {
initMenu: function(ctl)
{
if (ctl)
{
var menu = new dnn.controls.DNNMenu(ctl);
menu.initialize();
return menu;
}
}
});
//------- Constructor -------//
dnn.controls.DNNMenu = function(o)
{
dnn.controls.DNNMenu.initializeBase(this, [o]);
//--- Data Properties ---//
this.rootNode = null;
this.nodes = [];
this._loadNodes();
//--- Appearance Properties ---//
this.mbcss = this.getProp('mbcss', '');
this.mcss = this.getProp('mcss', '');
this.css = this.getProp('css', '');
this.cssChild = this.getProp('csschild', '');
this.cssHover = this.getProp('csshover', '');
this.cssSel = this.getProp('csssel', '');
this.cssIcon = this.getProp('cssicon', '');
this.sysImgPath = this.getProp('sysimgpath', 'images/');
this.imagePaths = this.getProp('imagepaths', '').split(',');
this.imageList = this.getProp('imagelist', '').split(',');
for (var i = 0; i < this.imageList.length; i++)
{
var index = this.imageList[i].indexOf(']');
if (index > -1)
this.imageList[i] = this.imagePaths[this.imageList[i].substring(1, index)] + this.imageList[i].substring(index + 1);
}
this.urlList = this.getProp('urllist', '').split(',');
this.workImg = this.getProp('workimg', 'dnnanim.gif');
this.rootArrow = this.getProp('rarrowimg', '');
this.childArrow = this.getProp('carrowimg', '');
this.target = this.getProp('target', '');
this.defaultJS = this.getProp('js', '');
this.postBack = this.getProp('postback', '');
this.callBack = this.getProp('callback', '');
this.callBackStatFunc = this.getProp('callbacksf', '');
if (this.callBackStatFunc.length > 0)
this.add_handler('callBackStatus', eval(this.callBackStatFunc));
this.orient = new Number(this.getProp('orient', dnn.controls.orient.horizontal));
this.suborient = new Number(this.getProp('suborient', dnn.controls.orient.vertical));
this.openMenus = [];
this.moutDelay = this.getProp('moutdelay', 500);
this.minDelay = new Number(this.getProp('mindelay', 250));
this.renderMode = new Number(this.getProp('rmode', 0));
//When rendermode is ul then loop each node and apply mouseover and out handlers
this.useTables = (this.renderMode == dnn.controls.menuRenderMode.normal);
this.enablePostbackState = (this.getProp('enablepbstate', '0') == '1');
this.podInProgress = false;
this.keyboardAccess = (this.getProp('kbaccess', '1') == '1');
this.hoverMNode = null;
this.selMNode = null;
this.animation = new Number(this.getProp('anim', '0')); //0=None
this.easingType = new Number(this.getProp('easeType', '3')); //3=Expo
this.easingDir = new Number(this.getProp('easeDir', '1')); ; //1=Out
this.animationLen = new Number(this.getProp('animLen', '1'));
this.animationInterval = new Number(this.getProp('animInt', '10'));
this._attachedHandlers = [];
this._onsubmitDelegate = null;
this._hideMenusDelegate = null;
this._expandNodeDelegate = null;
}
dnn.controls.DNNMenu.prototype =
{
initialize: function()
{
dnn.controls.DNNMenu.callBaseMethod(this, 'initialize');
if (this.keyboardAccess)
{
this._setupKeyHandling();
}
this.generateMenuHTML();
if (this.enablePostbackState)
{
this._onsubmitDelegate = Function.createDelegate(this, this._onsubmit);
dnn.controls.submitComp.add_handler(this._onsubmitDelegate);
}
this._hideMenusDelegate = dnn.createDelegate(this, this.hideMenus);
this._expandNodeDelegate = dnn.createDelegate(this, this.__expandNode);
},
//--- Generates menu HTML ---//
generateMenuHTML: function()
{
this.container.className = this.mbcss;
dnn.dom.disableTextSelect(this.container);
for (var i = 0; i < this.rootNode.childNodeCount(); i++)
this.renderNode(this.rootNode.childNodes(i), this.container);
this.addHandlers(document.body, { "click": this._bodyClick }, this);
if (dnn.dom.browser.isType(dnn.dom.browser.Mozilla, dnn.dom.browser.Safari) == false) //firefox cannot clear this value. if F5 pressed, won't cause onsubmit. Ctrl+F5 will...
dnn.setVar(this.ns + '_json', ''); //clear out xml for postbacks don't need payload, unless enablePostbackState is set, which will trigger _onSubmit
},
renderNode: function(node, ctr)
{
var mNode = new dnn.controls.DNNMenuNode(node);
if (mNode.selected)
this.selMNode = mNode;
var menuBuilder = this._getMenuBuilder(mNode, ctr);
if (menuBuilder.alreadyRendered == false)
{
if (this.isNodeVertical(mNode))
menuBuilder.newRow();
menuBuilder.newCont();
if (mNode.lhtml.length > 0)
menuBuilder.appendChild(this.renderCustomHTML(mNode.lhtml));
var icon = this.renderIcon(mNode);
menuBuilder.appendChild(icon); //render icon
if (this.useTables == false || mNode.level == 0)
icon.className = 'icn ' + (mNode.cssIcon.length > 0 ? mNode.cssIcon : this.cssIcon);
else
menuBuilder.subcont.className = 'icn ' + (mNode.cssIcon.length > 0 ? mNode.cssIcon : this.cssIcon); //assign style to container of icon
if (mNode.isBreak == false)
menuBuilder.appendChild(this.renderText(mNode), true); //render text
menuBuilder.newCell();
this.renderArrow(mNode, menuBuilder.subcont);
if (mNode.rhtml.length > 0)
menuBuilder.appendChild(this.renderCustomHTML(mNode.rhtml));
if (mNode.toolTip.length > 0)
menuBuilder.row.title = mNode.toolTip;
}
this.assignCss(mNode);
if (mNode.enabled)
this.addHandlers(menuBuilder.row, { "click": this._nodeTextClick }, this);
if (this._attachedHandlers[menuBuilder.container.id] != 'mouseover')
{
this._attachedHandlers[menuBuilder.container.id] = 'mouseover';
this.addHandlers(menuBuilder.container, { "mouseover": this._nodeMOver,
"mouseout": this._nodeMOut
}, this);
}
if (mNode.hasNodes || mNode.hasPendingNodes) //if node has children render container and hide if necessary
{
var subMenu = this.renderSubMenu(mNode);
this.container.appendChild(subMenu);
dnn.dom.positioning.placeOnTop(subMenu, false, this.sysImgPath + 'spacer.gif'); //todo: preload spacer so it works on first try -don't show first time
for (var i = 0; i < node.childNodeCount(); i++) //recursively call child rendering
this.renderNode(node.childNodes(i), subMenu);
}
},
renderCustomHTML: function(sHTML)
{
var ctl = dnn.dom.createElement('span');
ctl.innerHTML = sHTML;
return ctl;
},
renderIcon: function(mNode)
{
var ctl = dnn.dom.createElement('span');
if (mNode.imageIndex > -1 || mNode.image != '')
{
var img = this.createChildControl('img', mNode.id, 'icn');
img.src = (mNode.image.length > 0 ? mNode.image : this.imageList[mNode.imageIndex]);
ctl.appendChild(img);
}
return ctl;
},
renderArrow: function(mNode, ctr)
{
if (mNode.hasNodes || mNode.hasPendingNodes)
{
var imgSrc = (mNode.level == 0 ? this.rootArrow : this.childArrow);
if (imgSrc.trim().length > 0)
{
if (this.useTables && mNode.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 img = dnn.dom.createElement('img');
img.src = imgSrc;
ctr.appendChild(img);
}
else
{
ctr.style.backgroundImage = 'url(' + imgSrc + ')';
ctr.style.backgroundRepeat = 'no-repeat';
ctr.style.backgroundPosition = 'right';
}
}
}
},
renderText: function(mNode)
{
var ctl = this.createChildControl('span', mNode.id, 't');
ctl.className = 'txt';
ctl.innerHTML = mNode.text;
ctl.style.cursor = 'pointer';
return ctl;
},
renderSubMenu: function(mNode)
{
var menuBuilder = this._getMenuBuilder(mNode, null);
/*if (this.suborient == dnn.controls.orient.vertical) // (this.useTables)
menuBuilder = new dnn.controls.DNNMenuTableBuilder(this, mNode);
else
menuBuilder = new dnn.controls.DNNMenuBuilder(this, mNode);
*/
var subMenu = menuBuilder.createSubMenu();
subMenu.style.position = 'absolute';
subMenu.style.display = 'none';
var css = this.mcss;
css += ' m m' + mNode.level;
css += ' mid' + mNode.id;
subMenu.className = css;
return subMenu;
},
//---- Methods ---//
//todo: move
_getMenuBuilder: function(mNode, ctr)
{
var menuBuilder;
if (ctr)
{
if (this.renderMode == dnn.controls.menuRenderMode.normal && mNode.level > 0 && this.isNodeVertical(mNode))
menuBuilder = new dnn.controls.DNNMenuTableBuilder(this, mNode, ctr);
else if (this.renderMode == dnn.controls.menuRenderMode.unorderdlist)
menuBuilder = new dnn.controls.DNNMenuListBuilder(this, mNode, ctr);
else
menuBuilder = new dnn.controls.DNNMenuBuilder(this, mNode, ctr);
}
else
{
if (this.renderMode == dnn.controls.menuRenderMode.normal && this.suborient == dnn.controls.orient.vertical) // (this.useTables)
menuBuilder = new dnn.controls.DNNMenuTableBuilder(this, mNode);
else if (this.renderMode == dnn.controls.menuRenderMode.unorderdlist)
menuBuilder = new dnn.controls.DNNMenuListBuilder(this, mNode);
else
menuBuilder = new dnn.controls.DNNMenuBuilder(this, mNode);
}
return menuBuilder;
},
hoverNode: function(mNode)
{
if (this.hoverMNode != null)
{
this.hoverMNode.hover = false;
this.assignCss(this.hoverMNode);
}
if (mNode != null)
{
mNode.hover = true;
this.assignCss(mNode);
}
this.hoverMNode = mNode;
},
__expandNode: function(ctx)
{
this.expandNode(ctx, true);
},
expandNode: function(mNode, force)
{
dnn.cancelDelay(this.ns + 'min');
if (mNode.hasPendingNodes)
{
if (this.podInProgress == false)
{
this.podInProgress = true;
this.showWorkImage(mNode, true);
mNode.menu = this; //need to give reference back to self
if (this.callBack.indexOf('[NODEXML]') > -1)
eval(this.callBack.replace('[NODEXML]', dnn.escapeForEval(mNode.node.getXml())));
else
eval(this.callBack.replace('[NODEID]', mNode.id));
}
}
else
{
if (this.openMenus.length > 0 && this.openMenus[this.openMenus.length - 1].id == mNode.id)
return;
if (this.minDelay == 0 || force)
{
this.hideMenus(new dnn.controls.DNNMenuNode(mNode.node.parentNode())); //MinDelay???
var subMenu = this.getChildControl(mNode.id, 'sub');
if (subMenu != null)
{
this.positionMenu(mNode, subMenu);
this.showSubMenu(subMenu, true, mNode);
this.openMenus[this.openMenus.length] = mNode;
mNode.expanded = true;
mNode.update();
}
}
else
dnn.doDelay(this.ns + 'min', this.minDelay, this._expandNodeDelegate, mNode);
}
return true;
},
showSubMenu: function(subMenu, show, mNode)
{
dnn.dom.positioning.placeOnTop(subMenu, show, this.sysImgPath + 'spacer.gif');
subMenu.style.clip = 'rect(auto,auto,auto,auto)';
if (this.animation != 0) //0=none
{
subMenu.style.display = '';
var dir;
if (this.isNodeVertical(mNode))
dir = (show ? dnn.motion.animationDir.Right : dnn.motion.animationDir.Left);
else
dir = (show ? dnn.motion.animationDir.Down : dnn.motion.animationDir.Up);
dnn.dom.animate(subMenu, this.animation, dir, this.easingType, this.easingDir, this.animationLen, this.animationInterval);
}
else
subMenu.style.display = (show ? '' : 'none');
},
showWorkImage: function(mNode, show)
{
if (this.workImg != null)
{
var icon = this.getChildControl(mNode.id, 'icn');
if (icon != null)
{
if (show)
icon.src = this.sysImgPath + this.workImg;
else
icon.src = (mNode.image.length > 0 ? mNode.image : this.imageList[mNode.imageIndex]);
}
}
},
isNodeVertical: function(mNode)
{
return ((mNode.level == 0 && this.orient == dnn.controls.orient.vertical) || (mNode.level > 0 && this.suborient == dnn.controls.orient.vertical));
},
hideMenus: function(mNode)
{
for (var i = this.openMenus.length - 1; i >= 0; i--)
{
if (mNode != null && this.openMenus[i].id == mNode.id)
break;
this.collapseNode(this.openMenus[i]);
this.openMenus.length = this.openMenus.length - 1;
}
},
collapseNode: function(mNode)
{
var subMenu = this.getChildControl(mNode.id, 'sub');
if (subMenu != null)
{
this.positionMenu(mNode, subMenu);
this.showSubMenu(subMenu, false, mNode);
mNode.expanded = null;
mNode.update();
return true;
}
},
positionMenu: function(mNode, menu)
{
var oPCtl = this.getChildControl(mNode.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(menu);
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(mNode))
{
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(mNode) == false)
{
var oRDims = new dnn.dom.positioning.dims(this.container);
iNewLeft = oRDims.l;
}
menu.style.top = iNewTop + 'px';
menu.style.left = iNewLeft + 'px';
},
selectNode: function(mNode)
{
var arg = new dnn.controls.DNNNodeEventArgs(mNode);
this.invoke_handler('click', arg);
if (arg.get_cancel())
return;
if (this.selMNode != null) //unselect previously selected node
{
this.selMNode.selected = null;
this.selMNode.update('selected');
this.assignCss(this.selMNode);
}
//always select node (we aren't supporting checkboxes yet)
mNode.selected = true; //(mNode.selected ? null : true);
mNode.update('selected');
this.assignCss(mNode);
this.selMNode = mNode;
if (mNode.hasNodes || mNode.hasPendingNodes)
this.expandNode(mNode, true); //force display
if (mNode.selected)
{
var sJS = this.defaultJS;
if (mNode.js.length > 0)
sJS = mNode.js;
if (sJS.length > 0)
{
this.update(true); //always save state possible posting back (module actions)
if (eval(sJS) == false)
return; //don't do postback if returns false
}
if (mNode.clickAction == dnn.controls.action.postback)
{
this.update(true); //always save state when posting back
eval(this.postBack.replace('[NODEID]', mNode.id));
}
else if (mNode.clickAction == dnn.controls.action.nav)
dnn.dom.navigate(mNode.getUrl(this), mNode.target.length > 0 ? mNode.target : this.target);
}
return true;
},
assignCss: function(mNode)
{
var ctr = this.getChildControl(mNode.id, 'ctr');
var css = this.css;
if (mNode.level > 0 && this.cssChild.length > 0)
css = this.cssChild;
if (mNode.css.length > 0)
css = mNode.css;
if (mNode.hover)
css += ' hov ' + (mNode.cssHover.length > 0 ? mNode.cssHover : this.cssHover);
if (mNode.selected)
css += ' sel ' + (mNode.cssSel.length > 0 ? mNode.cssSel : this.cssSel);
if (mNode.breadcrumb)
css += ' bc';
if (mNode.isBreak)
css += ' break';
css += ' mi mi' + mNode.node.getNodePath();
css += ' id' + mNode.id;
if (mNode.level == 0)
css += ' root';
if (mNode.node.getNodeIndex() == 0)
css += ' first';
if (mNode.node.getNodeIndex() == mNode.node.parentNode().childNodeCount() - 1)
css += ' last';
if ((mNode.node.getNodeIndex() == 0) && (mNode.node.getNodeIndex() == mNode.node.parentNode().childNodeCount() - 1))
css += ' firstlast'; //allow for both to be detected
ctr.className = css;
},
update: function()
{
dnn.setVar(this.ns + '_json', this.rootNode.getJSON());
},
//--- Event Handlers ---//
_onsubmit: function()
{
this.update(true);
},
_bodyClick: function()
{
this.hideMenus();
},
focusHandler: function(e)
{
var mNode = this.hoverMNode;
if (mNode == null)
mNode = this.selMNode;
if (mNode == null)
mNode = new dnn.controls.DNNMenuNode(this.nodes[0]);
//mNode = new dnn.controls.DNNMenuNode(this.rootNode.childNodes(0));
this.hoverNode(mNode);
this.container.onfocus = null;
},
blurHandler: function(e)
{
if (this.hoverMNode != null)
this.hoverNode(null);
dnn.cancelDelay(this.ns + 'min');
if (this.moutDelay > 0)
dnn.doDelay(this.ns + 'mout', this.moutDelay, this._hideMenusDelegate);
else
this.hideMenus();
},
safariKeyHandler: function(e)
{
if (e.charCode == KEY_RETURN)
{
if (this.hoverMNode != null && this.hoverMNode.enabled)
this.selectNode(this.hoverMNode);
return false;
}
},
keyboardHandler: function(e)
{
var code = e.keyCode;
if (code == null)
code = e.charCode;
if (code == KEY_RETURN)
{
if (this.hoverMNode != null && this.hoverMNode.enabled)
this.selectNode(this.hoverMNode);
return false;
}
if (code == KEY_ESCAPE)
{
this.blurHandler();
return false;
}
if (code >= KEY_LEFT_ARROW && code <= KEY_DOWN_ARROW)
{
var iDir = (code == KEY_UP_ARROW || code == KEY_LEFT_ARROW) ? -1 : 1;
var sAxis = (code == KEY_UP_ARROW || code == KEY_DOWN_ARROW) ? 'y' : 'x';
var mNode = this.hoverMNode;
var oNewMNode;
if (mNode == null)
mNode = new dnn.controls.DNNMenuNode(this.nodes[0]);
//mNode = new dnn.controls.DNNMenuNode(this.rootNode.childNodes(0));
var bHor = !this.isNodeVertical(mNode);
if ((sAxis == 'y' && !bHor) || (bHor && sAxis == 'x'))
{
this.hideMenus(new dnn.controls.DNNMenuNode(mNode.node.parentNode()));
oNewMNode = this.__getNextNode(mNode, iDir);
}
else
{
if (iDir == -1)
{
oNewMNode = new dnn.controls.DNNMenuNode(mNode.node.parentNode());
if (oNewMNode.level == 0 && this.orient == dnn.controls.orient.horizontal)
oNewMNode = this.__getNextNode(new dnn.controls.DNNMenuNode(mNode.node.parentNode()), iDir);
this.hideMenus(oNewMNode);
}
else if (iDir == 1)
{
if (mNode.hasNodes || mNode.hasPendingNodes)
{
if (mNode.expanded != true)
{
this.expandNode(mNode);
if (this.podInProgress == false)
oNewMNode = new dnn.controls.DNNMenuNode(mNode.node.nodes[0]);
//oNewMNode = new dnn.controls.DNNMenuNode(mNode.node.childNodes(0));
}
}
else
{
var node = mNode.node;
while (node.parentNode().nodeName() != 'root')
node = node.parentNode();
oNewMNode = new dnn.controls.DNNMenuNode(node);
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;
}
},
dispose: function()
{
this._onsubmitDelegate = null;
this._hideMenusDelegate = null;
this._expandNodeDelegate = null;
dnn.controls.DNNMenu.callBaseMethod(this, 'dispose');
},
__getNextNode: function(mNode, iDir)
{
var node;
var parentNode = mNode.node.parentNode();
var nodeIndex = mNode.node.getNodeIndex('id');
if (nodeIndex + iDir < 0) //if first node was selected and going left, select last node
node = parentNode.nodes[parentNode.childNodeCount() - 1]; //node = parentNode.childNodes(parentNode.childNodeCount()-1);
else if (nodeIndex + iDir > parentNode.childNodeCount() - 1)
node = parentNode.nodes[0]; //node = parentNode.childNodes(0);
else
node = parentNode.nodes[nodeIndex + iDir]; //node = parentNode.childNodes(nodeIndex + iDir);
var oRetNode = new dnn.controls.DNNMenuNode(node);
if (oRetNode.isBreak)
{
nodeIndex += iDir; //check next one
if (nodeIndex + iDir < 0)
node = parentNode.childNodes(parentNode.childNodeCount() - 1);
else if (nodeIndex + iDir > parentNode.childNodeCount() - 1)
node = parentNode.childNodes(0);
else
node = parentNode.childNodes(nodeIndex + iDir);
return new dnn.controls.DNNMenuNode(node);
}
else
return oRetNode;
},
callBackFail: function(result, ctx, req)
{
var mNode = ctx;
var menu = mNode.menu;
menu.invoke_handler('callBackFail', new dnn.controls.DNNCallbackEventArgs(result, ctx, req));
},
callBackStatus: function(result, ctx, req)
{
var mNode = ctx;
var menu = mNode.menu;
menu.invoke_compatHandler('callBackStatus', result, ctx, req);
},
callBackSuccess: function(result, ctx, req)
{
var mNode = ctx;
var node = mNode.node;
var menu = mNode.menu;
menu.showWorkImage(mNode, false);
//node.appendXml(result);
var json = dnn.evalJSON("{" + result + "}");
node.nodes = json.nodes;
node.setupJSONNodes(node.rootNode(), node, node.nodes);
var subMenu = menu.getChildControl(mNode.id, 'sub');
for (var i = 0; i < node.childNodeCount(); i++)
menu.renderNode(node.childNodes(i), subMenu);
mNode = new dnn.controls.DNNMenuNode(node);
mNode.hasPendingNodes = false;
mNode.hasNodes = true;
subMenu = menu.getChildControl(mNode.id, 'sub');
menu.expandNode(mNode);
//menu.expandNode(new dnn.controls.DNNMenuNode(node));
menu.callBackStatus(result, ctx, req);
menu.podInProgress = false;
menu.invoke_handler('callBackSuccess', new dnn.controls.DNNCallbackEventArgs(result, ctx, req));
},
_nodeTextClick: function(evt)
{
var node = this._findEventNode(evt);
var mNode;
if (node != null)
{
mNode = new dnn.controls.DNNMenuNode(node);
this.selectNode(mNode);
}
evt.stopPropagation();
},
_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 node = this._findEventNode(evt);
if (node != null)
{
var mNode = new dnn.controls.DNNMenuNode(node);
//this.hideMenus(new dnn.controls.DNNMenuNode(node.parentNode())); //MinDelay???
mNode.hover = true;
this.assignCss(mNode);
if (mNode.expanded != true)
this.expandNode(mNode);
evt.stopPropagation();
}
this._menuMOver(evt, element);
},
_nodeMOut: function(evt, element)
{
var node = this._findEventNode(evt);
if (node != null)
{
var mNode = new dnn.controls.DNNMenuNode(node);
this.assignCss(mNode);
this._menuMOut(evt, element);
evt.stopPropagation();
}
},
//OBSOLETE!
getXml: function()
{
return this.rootNode.getXml();
},
_findEventNode: function(evt)
{
if (dnn.dom.isNonTextNode(evt.target))
return this.rootNode.findNode(this.getChildControlBaseId(evt.target));
},
_loadNodes: function()
{
var json = dnn.evalJSON(dnn.getVar(this.ns + '_json'));
if (json)
{
this.nodes = json.nodes;
this.rootNode = {};
this.rootNode.nodes = this.nodes;
this.rootNode.id = this.ns;
this.rootNode = new dnn.controls.JSONNode(this.rootNode, 'root', 0);
}
},
_setupKeyHandling: function()
{
if (this.container.tabIndex <= 0)
{
this.container.tabIndex = 0;
this.addHandlers(this.container, { "keydown": this.keyboardHandler,
"focus": this.focusHandler,
"blur": this.blurHandler
}, this);
}
else
{
var txt = document.createElement('input');
txt.type = 'text';
txt.style.width = 0;
txt.style.height = 0;
txt.style.background = 'transparent';
txt.style.border = 0;
txt.style.positioning = 'absolute';
if (dnn.dom.browser.isType(dnn.dom.browser.Safari))
{
txt.style.width = '1px'; //safari doesn't like zero
txt.style.height = '1px';
txt.style.left = '-999em';
this.addHandlers(txt, { "keydown": this.keyboardHandler }, this);
this.addHandlers(this.container.parentNode, { "keypress": this.safariKeyHandler }, this);
}
else
this.addHandlers(txt, { "keypress": this.keyboardHandler }, this);
this.addHandlers(txt, { "focus": this.focusHandler,
"blur": this.blurHandler
}, this);
this.container.parentNode.appendChild(txt);
}
}
}
dnn.controls.DNNMenu.registerClass('dnn.controls.DNNMenu', dnn.controls.control);
//DNNMenuBuilder object
dnn.controls.DNNMenuBuilder = function(menu, mNode, ctr)
{
this.menu = menu;
this.mNode = mNode;
this.isVertical = menu.isNodeVertical(mNode);
this.container = ctr;
this.row = null;
this.subcont = null;
this.alreadyRendered = false;
}
//DNNMenuBuilder specific methods
dnn.controls.DNNMenuBuilder.prototype =
{
appendChild: function(ctl, isNewCell)
{
this.subcont.appendChild(ctl);
},
newCell: function() { },
newCont: function()
{
if (this.isVertical)
this.row = this.menu.createChildControl('div', this.mNode.id, 'ctr'); //container for Node
else
this.row = this.menu.createChildControl('span', this.mNode.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.mNode.id, 'sub'); //Not using SPAN due to FireFox bug...
}
}
dnn.controls.DNNMenuBuilder.registerClass('dnn.controls.DNNMenuBuilder');
//DNNMenuTableBuilder object inherits DNNMenuBuilder
dnn.controls.DNNMenuTableBuilder = function(menu, node, cont)
{
dnn.controls.DNNMenuTableBuilder.initializeBase(this, [menu, node, cont]);
}
//DNNMenuTableBuilder specific methods
dnn.controls.DNNMenuTableBuilder.prototype =
{
appendChild: function(ctl, isNewCell)
{
if (isNewCell)
this.newCell();
this.subcont.appendChild(ctl);
},
newCont: function()
{
this.subcont = this.newCell(); //TD
},
newCell: function()
{
var td = dnn.dom.createElement('td');
this.row.appendChild(td);
this.subcont = td;
return td;
},
newRow: function()
{
this.row = this.menu.createChildControl('tr', this.mNode.id, 'ctr'); //TR
var tb = dnn.dom.getByTagName('TBODY', this.container);
tb[0].appendChild(this.row);
},
createSubMenu: function()
{
var subMenu = this.menu.createChildControl('table', this.mNode.id, 'sub');
subMenu.border = 0;
subMenu.cellPadding = 0;
subMenu.cellSpacing = 0;
subMenu.appendChild(dnn.dom.createElement('tbody'));
return subMenu;
}
}
dnn.controls.DNNMenuTableBuilder.registerClass('dnn.controls.DNNMenuTableBuilder', dnn.controls.DNNMenuBuilder);
//DNNMenuTableBuilder object inherits DNNMenuBuilder
dnn.controls.DNNMenuListBuilder = function(menu, node, cont)
{
dnn.controls.DNNMenuListBuilder.initializeBase(this, [menu, node, cont]);
this.alreadyRendered = true;
this.row = dnn.dom.getById(this.menu.getChildControlId(this.mNode.id, 'ctr'), this.menu.container);
this.menu.registerChildControl(this.row, this.mNode.id);
this._setStyles(this.row);
this.subcont = this.row;
this.subMenu = dnn.dom.getById(this.menu.getChildControlId(this.mNode.id, 'sub'), this.menu.container);
if (this.subMenu)
{
this.menu.registerChildControl(this.subMenu, this.mNode.id);
this._setStyles(this.subMenu);
}
}
//DNNMenuListBuilder specific methods
dnn.controls.DNNMenuListBuilder.prototype =
{
appendChild: function(ctl, isNewCell) { },
newCont: function() { },
createSubMenu: function()
{
// this.subMenu.parentNode.removeChild(this.subMenu);
return this.subMenu;
},
_setStyles: function(ctl)
{
if (this.menu.isNodeVertical(this.mNode) == false)
ctl.style.display = 'inline';
ctl.style.listStyle = 'none';
//ctl.style.margin = 0; //WCT-9771
//ctl.style.padding = 0; //WCT-9771
//ctl.style.float = 'left';
//ctl.style.clear = 'left';
}
}
dnn.controls.DNNMenuListBuilder.registerClass('dnn.controls.DNNMenuListBuilder', dnn.controls.DNNMenuBuilder);
dnn.controls.DNNMenuNode = function(node)
{
dnn.controls.DNNMenuNode.initializeBase(this, [node]);
this._addAbbr({ breadcrumb: 'bcrumb', clickAction: 'ca', imageIndex: 'iIdx', urlIndex: 'uIdx' });
//menu specific attributes
this.hover = false;
this.expanded = null; //node.getAttribute('expanded', '0') == '1' ? true : null;
this.selected = node.getAttribute('selected', '0') == '1' ? true : null;
this.breadcrumb = node.getAttribute('bcrumb', '0') == '1' ? true : null;
this.clickAction = node.getAttribute('ca', dnn.controls.action.postback);
this.imageIndex = new Number(node.getAttribute('iIdx', '-1'));
this.urlIndex = new Number(node.getAttribute('uIdx', '-1'));
this.lhtml = node.getAttribute('lhtml', '');
this.rhtml = node.getAttribute('rhtml', '');
}
//DNNMenuNode specific methods
dnn.controls.DNNMenuNode.prototype =
{
childNodes: function(iIndex)
{
if (this.node.nodes(iIndex) != null)
return new dnn.controls.DNNMenuNode(this.node.nodes(iIndex));
},
getUrl: function(menu)
{
if (this.urlIndex > -1)
return menu.urlList[this.urlIndex] + this.url;
else
return this.url;
}
}
dnn.controls.DNNMenuNode.registerClass('dnn.controls.DNNMenuNode', dnn.controls.DNNNode);
Type.registerNamespace('dnn.controls');
dnn.controls.menuRenderMode = function() { };
dnn.controls.menuRenderMode.prototype = {
normal: 0,
notables: 1,
unorderdlist: 2,
downlevel: 3
}
dnn.controls.menuRenderMode.registerEnum("dnn.controls.menuRenderMode");
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();