// NavBar with popup menus

function wp_navbar_menu_activestack()
{
	this.depth = []; this.element = [];
}

//Entry point
function wp_navbar_menu(menubarid, navtree, options, styleOptions) 
{
	if( options )
	{	this.options = WpNavBar.mergeOptions( this.options, options ); }
	if( styleOptions )
	{	this.styleOptions = WpNavBar.mergeOptions( this.styleOptions, styleOptions ); }

	this.m_acStack = new wp_navbar_menu_activestack();
	this.Create(menubarid, navtree);
}

//default options
wp_navbar_menu.prototype.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":''
};

wp_navbar_menu.prototype.styleOptions = 
{	'm_bSlidingDoors' : false };

wp_navbar_menu.prototype.write = function(s) 
{
	if( this.options.m_bNoScript || this.options.m_bStaticScript )
	{	external.NavNoScriptWrite(s); }
	else
	{	document.write(s); }
};

//Internal vars:
wp_navbar_menu.prototype.m_timeout = null; 
wp_navbar_menu.prototype.m_active = null;
wp_navbar_menu.isIE = function() { return /msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent); };

wp_navbar_menu.prototype.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( '<div id="'+this.options.m_sId+'" class="' + this.options.m_sCssClass + '" style="position:absolute;left:'+this.options.m_iLeft+'px; top:'+this.options.m_iTop+'px; width:'+this.options.m_iWidth+'px; height:'+this.options.m_iHeight+'px;'/*+this.styleOptions.top.sStyle*/+'">' );
	
	//Write out the top-level items
	for( var index = 0; index < navtree.childArray.length; index++ )
	{
		var navbaritem = navtree.childArray[index];

		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( '<a href="' + navbaritem.sUrl + '"' );
		this.write( ' id="' + navbaritemid + '"' );
		if( navbaritem.sTarget )
		{	this.write( ' target="' + navbaritem.sTarget + '"' ); }

		if( bAddScript )
		{
			this.write( ' onmouseover="wp_navbar_menu.wp_MenuItemOver(\'' + navbaritemid + '\',' + menubarid + ',' + menuidref + ');"' );
			this.write( ' onmouseout="wp_navbar_menu.wp_MenuItemOut(\'' + navbaritemid + '\',' + menubarid + ');"' );
		}
		this.write( ' class="toplevelmenuitem' );
		if( index === 0 )
		{	this.write( ' toplevelmenuitem_firstchild' ); }
		if( index === navtree.childArray.length-1 )
		{	this.write( ' toplevelmenuitem_lastchild' ); }
		if( bIsCurrentPage )
		{	this.write( ' toplevelmenuitem_currentpage' ); }
		if( bAddScript && bHasChildren )
		{	this.write( ' toplevelmenuitem_hassubmenu' ); }
		this.write(' normal');
		this.write( '"' );

		this.write( '>' );

		if( this.styleOptions.m_bSlidingDoors )
			this.write( '<span>' );
		this.write( navbaritem.sTitle.replace(/ /g,"&nbsp;") );
		if( this.styleOptions.m_bSlidingDoors )
			this.write( '</span>' );
		this.write( '</a>' );

		if( bAddScript )
		{	
			this.InitElement(navbaritemid); 
		}

		if( this.options.m_optAlignment == 1 )
		{	this.write( '<br>' ); }	
	}

	this.write( '</div>' );
	
	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();
};


wp_navbar_menu.prototype.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,"&nbsp;"), 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 );
	}
};

wp_navbar_menu.prototype.InitElement = function(id_name/*,normal,over*/)
{ 
	var e = document.getElementById(id_name); 
	e.p_root = this; 
};

wp_navbar_menu.prototype.BeginMenu = function(menubarid, id_name) 
{ 
	this.m_active = id_name;
	this.write('<table class="' + this.options.m_sCssClass + '_level1' + '" id="'+id_name+'" style="visibility:hidden;z-index:100;position:absolute;' /*+ this.styleOptions.level1.sStyle*/ + '">');
};

wp_navbar_menu.prototype.EndMenu = function()
{
	this.write('</table>');
	this.m_active = null;
};

wp_navbar_menu.prototype.AddLink = function(menubarid,id_name,sTitle,sUrl,id_submenu,targetframe,bSeparator,bIsCurrentPage)
{
	this.write('<tr' );
//	this.write(' class="' );
//	if( bSeparator )
//		this.write(' separator');
//	this.write('">');
	this.write('>');
	
	this.write('<td');
	this.write(' onmouseover="wp_navbar_menu.wp_SubMenuOver(\''+id_name+'\');"');
	this.write(' onmouseout="wp_navbar_menu.wp_SubMenuOut(\''+id_name+'\');" onclick="wp_navbar_menu.wp_ForceClose(\''+id_name+'\');"');
	this.write('>');

	if(bSeparator) 
	{	this.write('<hr' ); } 
	else if(sUrl==='')
	{	this.write('<p' ); } 
	else 
	{
		this.write( '<a href="' + sUrl + '"' );
		if( targetframe )
		{	this.write(' target="'+targetframe+'"'); }
	}
	this.write( ' class="' );
	if( id_submenu )
	{	this.write(' hassubmenu'); }
	if( bIsCurrentPage )
	{	this.write(' currentpage'); }
	this.write( '"' );

	this.write( ' id="'+id_name+'"' );
	this.write(' style="display:block;"');

	this.write('>');
	if(!bSeparator)
	{ 
		this.write(sTitle);
		if (sUrl==='')
		{	this.write('</p>'); } 
		else
		{	this.write('</a>'); }
	}
	
	this.write('</td></tr>\n');
	var e = document.getElementById(id_name); e.m_root = this; e.m_idchild = id_submenu; e.m_menu = this.m_active;
};


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.offsetParent && c.offsetParent.style.position!='relative') { top += c.offsetTop; left += c.offsetLeft; c = c.offsetParent; }
	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";
};

