var max = 0;

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

// Menu class
function AsylumNav(contId, layout, offset)
{
	this.menuCont = document.getElementById(contId);
	this.layout = layout;
	this.offset = (typeof offset == 'undefined' ? 'Right' : offset);
	this.menuItems = new Object();

	this.clickUnderCreated = false;
};

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

	if (typeof width == "undefined") width = false;

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

	if (order > max) {
		max = order;
	}
};

AsylumNav.prototype.CreateLevel = function(levelId, idPrefix)
{
	obj = this;

	// Level div.
	div = document.createElement('div');
	div.id = idPrefix + levelId;
	div.levelId = levelId;
	div.idPrefix = idPrefix;
	div.className = 'levelDiv';
	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';
	}
	else
	{
		div.className += ' topLevel';
	}

	if(this.layout == 'Horizontal')
	{
		div.style.position = 'absolute';
	}

	div.style.zIndex = 10;

	if (this.menuCont) {
		this.menuCont.appendChild(div);
	}

	for (i = 0; i <= max; i++) {
		for (linkId in this.menuItems[levelId]) {
			if (this.menuItems[levelId][linkId].order == i) {
				// Append link container div
				linkDiv = document.createElement('div');
				linkDiv.id = 'asylumNavLinkDiv' + linkId;
				linkDiv.linkId = linkId;
				linkDiv.levelId = levelId;
				linkDiv.className = 'linkDiv';

				if (levelId == "0") {
					linkDiv.className += " topLevel";

					if (this.menuItems[levelId][linkId].width) {
						linkDiv.style.width = this.menuItems[levelId][linkId].width + "px";
					}
				}

				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;

				// Support for dummy links
				if(navLink.href == '' || navLink.href == '#')
				{
					a.href = '#';
					a.target = '';
					a.style.cursor = 'default';
				}
				else
				{
					a.href = navLink.href;
					a.target = navLink.target;
				}

				if(this.layout == '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
				if(linkId == pageId)
				{
					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')
					{
						// Chrome complains about this block if there
						// is no active link. Putting it in a try/catch
						// seems to work ok.

						try {
							document.getElementById('asylumNavLink' + topLink.linkId).className += ' activeLink';
							document.getElementById('asylumNavLinkDiv' + topLink.linkId).className += ' activeLink';
						} catch (e) {
						}
					}

					// Create clickunder.
					if(document.getElementById("clickUnder") != null)
					{
						this.CreateClickUnder(topLink, true);
					}
				}
				else
				{
		//			if(this.layout == 'Vertical' && levelId == '0') this.CreateClickUnder(navLink, false);
				}

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

	return div;
};

AsylumNav.prototype.Construct = function()
{
	if (this.menuCont == null) {
		return;
	}

	var obj = this;

	for(levelId in this.menuItems)
	{
		this.CreateLevel(levelId, 'asylumNavLevel');
	}

	// Set fixed height for vertical nav menus.
	if(this.layout == 'Vertical')
	{
		// This check is for preview purposes in Template Center
		if(typeof document.getElementById('tplMainSectors') != null)
		{
			ms = document.getElementById('tplMainSectors');
			ms.style.height = ms.offsetHeight;
		}
	}
	else
	{
		this.menuCont.style.height = document.getElementById('asylumNavLevel0').offsetHeight + 'px';
	}

	this.CreateBreadCrumbs();
};

AsylumNav.prototype.CreateClickUnder = function(navLink, active)
{
	// There was a strange problem with the clickunder being
	// added twice - not sure why, but this should solve it.

	if(typeof doneClickUnder == "undefined") {
		doneClickUnder = true;
	} else {
		return;
	}

	if(document.getElementById("clickUnder") == null) return;

	obj = this;

	var linkId;

	if(this.layout == 'Vertical')
	{
		clickDiv = document.createElement('div');
		clickDiv.id = "clickUnder";
		document.getElementById("clickUnder").appendChild(clickDiv);
		linkDiv = document.getElementById('asylumNavLinkDiv' + navLink.linkId);
		linkDiv.appendChild(clickDiv);
	}
	else
	{
		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;

		// Support for dummy links
		if (clickLink.href == '' || clickLink.href == '#') {
			a.href = '#';
			a.target = '';
			a.style.cursor = 'default';
		} else {
			a.href = clickLink.href;
			a.target = clickLink.target;
		}

		if (this.layout == "Vertical") {
			a.innerHTML = clickLink.linkText;
		} else if (this.layout == "Horizontal-SubMenu") {
			if (clickLink.linkText.substring(0, 1) == " ") {
				// If the first character is a space, we assume that the intention is for the text
				// to be formatted manually, including breaks.

				a.innerHTML = clickLink.linkText.split(" ").join("&nbsp;");
			} else {
				a.innerHTML = clickLink.linkText;
			}
		} else {
			// Stop wrapping in links for standard horizontal clickunders
			a.innerHTML = clickLink.linkText.split(" ").join("&nbsp;");
		}

		a.onmouseover = function() {obj.HideAllLevels(); obj.ShowLevel(this);};
		a.onmouseout = function(e) {obj.HideLevel(e);};
		clickLinkDiv.appendChild(a);

		// Tag active links.
		if(linkId == pageId)
		{
			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 || active == false)
	{
		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);

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

	// Get parent obj and level to show.
	if(el.linkType == 'clickLink')
	{
		eP = document.getElementById('asylumNavClickLink' + el.linkId); // Parent
		eL = document.getElementById('asylumNavLevel' + levelId); // Level to show
		SwapClass(eL, 'subLevel', 'clickUnderSubLevel');
	}
	else
	{
		eP = document.getElementById('asylumNavLink' + levelId); // Parent
		eL = document.getElementById('asylumNavLevel' + levelId); // Level to show
		SwapClass(eL, 'clickUnderSubLevel', 'subLevel');
	}

	// Position sublevel.
	if(eP.parentId == '0')
	{
		switch(this.offset)
		{
			case 'Right':
				offsetX = (eP.offsetWidth);
				offsetY = 0;
				break;
			case 'Left':
				offsetX = (-eL.offsetWidth);
				offsetY = 0;
				break;
			case 'Bottom':
				offsetX = 0;
				offsetY = eP.offsetHeight;

				eL.style.minWidth = eP.offsetWidth;

				break;
		}
	}
	else
	{
		switch(this.offset)
		{
			case 'Left':
				offsetX = (-eL.offsetWidth);
				offsetY = 0;
				break;
			default:
				offsetX = (eP.offsetWidth);
				offsetY = 0;
				break;
		}
	}

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

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

	eL.style.position = 'absolute';

	$(eL).css({
		left: lX,
		top: lY
	});

	eL.style.visibility = 'visible';
};

AsylumNav.prototype.GetLevelWidth = function(levelId)
{
	maxWidth = 0;
	for(linkId in this.menuItems[levelId])
	{
		a = document.getElementById('asylumNavLink' + linkId);
		thisWidth = a.offsetWidth;

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

	return(maxWidth);
};

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);
			eL.style.visibility = 'hidden';
		}
	}
};

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

	if(!e) 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')
		{
			// Hide standard levels.
			eL = document.getElementById('asylumNavLevel' + levelId);
			if(eL != null) eL.style.visibility = 'hidden';
		}
	}
};


// Breadcrumbs Script (called when menu initializes).
AsylumNav.prototype.CreateBreadCrumbs = function()
{
	if(document.getElementById("breadCrumbs") != null)
	{
		crumbsCont = document.getElementById("breadCrumbs");
		crumbsCont.style.display = 'none';
		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?.
				if(linkId == pageId)
				{
					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.style.display = 'block';
						crumbsCont.innerHTML = homeLink + crumbs + '<span class="activeCrumb">' + navLink.linkText + '</span>';
					}

					return(true);
				}
			}

		}
	}
};

function RemoveClass(el, className)
{
	var replaceName = (el.className.match(' ' + className) ? ' ' + className : className);
	el.className = el.className.replace(replaceName, '');
};

function AddClass(el, className)
{
	RemoveClass(el, className);
	el.className += ' ' + className;
};

function SwapClass(el, removeClassName, addClassName)
{
	RemoveClass(el, removeClassName);
	AddClass(el, addClassName);
};
