var IE = document.all ? true : false;

// Link class
function AsylumNavLink(parentId, linkId, href, linkText, target)
{
	this.linkId = linkId;
	this.parentId = parentId;
	this.href = href;
	this.linkText = linkText;
	this.target = target;
}

// Menu class
function AsylumNav(contId)
{
	// Defaults
	this.firstLevelOffsetX = 0;
	this.firstLevelOffsetY = 0;
	this.subLevelOffsetX = 0;
	this.subLevelOffsetY = 0;

	this.subMenuImgTop = '';
	this.subMenuImgBot = '';

	this.menuCont = document.getElementById(contId);
	this.menuItems = new Object();

	this.clickUnderCreated = false;
}

AsylumNav.prototype.AddLink = function(parentId, linkId, href, linkText, target)
{
	if(typeof this.menuItems[parentId] == 'undefined')
	{
		this.menuItems[parentId] = new Object();
	}

	this.menuItems[parentId][linkId] = new AsylumNavLink(parentId, linkId, href, linkText, target);
}

AsylumNav.prototype.Construct = function()
{
	var obj = this;

	for(levelId in this.menuItems)
	{
		// Level div.
		div = document.createElement('div');
		div.id = 'asylumNavLevel' + levelId;
		div.levelId = levelId;
		div.className = 'levelDiv level' + levelId;
		div.onmouseout = function(e) {obj.HideLevel(e);}
		div.subLevels = new Object();

		if(levelId != '0')
		{
			div.style.visibility = 'hidden';
			div.className += ' subLevel';
			div.style.position = 'absolute';

			// Background div - allows for alpha transparency bg in IE (without it links don't work).
			bgDiv = document.createElement('div');
			bgDiv.id = 'asylumNavLevelBG' + levelId;
			bgDiv.levelId = levelId;
			bgDiv.className = 'subLevelBG';
			bgDiv.style.position = 'absolute';
			bgDiv.style.visibility = 'hidden';
			this.menuCont.appendChild(bgDiv);
		}
		else
		{
			div.className += ' topLevel';
		}

		this.menuCont.appendChild(div);

		for(linkId in this.menuItems[levelId])
		{
			// Append a space to allow for wrapping
			txt = document.createTextNode(' ');
			div.appendChild(txt);

			// Append link container div
			linkDiv = document.createElement('div');
			linkDiv.id = 'asylumNavLinkDiv' + linkId;
			linkDiv.linkId = linkId;
			linkDiv.levelId = levelId;
			linkDiv.className = 'linkDiv';
			div.appendChild(linkDiv);

			navLink = this.menuItems[levelId][linkId];
			a = document.createElement('a');
			a.id = 'asylumNavLink' + linkId;
			a.linkType = 'navMenu';
			a.linkId = linkId;
			a.levelId = navLink.parentId;
			a.parentId = navLink.parentId;
			a.href = navLink.href;
			a.target = navLink.target;
			if(this.menuLayout == 'Vertical')
			{
				a.innerHTML = navLink.linkText;
			}
			else
			{
				a.innerHTML = navLink.linkText.split(' ').join('&nbsp;');
			}
			a.onmouseover = function() {obj.ShowLevel(this);}
			linkDiv.appendChild(a);

			// Tag active links.
			base = document.location.protocol + '//' + document.location.hostname;
			url = document.location.href;

			// Fix for WG redirection.
			if(url.indexOf('?Redirected') != -1)
			{
				url = url.split('?')[0];
			}

			if(url == navLink.href || (url == base + '/' && navLink.href == base + '/index.html'))
			{
				a.className = 'activeLink';
				linkDiv.className += ' activeLink';

				// Style parent (level '0') link
				topLink = this.GetTopLevelLink(navLink);
				if(typeof this.menuItems[topLink.linkId] != 'undefined' && navLink.levelId != '0')
				{
					document.getElementById('asylumNavLink' + topLink.linkId).className += ' activeSubLinks';
					document.getElementById('asylumNavLinkDiv' + topLink.linkId).className += ' activeSubLinks';
				}

				// Create clickunder.
				if(document.getElementById("clickUnder") != null)
				{
					// Switch off sumbenu show on parent link of clickunder.
					if(this.menuLayout != 'Horizontal-SubMenu') document.getElementById('asylumNavLink' + topLink.linkId).onmouseover = function() {obj.HideAllLevels();}
					this.CreateClickUnder(topLink);
				}
			}

			if(typeof this.menuItems[linkId] != 'undefined')
			{
				div.subLevels[linkId] = true;
			}

		}

	}

	// Set fixed height for vertical nav menus.
	if(this.menuLayout == 'Vertical')
	{
		totalHeight = 0;
		for(levelId in this.menuItems)
		{
			if(levelId == '0')
			{
				totalHeight += document.getElementById('asylumNavLevel' + levelId).offsetHeight;
			}
		}

		this.menuCont.style.height = totalHeight + 'px';
	}

	this.CreateBreadCrumbs();
}

