/*
 * 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)
 */

function DropDownMenuX(id) {
	this.type =	"horizontal";
	this.delay = {"show":0,"hide":500}
	this.position =	{"level1":{"top":0,"left":0}, "levelX":{"top":0,"left":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 (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]) +	"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;	}
		}
		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) {
					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):
				case /\bitem2\b/.test(nodes[i].className):
				case /\bitem3\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" src="javascript:false;" scrolling="no" frameborder="0" style="position: absolute; top: 0px; left: 0px; display: none; filter:alpha(opacity=0);"></iframe>';
					}
					break;
			}
			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(self.visible.getLast());
			el = document.getElementById(el.getParent().id);
			if (/item\d-active/.test(el.className))	{
				el.className = el.className.replace(/(item\d)-active/, "$1");
			}
		}
		if (self.sections.contains(id_section))	{
			clearTimers();
			self.sectionsHideCnt[self.sections.indexOf(id_section)]++;
			var	cnt	= self.sectionsShowCnt[self.sections.indexOf(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 (self.sections.contains(id_section))	{
			self.sectionsShowCnt[self.sections.indexOf(id_section)]++;
			if (self.visible.contains(id_section)) {
				var	cnt	= self.sectionsHideCnt[self.sections.indexOf(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[self.sections.indexOf(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[self.sections.indexOf(this.id)]++;
		var	cnt	= self.sectionsHideCnt[self.sections.indexOf(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[this.sections.indexOf(id)])	{ return; }
		}
		this.sectionsShowCnt[this.sections.indexOf(id)]++;
		if (this.visible.length) {
			if (id == this.visible.getLast()) {	return;	}
			var	el = new Element(id);
			var	parents	= el.getParentSections();
			for	(var i = this.visible.length - 1; i	>= 0; i--) {
				if (parents.contains(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);
			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	= div.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 (parents.contains(this.visible[i])) {
					break;
				} else {
					this.hideSection(this.visible[i]);
				}
			}
		}
	}

	this.hideSection = function(id,	cnt) {
		if (typeof cnt != "undefined") {
			if (cnt	!= this.sectionsHideCnt[this.sections.indexOf(id)])	{ return; }
			if (id == this.visible.getLast()) {
				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 (this.fixIeSelectBoxBug && this.browser.ie6)	{
			var	iframe = document.getElementById(id+"-iframe");
			iframe.style.display = "none";
		}
		if (this.visible.contains(id)) {
			if (id == this.visible.getLast()) {
				this.visible.pop();
			} else {
				return;
			}
		} else {
			return;
		}
		this.sectionsHideCnt[this.sections.indexOf(id)]++;
	}

	function Element(id) {
		this.menu =	self;
		this.id	= id;
		this.getLevel =	function() {
			var	s =	this.id.substr(this.menu.id.length);
			return s.substrCount("-");
		}
		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 = [];
}

if (typeof Array.prototype.indexOf == "undefined") {
	Array.prototype.indexOf	= function(item) {
		for	(var i = 0;	i <	this.length; i++) {
			if (this[i]	===	item) {
				return i;
			}
		}
		return -1;
	}
}

if (typeof Array.prototype.contains	== "undefined")	{
	Array.prototype.contains = function(s) {
		for	(var i = 0;	i <	this.length; i++) {
			if (this[i]	===	s) {
				return true;
			}
		}
		return false;
	}
}

if (typeof String.prototype.substrCount	== "undefined")	{
	String.prototype.substrCount = function(s) {
		return this.split(s).length	- 1;
	}
}

if (typeof Array.prototype.getLast == "undefined") {
	Array.prototype.getLast	= function() {
		return this[this.length-1];
	}
}


// Removes the last element from an array and returns that element.
if (!Array.prototype.pop) {
    Array.prototype.pop = function() {
        var last;
        if (this.length) {
            last = this[this.length - 1];
            this.length -= 1;
        }
        return last;
    };
}

// Adds one or more elements to the end of an array and returns the new length of the array.
if (!Array.prototype.push) {
    Array.prototype.push = function() {
        for (var i = 0; i < arguments.length; ++i) {
            this[this.length] = arguments[i];
        }
        return this.length;
    };
}

// Removes the first element from an array and returns that element.
if (!Array.prototype.shift) {
    Array.prototype.shift = function() {
        var first;
        if (this.length) {
            first = this[0];
            for (var i = 0; i < this.length - 1; ++i) {
                this[i] = this[i + 1];
            }
            this.length -= 1;
        }
        return first;
    };
}

// Adds one or more elements to the front of an array and returns the new length of the array.
if (!Array.prototype.unshift) {
    Array.prototype.unshift = function() {
        if (arguments.length) {
            var i, len = arguments.length;
            for (i = this.length + len - 1; i >= len; --i) {
                this[i] = this[i - len];
            }
            for (i = 0; i < len; ++i) {
                this[i] = arguments[i];
            }
        }
        return this.length;
    };
}

// Adds and/or removes elements from an array.
if (!Array.prototype.splice) {
    Array.prototype.splice = function(index, howMany) {
        var elements = [], removed = [], i;
        for (i = 2; i < arguments.length; ++i) {
            elements.push(arguments[i]);
        }
        for (i = index; (i < index + howMany) && (i < this.length); ++i) {
            removed.push(this[i]);
        }
        for (i = index + howMany; i < this.length; ++i) {
            this[i - howMany] = this[i];
        }
        this.length -= removed.length;
        for (i = this.length + elements.length - 1; i >= index + elements.length; --i) {
            this[i] = this[i - elements.length];
        }
        for (i = 0; i < elements.length; ++i) {
            this[index + i] = elements[i];
        }
        return removed;
    };
}
