// NavBar with popup menus
function wp_navbar_menu_activestack()
{
this.depth = []; this.element = [];
}
//Entry point
function wp_navbar_menu(menubarid, navtree, options, styleOptions)
{
var me = this;
//Internal vars:
me.m_timeout = null;
me.m_active = null;
//default options
me.options =
{ "m_bNoScript":false,
"m_bStaticScript":false,
"m_optAlignment":0,
"m_optGap":1,
"m_optPopupSeparation":1,
"m_optTimeOut":500,
"m_optShowBelow":1,
"m_optShowRight":1,
"m_optFirstPopupPosition":0,
"m_sCssClass":''
};
if( options )
{
me.options = WpNavBar.mergeOptions( me.options, options );
if(options.m_opTimeOut) //Fix
{ options.m_optTimeOut = options.m_opTimeOut; }
}
me.styleOptions =
{ 'm_bSlidingDoors' : false,
'top' : {
'm_sSpacerText' : '' }
};
if( styleOptions )
{ me.styleOptions = WpNavBar.mergeOptions( me.styleOptions, styleOptions ); }
me.write = function(s)
{
if( this.options.m_bNoScript || this.options.m_bStaticScript )
{ external.NavNoScriptWrite(s); }
else
{ document.write(s); }
};
me.Create = function(menubarid, navtree)
{
if( !navtree || !navtree.childArray )
{ //NavTree could not be loaded
return;
}
//Don't create submenus or rollover events in NOSCRIPT output
//Also, we don't support m_bStaticScript so just do same as NOSCRIPT output
var bAddScript = !this.options.m_bNoScript && !this.options.m_bStaticScript;
//We write our own DIV element
this.write( '
' );
//Write out the top-level items
for( var index = 0; index < navtree.childArray.length; index++ )
{
var navbaritem = navtree.childArray[index];
if( index != 0 && this.styleOptions.top.m_sSpacerText != '' )
{
this.write( '' );
this.write( ( this.styleOptions.top.m_sSpacerText ) );
this.write( '' );
}
var bIsCurrentPage = navbaritem.bIsCurrentPage;
var bHasChildren = navbaritem.childArray && (navbaritem.childArray.length > 0 );
var navbaritemid = menubarid + '_' + index.toString();
var menuidref = bHasChildren ? ('\'' + menubarid + '_P' + index.toString() + '\'') : 'null'; //Id of submenu as a string
this.write( '' );
if( bAddScript )
{
this.InitElement(navbaritemid);
}
if( this.options.m_optAlignment == 1 )
{ this.write( '
' ); }
}
this.write( '
' );
if( bAddScript )
{ //Create the child menus (outside the div)
for( var index = 0; index < navtree.childArray.length; index++ )
{
var navbaritem = navtree.childArray[index];
var menuid = menubarid + '_P' + index.toString();
this.create_navbar_child_menus_recursive( menubarid, menuid, navbaritem );
}
}
if( this.options.m_bNoScript || this.options.m_bStaticScript )
{ external.NavNoScriptComplete(); }
};
me.create_navbar_child_menus_recursive = function( menubarid, menuid, parenttree )
{
var bHasChildren = ( parenttree.childArray ) && ( parenttree.childArray.length > 0 );
if( !bHasChildren )
{ return; }
this.BeginMenu( menubarid, menuid );
//Loop through each child in the tree (each of which will be a menu item)
for( var index = 0; index < parenttree.childArray.length; index++)
{
var menuitem = parenttree.childArray[index];
var menuitemid = menuid + '_I' + index.toString();
var menuitemhaschildren = ( menuitem.childArray ) && ( menuitem.childArray.length > 0 );
var childmenuid = menuitemhaschildren ? ( menuid + '_P' + index.toString() ) : null;
var sTarget = ( menuitem.sTarget ) ? menuitem.sTarget : '_self';
var bIsCurrentPage = ( menuitem.bIsCurrentPage === true );
if( menuitem.bSeparator )
{
var separatorid = menuitemid + '_separator';
this.AddLink( menubarid, separatorid, '', '', null, null, true, false );
}
this.AddLink(menubarid, menuitemid, menuitem.sTitle.replace(/ /g," "), menuitem.sUrl, childmenuid, sTarget, false, bIsCurrentPage);
}
this.EndMenu();
//Write out all the child menus of this menu
for( var index = 0; index < parenttree.childArray.length; index++)
{
var menuitem = parenttree.childArray[index];
var childmenuid = menuid + '_P' + index.toString();
this.create_navbar_child_menus_recursive( menubarid, childmenuid, menuitem );
}
};
me.InitElement = function(id_name)
{
var e = document.getElementById(id_name);
e.p_root = this;
};
me.BeginMenu = function(menubarid, id_name)
{
this.m_active = id_name;
this.write('');
};
me.EndMenu = function()
{
this.write('
');
this.m_active = null;
};
me.AddLink = function(menubarid,id_name,sTitle,sUrl,id_submenu,targetframe,bSeparator,bIsCurrentPage)
{
this.write('' );
this.write('');
if(bSeparator)
{ this.write('');
if(!bSeparator)
{
this.write(sTitle);
if (sUrl==='')
{ this.write(''); }
else
{ this.write(''); }
}
this.write(' |
\n');
var e = document.getElementById(id_name); e.m_root = this; e.m_idchild = id_submenu; e.m_menu = this.m_active;
};
me.m_acStack = new wp_navbar_menu_activestack();
me.Create(menubarid, navtree);
}
wp_navbar_menu.isIE = function() { return (/msie/i).test(navigator.userAgent) && !(/opera/i).test(navigator.userAgent); };
wp_navbar_menu.wp_MenuItemOver = function(id_name,p_root,id_sub)
{
document.getElementById(id_name).m_root = p_root;
clearInterval(p_root.m_timeout);
if(id_sub)
{ document.getElementById(id_sub).m_depth = 1; }
p_root.m_active = id_name;
p_root.m_acStack.push(0,id_name,id_sub);
};
wp_navbar_menu.wp_MenuItemOut = function(id_name,p_menu)
{
p_menu.m_timeout = setInterval("wp_navbar_menu.wp_Timeout('"+id_name+"')",p_menu.options.m_optTimeOut);
};
wp_navbar_menu.wp_SubMenuOver = function(id_name)
{
var e = document.getElementById(id_name);
var pm = document.getElementById(e.m_menu);
if(e.m_idchild)
{ document.getElementById(e.m_idchild).m_depth = pm.m_depth+1; }
clearInterval(e.m_root.m_timeout);
e.m_root.m_acStack.push(pm.m_depth,id_name,e.m_idchild);
};
wp_navbar_menu.wp_SubMenuOut = function(id_name)
{
var e = document.getElementById(id_name);
if(e.m_root.m_active)
{ e.m_root.m_timeout = setInterval("wp_navbar_menu.wp_Timeout('"+e.m_root.m_active+"')",e.m_root.options.m_optTimeOut); }
};
wp_navbar_menu.wp_Timeout = function(id_name) { var e = document.getElementById(id_name); e.p_root.m_acStack.clear(); e.p_root.m_active = null; };
wp_navbar_menu.wp_ForceClose = function(id_name) { var e = document.getElementById(id_name); clearInterval(e.m_root.m_timeout); e.m_root.m_acStack.clear(); e.m_root.m_active = null; };
wp_navbar_menu_activestack.prototype.count = 0;
wp_navbar_menu_activestack.prototype.m_padding = 20;
wp_navbar_menu_activestack.prototype.push = function(depth,idelem,idchild)
{
while(( this.count>0 )&&( depth<=this.depth[this.count-1] ))
{ this.pop(); }
if(idelem)
{
this.depth[this.count] = depth; this.element[this.count] = idelem; this.count++;
document.getElementById(idelem).m_idchild = idchild;
if(depth===0)
{
if(idchild)
{ this.ShowMenu(idchild,idelem,false); }
}
else
{
if(idchild)
{ this.ShowMenu(idchild,idelem,true); }
}
}
};
wp_navbar_menu_activestack.prototype.pop = function()
{
if(this.count>0)
{
this.count--;
var idchild = document.getElementById(this.element[this.count]).m_idchild;
if(idchild)
{ document.getElementById(idchild).style.visibility = "hidden"; }
this.depth[this.count] = this.element[this.count] = null;
}
};
wp_navbar_menu_activestack.prototype.clear = function() { while(this.count>0) { this.pop(); }};
wp_navbar_menu_activestack.prototype.ShowMenu = function(id_name,id_parent,down)
{
var p = document.getElementById(id_parent); var e = document.getElementById(id_name); var top = 0; var left = 0;
var c = p; while(c && c.style.position!='relative') { top += c.offsetTop; left += c.offsetLeft; c = c.offsetParent; }
if(p.m_root.options.m_optAlignment==1 || down)
{
var k = e.m_depth == 1 ? p.m_root.options.m_optGap : p.m_root.options.m_optPopupSeparation;
if(p.m_root.options.m_optShowRight)
{ left += p.offsetWidth + k; }
else
{ left -= e.offsetWidth - k; }
if(!p.m_root.options.m_optShowBelow)
{ top -= (e.offsetHeight - p.offsetHeight - (p.m_root.options.m_optPopupSeparation*2)); }
}
else
{
if(e.m_depth == 1)
{
if(p.m_root.options.m_optShowBelow)
{ top += p.offsetHeight + p.m_root.options.m_optGap; }
else
{ top -= (e.offsetHeight + p.m_root.options.m_optGap); }
}
}
if(top+e.offsetHeight > document.body.scrollTop+document.body.clientHeight)
{ top = document.body.scrollTop+document.body.clientHeight-e.offsetHeight; }
if(top<0)
{ top = 0; }
if(left+e.offsetWidth > document.body.scrollLeft+document.body.clientWidth)
{ left = document.body.scrollLeft+document.body.clientWidth-e.offsetWidth; }
if(left<0)
{ left = 0; }
if(e.m_depth == 1)
{
if(p.m_root.m_optAlignment==1)
{
if(p.m_root.options.m_optFirstPopupPosition == 1)
{ top = top + (p.offsetHeight - e.offsetHeight) / 2; }
else if(p.m_root.options.m_optFirstPopupPosition == 2)
{ top = (top + p.offsetHeight) - e.offsetHeight; }
}
else
{
if(p.m_root.options.m_optFirstPopupPosition == 1)
{ left = left + (p.offsetWidth - e.offsetWidth) / 2; }
else if(p.m_root.options.m_optFirstPopupPosition == 2)
{ left = (left + p.offsetWidth) - e.offsetWidth; }
else if(p.m_root.options.m_optFirstPopupPosition == 3)
{
var iWidth = p.offsetWidth - (wp_navbar_menu.isIE() ? 0 : this.m_padding) - 1;
var vAnchors = e.getElementsByTagName(wp_navbar_menu.isIE() ? 'td' : 'a');
for(var n = 0; n < vAnchors.length; ++n)
{ vAnchors[n].style.width = iWidth; }
}
}
}
e.style.top = top+"px"; e.style.left = left+"px"; e.style.visibility = "visible";
};