AsylumNav.prototype.CreateClickUnder = function(navLink)
{
	obj = this;

	if(this.clickUnderCreated == true)
	{
		return(false);
	}

	this.clickUnderCreated = true;
	var linkId;

	if(this.menuLayout == 'Vertical')
	{
		clickDiv = document.getElementById("clickUnder");
		linkDiv = document.getElementById('asylumNavLinkDiv' + navLink.linkId);
		linkDiv.appendChild(clickDiv);
	}

	clickDiv = document.getElementById("clickUnder");

	var linkCount = 0;
	for(linkId in this.menuItems[navLink.linkId])
	{
		linkCount ++;
		clickLinkDiv = document.createElement('div');
		clickLinkDiv.className = 'clickLinkDiv';
		clickLink = this.menuItems[navLink.linkId][linkId];

		// Append a space to allow for wrapping (IE Fix)
		txt = document.createTextNode(' ');
		clickDiv.appendChild(txt);

		a = document.createElement('a');
		a.id = 'asylumNavClickLink' + clickLink.linkId;
		a.className = 'clickLink';

		a.linkType = 'clickLink';
		a.linkId = linkId;
		a.levelId = clickLink.parentId;
		a.parentId = clickLink.parentId;
		a.href = clickLink.href;
		a.target = clickLink.target;
		if(this.menuLayout == 'Vertical' || this.menuLayout == 'Horizontal-SubMenu')
		{
			a.innerHTML = clickLink.linkText;
		}
		else
		{
			a.innerHTML = clickLink.linkText.split(' ').join('&nbsp;'); //clickLink.linkText;
		}

		// Child menus show from top level links, not clickunders in Horizontal-SubMenu
		if(this.menuLayout != 'Horizontal-SubMenu')
		{
			a.onmouseover = function() {obj.HideAllLevels(); obj.ShowLevel(this);}
			a.onmouseout = function(e) {obj.HideLevel(e);}
		}
		clickLinkDiv.appendChild(a);

		// Tag active links.
		base = document.location.protocol + '//' + document.location.hostname;
		url = document.location.href;

		if(url == a.href || (url == base + '/' && a.href == base + '/index.html'))
		{
			a.className = 'activeLink';
			clickLinkDiv.className += ' activeLink';
		}

		clickDiv.appendChild(clickLinkDiv);

		// Create space after node so cells can wrap.
		txt = document.createTextNode(' ');
		clickDiv.appendChild(txt);
	}

	if(linkCount == 0)
	{
		clickDiv.className = 'inactiveClickUnder';
	}
	else
	{
		clickDiv.className = 'activeClickUnder';
	}

}

AsylumNav.prototype.GetTopLevelLink = function(navLink)
{
	if(navLink.parentId == '0')
	{
		return(navLink);
	}

	while(1==1)
	{
		navLink = this.GetParentLink(navLink);

		if(typeof navLink.parentId != 'undefined')
		{
			if(navLink.parentId == '0')
			{
				break;
			}
		}
	}

	return(navLink);
}

AsylumNav.prototype.GetParentLink = function(navLink)
{
	var levelId;
	var linkId;

	for(levelId in this.menuItems)
	{
		for(linkId in this.menuItems[levelId])
		{
			parNavLink = this.menuItems[levelId][linkId];

			if(parNavLink.linkId == navLink.parentId)
			{
				return(parNavLink);
			}
		}
	}
}

