/*
 * DO NOT REMOVE THIS NOTICE
 *
 * PROJECT:   mygosuMenu
 * VERSION:   1.1.6
 * COPYRIGHT: (c) 2003,2004 Cezary Tomczak
 * LINK:      http://gosu.pl/dhtml/mygosumenu.html
 * LICENSE:   BSD (revised)
 * Modified by Sean White to work with swMenuPro (http://www.swonline.biz)
 */
function DropDownMenuX(id)
{
	this.type = "horizontal";
	this.delay = {show: 0, hide: 400};
	this.position = {level1: {top: 0, left: 0}, levelX: {top: 0, left: 0}};
	this.iframename = 0;
	this.fixIeSelectBoxBug = true;
	this.zIndex = {visible: 500, hidden: -1};
	this.browser = {ie: Boolean(document.body.currentStyle), ie5: navigator.appVersion.indexOf("MSIE 5.5") != -1 ||
		navigator.appVersion.indexOf("MSIE 5.0") != -1, ie6: navigator.appVersion.indexOf("MSIE 6.0") != -1};
	if (!this.browser.ie)
	{
		this.browser.ie5 = false;
		this.browser.ie6 = false;
	}
	this.init = function ()
	{
		if (!document.getElementById(this.id))
		{
			return alert("DropDownMenuX.init() failed. Element '" + this.id + "' does not exist.");
		}if (this.type != "horizontal" && this.type != "vertical")
		{
			return alert("DropDownMenuX.init() failed. Unknown menu type: '" + this.type + "'");
		}if (this.browser.ie && this.browser.ie5)
		{
			fixWrap();
		}fixSections();parse(document.getElementById(this.id).childNodes, this.tree, this.id);
	};

	function fixSections()
	{
        var arr = document.getElementById(self.id).getElementsByTagName("div");
		var sections = new Array;
		var widths = new Array;
		for (var i = 0; i < arr.length; i++)
		{
			if (arr[i].className == "section")
			{
				sections.push(arr[i]);
			}
		}
		for (var i = 0; i < sections.length; i++)
		{
			widths.push(getMaxWidth(sections[i].childNodes));
		}
		for (var i = 0; i < sections.length; i++)
		{
			sections[i].style.width = (widths[i] + 100) + "px";
		}
		if (self.browser.ie)
		{
			for (var i = 0; i < sections.length; i++)
			{
				setMaxWidth(sections[i].childNodes, widths[i]);
			}
		}
	}


	function fixWrap()
	{
		var elements = document.getElementById(self.id).getElementsByTagName("a");
		for (var i = 0; i < elements.length; i++)
		{
			if (/item2/.test(elements[i].className))
			{
				elements[i].innerHTML = "<div nowrap=\"nowrap\">" + elements[i].innerHTML + "</div>";
			}
		}
	}


	function getMaxWidth(nodes)
	{
		var maxWidth = 0;
		for (var i = 0; i < nodes.length; i++)
		{
			if (nodes[i].nodeType != 1 ||
				/section/.test(nodes[i].className))
			{
				continue;
			}
			if (nodes[i].offsetWidth > maxWidth)
			{
				maxWidth = nodes[i].offsetWidth;
			}
		}
		// NEM: For IE6, add 100 to the width of the menus.
		return maxWidth + (self.browser.ie6) ? 100 : 0;
		//return maxWidth;
	}


	function setMaxWidth(nodes, maxWidth)
	{
		for (var i = 0; i < nodes.length; i++)
		{
			if (nodes[i].nodeType == 1 &&
				/item2/.test(nodes[i].className) &&
				nodes[i].currentStyle)
			{
				if (self.browser.ie5 || self.browser.ie6)
				{
					nodes[i].style.width = maxWidth + "px";
				}
				else
				{
					nodes[i].style.width = (maxWidth - parseInt(nodes[i].currentStyle.paddingLeft) - parseInt(nodes[i].currentStyle.paddingRight)) + "px";
				}
			}
		}
	}


	function parse(nodes, tree, id)
	{
		for (var i = 0; i < nodes.length; i++)
		{
			if (1 != nodes[i].nodeType)
			{
				continue;
			}
			switch (true)
			{
			case /\bitem1\b/.test(nodes[i].className):
				nodes[i].id = id + "-" + tree.length;
				tree.push(new Array);
				nodes[i].onmouseover = itemOver;
				nodes[i].onmouseout = itemOut;
				break;
			case /\bitem2\b/.test(nodes[i].className):
				nodes[i].id = id + "-" + tree.length;
				tree.push(new Array);
				nodes[i].onmouseover = itemOver;
				nodes[i].onmouseout = itemOut;
				break;
			case /\bsection\b/.test(nodes[i].className):
				nodes[i].id = id + "-" + (tree.length - 1) + "-section";
				nodes[i].onmouseover = sectionOver;
				nodes[i].onmouseout = sectionOut;
				var box1 = document.getElementById(id + "-" + (tree.length - 1));
				var box2 = document.getElementById(nodes[i].id);
				var el = new Element(box1.id);
				if (1 == el.level)
				{
					if ("horizontal" == self.type)
					{
						box2.style.top = box1.offsetTop + box1.offsetHeight + self.position.level1.top + "px";
						if (self.browser.ie5)
						{
							box2.style.left = self.position.level1.left + "px";
						}
						else
						{
							box2.style.left = box1.offsetLeft + self.position.level1.left + "px";
						}
					}
					else if ("vertical" == self.type)
					{
						box2.style.top = box1.offsetTop + self.position.level1.top + "px";
						if (self.browser.ie5)
						{
							box2.style.left = box1.offsetWidth + self.position.level1.left + "px";
						}
						else
						{
							box2.style.left = box1.offsetLeft + box1.offsetWidth + self.position.level1.left + "px";
						}
					}
				}
				else
				{
					box2.style.top = box1.offsetTop + self.position.levelX.top + "px";
					box2.style.left = box1.offsetLeft + box1.offsetWidth + self.position.levelX.left + "px";
				}
				self.sections.push(nodes[i].id);
				self.sectionsShowCnt.push(0);
				self.sectionsHideCnt.push(0);
				if (self.fixIeSelectBoxBug && self.browser.ie6)
				{
					nodes[i].innerHTML = nodes[i].innerHTML + "<iframe id=\"" + nodes[i].id + "-iframe\" class=\"" + self.iframename + "frame\" src=\"about:blank\" scrolling=\"no\" frameborder=\"0\" style=\"position: absolute; top: 0px; left: 0px; display: none; \"></iframe>";
				}
				break;
			default:;
			}
			if (nodes[i].childNodes)
			{
				if (/\bsection\b/.test(nodes[i].className))
				{
					parse(nodes[i].childNodes, tree[tree.length - 1], id + "-" + (tree.length - 1));
				}
				else
				{
					parse(nodes[i].childNodes, tree, id);
				}
			}
		}
	}


	function itemOver()
	{
		self.itemShowCnt++;
		var id_section = this.id + "-section";
		if (self.visible.length)
		{
			var el = new Element(lastItemOfArray(self.visible));
			el = document.getElementById(el.getParent().id);
			if (/item\d-active/.test(el.className))
			{
				el.className = el.className.replace(/(item\d)-active/, "$1");
			}
		}
		if (stringInArray(self.sections, id_section))
		{
			clearTimers();
			self.sectionsHideCnt[itemInArray(self.sections, id_section)]++;
			var cnt = self.sectionsShowCnt[itemInArray(self.sections, id_section)];
			var timerId = setTimeout(function (a, b){return function (){self.showSection(a, b);};}(id_section, cnt), self.delay.show);
			self.timers.push(timerId);
		}
		else
		{
			if (self.visible.length)
			{
				clearTimers();
				var timerId = setTimeout(function (a, b){return function (){self.showItem(a, b);};}(this.id, self.itemShowCnt), self.delay.show);
				self.timers.push(timerId);
			}
		}
	}


	function itemOut()
	{
		self.itemShowCnt++;
		var id_section = this.id + "-section";
		if (stringInArray(self.sections, id_section))
		{
			self.sectionsShowCnt[itemInArray(self.sections, id_section)]++;
			if (stringInArray(self.visible, id_section))
			{
				var cnt = self.sectionsHideCnt[itemInArray(self.sections, id_section)];
				var timerId = setTimeout(function (a, b){return function (){self.hideSection(a, b);};}(id_section, cnt), self.delay.hide);
				self.timers.push(timerId);
			}
		}
	}


	function sectionOver()
	{
		self.sectionsHideCnt[itemInArray(self.sections, this.id)]++;
		var el = new Element(this.id);
		var parent = document.getElementById(el.getParent().id);
		if (!/item\d-active/.test(parent.className))
		{
			parent.className = parent.className.replace(/(item\d)/, "$1-active");
		}
	}


	function sectionOut()
	{
		self.sectionsShowCnt[itemInArray(self.sections, this.id)]++;
		var cnt = self.sectionsHideCnt[itemInArray(self.sections, this.id)];
		var timerId = setTimeout(function (a, b){return function (){self.hideSection(a, b);};}(this.id, cnt), self.delay.hide);
		self.timers.push(timerId);
	}

	this.showSection = function (id, cnt)
	{
		if (typeof cnt != "undefined")
		{
			if (cnt != this.sectionsShowCnt[itemInArray(this.sections, id)])
			{
				return;
			}
		}this.sectionsShowCnt[itemInArray(this.sections, id)]++;if (this.visible.length)
		{
			if (id == lastItemOfArray(this.visible))
			{
				return;
			}var el = new Element(id);var parents = el.getParentSections();for (var i = this.visible.length - 1; i >= 0; i--)
			{
				if (stringInArray(parents, this.visible[i]))
				{
					break;
				}
				else
				{
					this.hideSection(this.visible[i]);
				}
			}
		}var el = new Element(id);var parent = document.getElementById(el.getParent().id);if (!/item\d-active/.test(parent.className))
		{
			parent.className = parent.className.replace(/(item\d)/, "$1-active");
		}if (document.all)
		{
			document.getElementById(id).style.display = "block";
		}document.getElementById(id).style.visibility = "visible";document.getElementById(id).style.zIndex = this.zIndex.visible;if (this.fixIeSelectBoxBug && this.browser.ie6)
		{
			var div = document.getElementById(id);if (div.currentStyle.border == null)
			{
				div.style.borderLeftWidth = 0;div.style.borderRightWidth = 0;div.style.borderTopWidth = 0;div.style.borderBottomWidth = 0;
			}var iframe = document.getElementById(id + "-iframe");iframe.style.width = div.offsetWidth + parseInt(div.currentStyle.borderLeftWidth) + parseInt(div.currentStyle.borderRightWidth);iframe.style.height = div.offsetHeight + parseInt(div.currentStyle.borderTopWidth) + parseInt(div.currentStyle.borderBottomWidth);iframe.style.top = - parseInt(div.currentStyle.borderTopWidth);iframe.style.left = - parseInt(div.currentStyle.borderLeftWidth);iframe.style.zIndex = -1;iframe.style.display = "block";
		}this.visible.push(id);
	};
	this.showItem = function (id, cnt)
	{
		if (typeof cnt != "undefined")
		{
			if (cnt != this.itemShowCnt)
			{
				return;
			}
		}this.itemShowCnt++;if (this.visible.length)
		{
			var el = new Element(id + "-section");var parents = el.getParentSections();for (var i = this.visible.length - 1; i >= 0; i--)
			{
				if (stringInArray(parents, this.visible[i]))
				{
					break;
				}
				else
				{
					this.hideSection(this.visible[i]);
				}
			}
		}
	};
	this.hideSection = function (id, cnt)
	{
		if (typeof cnt != "undefined")
		{
			if (cnt != this.sectionsHideCnt[itemInArray(this.sections, id)])
			{
				return;
			}if (id == lastItemOfArray(this.visible))
			{
				for (var i = this.visible.length - 1; i >= 0; i--)
				{
					this.hideSection(this.visible[i]);
				}return;
			}
		}var el = new Element(id);var parent = document.getElementById(el.getParent().id);if (/item\d-active/.test(parent.className))
		{
			parent.className = parent.className.replace(/(item\d)-active/, "$1");
		}document.getElementById(id).style.zIndex = this.zIndex.hidden;document.getElementById(id).style.visibility = "hidden";if (document.all)
		{
			document.getElementById(id).style.display = "none";
		}if (stringInArray(this.visible, id))
		{
			if (id == lastItemOfArray(this.visible))
			{
				this.visible.pop();
			}
			else
			{
			}
		}
		else
		{
		}this.sectionsHideCnt[itemInArray(this.sections, id)]++;
	};

	function Element(id)
	{
		this.menu = self;
		this.id = id;
		this.getLevel = function ()
		{
			var s = this.id.substr(this.menu.id.length);return countSubStr(s, "-");
		};
		this.getParent = function ()
		{
			var s = this.id.substr(this.menu.id.length);var a = s.split("-");a.pop();return new Element(this.menu.id + a.join("-"));
		};
		this.hasParent = function ()
		{
			var s = this.id.substr(this.menu.id.length);var a = s.split("-");return a.length > 2;
		};
		this.hasChilds = function ()
		{
			return Boolean(document.getElementById(this.id + "-section"));
		};
		this.getParentSections = function ()
		{
			var s = this.id.substr(this.menu.id.length);s = s.substr(0, s.length - "-section".length);var a = s.split("-");a.shift();a.pop();var s = this.menu.id;var parents = [];for (var i = 0; i < a.length; i++)
			{
				s += ("-" + a[i]);parents.push(s + "-section");
			}return parents;
		};
		this.level = this.getLevel();
	}


	function clearTimers()
	{
		for (var i = self.timers.length - 1; i >= 0; i--)
		{
			clearTimeout(self.timers[i]);
			self.timers.pop();
		}
	}

	var self = this;
	this.id = id;
	this.tree = [];
	this.sections = [];
	this.sectionsShowCnt = [];
	this.sectionsHideCnt = [];
	this.itemShowCnt = 0;
	this.timers = [];
	this.visible = [];
}


function itemInArray(inArray, srchItem)
{
	for (var i = 0; i < inArray.length; i++)
	{
		if (inArray[i] === srchItem)
		{
			return i;
		}
	}
	return -1;
}


function stringInArray(inArray, srchItem)
{
	for (var i = 0; i < inArray.length; i++)
	{
		if (inArray[i] === srchItem)
		{
			return true;
		}
	}
	return false;
}


function countSubStr(srcStr, subStr)
{
	return srcStr.split(subStr).length - 1;
}


function lastItemOfArray(inArray)
{
	return inArray[inArray.length - 1];
}