AsylumNav.prototype.GetXPos = function(obj)
{
	var curleft = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent && obj.id != 'navMenuCont')
		{
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

AsylumNav.prototype.GetYPos = function(obj)
{
	var curtop = 0;
	if (obj.offsetParent)
	{
		while (obj.offsetParent && obj.id != 'navMenuCont')
		{
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	return curtop;
}

AsylumNav.prototype.ShowLevel = function(el)
{
	levelId = el.linkId;

	this.currentLevelId = levelId;

	window.clearTimeout(this.timeoutId);
	this.HideSubLevels(el.levelId);

	if(typeof this.menuItems[levelId] == 'undefined')
	{
		return;
	}

	if(el.linkType == 'clickLink')
	{
		eP = document.getElementById('asylumNavClickLink' + el.linkId);
	}
	else
	{
		eP = document.getElementById('asylumNavLink' + levelId);
	}

	eL = document.getElementById('asylumNavLevel' + levelId);

	if(eL.style.visibility == 'visible')
	{
		return;
	}

	pX = this.GetXPos(eP);
	pY = this.GetYPos(eP);

	pW = eP.offsetWidth;
	pH = eP.offsetHeight;

	if(eP.parentId == '0')
	{
		offsetX = new String(this.firstLevelOffsetX);
		offsetY = new String(this.firstLevelOffsetY);

		// First level drop downs look best the same width as their parent.
		if(this.menuLayout == 'Horizontal' || this.menuLayout == 'Horizontal-SubMenu')
		{
			if(IE)
			{
				// Enforce min-width in IE.
				// Rather convoluted but because of IEs poor CSS rendering this is the only consistent way.
				maxWidth = eP.offsetWidth;
				for(linkId in this.menuItems[levelId])
				{
					a = document.getElementById('asylumNavLink' + linkId);
					thisWidth = a.offsetWidth;

					if(thisWidth > maxWidth)
					{
						maxWidth = thisWidth;
					}
				}

				for(linkId in this.menuItems[levelId])
				{
					a = document.getElementById('asylumNavLink' + linkId);
					a.style.width = maxWidth;
				}
			}
			else
			{
				eL.style.minWidth = eP.offsetWidth;
			}
		}
	}
	else
	{
		offsetX = new String(this.subLevelOffsetX);
		offsetY = new String(this.subLevelOffsetY);
	}

	// Replace var holders with values.
	offsetX = offsetX.replace(/w/gi, pW);
	offsetX = offsetX.replace(/h/gi, pH);
	offsetY = offsetY.replace(/w/gi, pW);
	offsetY = offsetY.replace(/h/gi, pH);

	offsetX = eval(offsetX);
	offsetY = eval(offsetY);

	if(el.linkType == 'clickLink')
	{
		if(this.menuLayout == 'Vertical')
		{
			offsetX = pW;
			offsetY = 0;
		}
		else
		{
			offsetX = 0;
			offsetY = pH;
		}
	}

	lX = pX + offsetX;
	lY = pY + offsetY;

	eBG = document.getElementById('asylumNavLevelBG' + levelId);
	eBG.style.width = eL.offsetWidth;
	eBG.style.height = eL.offsetHeight;
	eBG.style.left = lX;
	eBG.style.top = lY;
	eBG.style.visibility = 'visible';

	eL.style.position = 'absolute';
	eL.style.left = lX + 'px';
	eL.style.top = lY + 'px';
	eL.style.visibility = 'visible';
}

AsylumNav.prototype.HideSubLevels = function(levelId, omitLevelId)
{
	if(typeof omitLevelId == 'undefined')
	{
		omitLevelId = '0';
	}

	eL = document.getElementById('asylumNavLevel' + levelId);

	for(levelId in eL.subLevels)
	{
		this.HideSubLevels(levelId);

		if(levelId != omitLevelId)
		{
			eL = document.getElementById('asylumNavLevel' + levelId);
			eBG = document.getElementById('asylumNavLevelBG' + levelId);
			eL.style.visibility = 'hidden';
			eBG.style.visibility = 'hidden';
		}
	}
}

AsylumNav.prototype.HideLevel = function(e)
{
	window.clearTimeout(this.timeoutId);

	if(!e) var e = window.event;
	var el = (e.relatedTarget) ? e.relatedTarget : e.toElement;

	var obj = this;
    var funct = function () { obj._HideLevel(el) };
    this.timeoutId = window.setTimeout(funct, 1000);
}

AsylumNav.prototype._HideLevel = function(el)
{
	if(!el || el.id.substr(0, 9) != 'asylumNav' || (el.id.substr(0, 9) == 'asylumNav' && el.style.visibility == 'hidden'))
	{
		this.HideAllLevels();
	}
}

AsylumNav.prototype.HideAllLevels = function()
{
	for(levelId in this.menuItems)
	{
		if(levelId != '0')
		{
			eL = document.getElementById('asylumNavLevel' + levelId);
			eBG = document.getElementById('asylumNavLevelBG' + levelId);
			eL.style.visibility = 'hidden';
			eBG.style.visibility = 'hidden';
		}
	}
}

// Breadcrumbs Script (called when menu initializes).
AsylumNav.prototype.CreateBreadCrumbs = function()
{
	if(document.getElementById("breadCrumbs") != null)
	{
		crumbsCont = document.getElementById("breadCrumbs");
		crumbsCont.className = 'inactiveCrumbs';
		crumbs = '';
		homeLink = '';

		for(levelId in this.menuItems)
		{
			for(linkId in this.menuItems[levelId])
			{
				navLink = this.menuItems[levelId][linkId];

				// First link (home)
				if(homeLink == '')
				{
					homeLink = '<a href="' + navLink.href + '" target="' + navLink.target + '">'
						+ navLink.linkText + '</a> &gt; ';
				}

				// Is this the active link?.
				base = document.location.protocol + '//' + document.location.hostname;
				url = document.location.href;
				if(url == navLink.href || (url == base + '/' && navLink.href == base + '/index.html'))
				{
					i = 0;
					parNavLink = this.GetParentLink(navLink);
					while(typeof parNavLink == 'object')
					{
						i++;
						crumbs = '<a href="' + parNavLink.href + '" target="' + parNavLink.target + '">'
							+ parNavLink.linkText + '</a> &gt; ' + crumbs;

						parNavLink = this.GetParentLink(parNavLink);
					}

					// Create crumbs only if 3rd level or deeper.
					if(i > 1)
					{
						crumbsCont.className = 'activeCrumbs';
						crumbsCont.innerHTML = homeLink + crumbs + navLink.linkText;
					}

					return(true);
				}
			}

		}
	}

}




