var menu_shiftx = 0;
var menu_shifty = 0;
var menu_timeoutTime = 500;
var menu_effect = "slide";
var menu_effect_speed = 300;
var menu_orientation = "h";
var MENU_CLASSNAME = "sitemap";
var obj_menu = new Array;

function loader(container, url)
{
	new Ajax.Updater
	(
		container,
		url,
		{
			onComplete: menuInit
		}
	);
}
function menuInit()
{
	var index = 0;
	$$("ul."+MENU_CLASSNAME).each(
		function(c)
		{
			// c.style.visibility = "visible";
			var params = c.getAttribute("params");
			obj_menu[index] = new menu(c, index++, params);
		}
	);
}
function layer(handler) 
{
	this.handler = handler;
	this.visible = false;
	this.level = 0;
	this.outerwidth = 0;
	this.outerheight = 0;
	this.innerwidth = 0;
	this.innerheight = 0;
	this.x = 0;
	this.y = 0;
	this.border = 0;
	this.topmargin = 0;
	this.shifter = 0;
	this.parentindex = 0;
	this.reverse = false;
	this.timeouts = new Array;
	this.degree = 0;
}
function menu(obj, obj_n, params)
{
	var _menu = obj;
	var _menuID = obj_n;
	var _self = this;
	var _timeout = null;
	var _closed = true;
	var _child = null;
	var _shiftX = menu_shiftx;
	var _shiftY = menu_shifty;
	var _timeoutTime = menu_timeoutTime;
	var _effect = menu_effect;
	var _effectSpeed = menu_effect_speed;
	var _orientation = menu_orientation;
	var params_array;
	if (params) 
	{
		params_array = params.split(",");
		if (params_array[0]) 
		{
			_shiftX = params_array[0] * 1;
		}
		if (params_array[1]) 
		{
			_shiftY = params_array[1] * 1;
		}
		if (params_array[2]) 
		{
			_timeoutTime = params_array[2] * 1;
		}
		if (params_array[3]) 
		{
			_effect = params_array[3];
		}
		if (params_array[4]) 
		{
			_effectSpeed = params_array[4] * 1;
		}
		if (params_array[5]) 
		{
			_orientation = params_array[5];
		}
		if (!_effectSpeed) 
		{
			_effectSpeed = 1000;
		}
	}
	this._layers = new Array;

	function opacity(index, opac_start, opac_end, speed) 
	{
		var current_layer = _self._layers[index];
		for (var z = 0; z < current_layer.timeouts.length; z++) 
		{
			clearTimeout(current_layer.timeouts[z]);
		}
		var degree = current_layer.degree;
		var speed = Math.round(1000 / speed);
		var timer = 0;
		if (degree < opac_end) 
		{
			for (var i = degree; i <= opac_end; i = i + 4) 
			{
				current_layer.timeouts[timer] = setTimeout("changeOpac(" + _menuID + "," + index + "," + i + ")", timer * speed);
				timer++;
			}
		} 
		else if (degree > opac_end) 
		{
			for (var i = degree; i >= opac_end; i = i - 4) 
			{
				current_layer.timeouts[timer] = setTimeout("changeOpac(" + _menuID + "," + index + "," + i + ")", timer * speed);
				timer++;
			}
		}
	}
	function slide(index, direction, speed) 
	{
		var current_layer = _self._layers[index];
		for (var z = 0; z < current_layer.timeouts.length; z++) 
		{
			clearTimeout(current_layer.timeouts[z]);
		}
		var degree = current_layer.degree;
		var speed = Math.round(1000 / speed);
		var timer = 0;
		if (_orientation == "h") 
		{
			_ori = 0;
		}
		else 
		{
			_ori = 1;
		}
		if (direction == "show") 
		{
			for (i = degree; i <= 100; i = i + 2)
			{
				current_layer.timeouts[timer] = setTimeout("changePOS(" + _menuID + "," + index + "," + i + "," + _ori + ")", timer * speed);
				timer++;
			}
		} 
		else if (direction == "hide") 
		{
			for (i = degree; i >= 0; i = i - 2) 
			{
				current_layer.timeouts[timer] = setTimeout("changePOS(" + _menuID + "," + index + "," + i + "," + _ori + ")", timer * speed);
				timer++;
			}
		}
	}
	function mopen(index) 
	{
		if (!_self._layers[index].visible) 
		{
			if (_effect == "fade") 
			{
				opacity(index, 0, 100, _effectSpeed);
			} 
			else if (_effect == "slide") 
			{
				slide(index, "show", _effectSpeed);
			} 
			else 
			{
				_self._layers[index].handler.style.visibility = "visible";
			}
			button_on(_self._layers[index].handler);
			_self._layers[index].visible = true;
		}
	}
	function mclose(index) 
	{
		if (_self._layers[index].visible) 
		{
			if (_effect == "fade") 
			{
				opacity(index, 100, 0, _effectSpeed);
			} 
			else if (_effect == "slide") 
			{
				slide(index, "hide", _effectSpeed);
			} 
			else 
			{
				_self._layers[index].handler.style.visibility = "hidden";
			}
			button_off(_self._layers[index].handler);
			_self._layers[index].visible = false;
		}
	}
	function getlevel(layer) 
	{
		var level = 0;
		var currentobj = layer;
		while (!Element.hasClassName(currentobj, MENU_CLASSNAME)) 
		{
			if (currentobj.nodeName == "UL") 
			{
				level++;
			}
			currentobj = currentobj.parentNode;
		}
		return level;
	}
	function getbutton(layer) 
	{
		var button;
		var currobj = layer;
		var index = 0;
		while (!Element.hasClassName(currobj, MENU_CLASSNAME)) 
		{
			if (currobj.nodeName == "LI") 
			{
				index++;
				button = currobj;
			}
			currobj = currobj.parentNode;
		}
		return button;
	}
	function button_on(layer) 
	{
		if (getlevel(layer) != 1) 
		{
			return -1;
		}
		var button = getbutton(layer);
		if (button) 
		{
			Element.down(button).addClassName('hover');
		}
	}
	function button_off(layer) {
		if (getlevel(layer) != 1) 
		{
			return -1;
		}
		var button = getbutton(layer);
		if (button) 
		{
			Element.down(button).removeClassName('hover');
		}
	}
	function getlayerindex(obj) 
	{
		for (i = 0; i < _self._layers.length; i++) 
		{
			if (_self._layers[i].handler == obj) 
			{
				return i;
			}
		}
		return -1;
	}
	function getparentindex(layer) 
	{
		while (!Element.hasClassName(layer, MENU_CLASSNAME)) 
		{
			layer = layer.parentNode;
			if (layer.nodeName == "UL") 
			{
				return getlayerindex(layer);
			}
		}
		return -1;
	}
	function gettopmargin(obj) 
	{
		var top = obj.offsetTop;
		obj.style.marginTop = "0px";
		var margintop = top - obj.offsetTop;
		obj.style.marginTop = margintop + "px";
		return margintop;
	}
	function getparentheight(layer) 
	{
		while (!Element.hasClassName(layer, MENU_CLASSNAME)) 
		{
			layer = layer.parentNode;
			if (layer.nodeName == "LI") 
			{
				break;
			}
		}
		return layer.getElementsByTagName("a")[0].offsetHeight;
	}
	function closeall() 
	{
		for (var i = 0; i < _self._layers.length; i++) 
		{
			mclose(i);
		}
	}
	function mclosetime() {
		_timeout = window.setTimeout(closeall, _timeoutTime);
	}
	function mcancelclosetime() 
	{
		if (_timeout) 
		{
			window.clearTimeout(_timeout);
			_timeout = null;
		}
	}
	function setpositions(client_width, scroll_left) 
	{
		var max_right = client_width + scroll_left;
		for (var i = 0; i < _self._layers.length; i++) 
		{
			if (_self._layers[i].level > 1) 
			{
				_self._layers[i].handler.style.left = _self._layers[i].x + "px";
				_self._layers[i].reverse = false;
			}
		}
		for (var i = 0; i < _self._layers.length; i++) 
		{
			var current_layer = _self._layers[i];
			if (current_layer.level > 1) 
			{
			    var layer_width = current_layer.outerwidth;
			    var border_width = current_layer.border;
			    var layer_absx = findPos(current_layer.handler)[0];
			    if (layer_absx + layer_width + border_width * current_layer.level - border_width > max_right) 
				{
					current_layer.handler.style.left = - layer_width - _shiftX + "px";
					current_layer.reverse = true;
			    }
			}
		}
	}
	this.pcloseall = function () 
	{
		closeall();
	};
	this.eventresize = function () 
	{
		setpositions(getClientWidth(), getScrollLeft());
	};
	this.eventscroll = function () 
	{
		setpositions(getClientWidth(), getScrollLeft());
	};
	this.eventover = function () 
	{
		if (_closed) 
		{
			_closed = false;
			mcancelclosetime();
			var currentli = this;
			var layer = currentli.getElementsByTagName("ul")[0];
			var ind = getlayerindex(layer);
			if (ind >= 0) 
			{
				mopen(ind);
			}
			var open_layers = new Array;
			open_layers[0] = currentli.getElementsByTagName("ul")[0];
			if (!open_layers[0]) 
			{
				open_layers[0] = 0;
			}
			var currobj = currentli.parentNode;
			var num = 0;
			while (!Element.hasClassName(currobj, MENU_CLASSNAME)) 
			{
				if (currobj.nodeName == "UL") 
				{
					num++;
					open_layers[num] = currobj;
				}
				currobj = currobj.parentNode;
			}
			var layers_to_hide = new Array(_self._layers.length);
			for (var i = 0; i < layers_to_hide.length; i++) 
			{
				layers_to_hide[i] = false;
			}
			for (var i = 0; i < open_layers.length; i++) 
			{
				layers_to_hide[getlayerindex(open_layers[i])] = true;
			}
			for (var i = 0; i < layers_to_hide.length; i++) 
			{
				if (!layers_to_hide[i] && _child != open_layers[0]) 
				{
					mclose(i);
				}
			}
			_child = open_layers[1];
		}
	};
	this.eventout = function () 
	{
		_closed = true;
	};
	this.allout = function () 
	{
		mclosetime();
	};
	this.allover = function () 
	{
		mcancelclosetime();
	};
	var css = _menu.style.cssText;
	_menu.style.cssText = "visibility:visible;float:left;border-width:0px;margin:0;padding:0";
	_menu.style.cssText = ";width:" + _menu.offsetWidth + "px;" + "height:" + _menu.offsetHeight + "px;" + css;
	this._layers[0] = new layer(_menu);
	var all_li = _menu.getElementsByTagName("li");
	for (var z = 0; z < all_li.length; z++) 
	{
		var layer_handler = all_li[z].getElementsByTagName("ul")[0];
		if (layer_handler) 
		{
			this._layers[this._layers.length] = new layer(layer_handler);
		}
		all_li[z].onmouseover = this.eventover;
		all_li[z].onmouseout = this.eventout;
	}
	_menu.onmouseout = this.allout;
	_menu.onmouseover = this.allover;
	window.onresize = this.eventresize;
	window.onscroll = this.eventscroll;
	for (var num = 1; num < this._layers.length; num++) 
	{
		var nodes = this._layers[num].handler.childNodes;
		var specific_nodes = new Array;
		var maxwidth = 0;
		for (i = 0; i < nodes.length; i++) 
		{
			if (!is_ignorable(nodes[i]) &&
			nodes[i].childNodes[0] &&
			nodes[i].childNodes[0].nodeName != "A") 
			{
				nodes[i].style.display = "none";
				specific_nodes[specific_nodes.length] = nodes[i];
			}
		}
		for (j = 0; j < nodes.length; j++) 
		{
			if (!is_ignorable(nodes[j]) &&
			nodes[j].childNodes[0] &&
			nodes[j].childNodes[0].nodeName == "A") 
			{
				var width = nodes[j].childNodes[0].offsetWidth;
				if (width > maxwidth) 
				{
					maxwidth = width;
				}
			}
		}
		for (z = 0; z < specific_nodes.length; z++) 
		{
			specific_nodes[z].style.display = "inline";
		}
		this._layers[num].handler.style.width = maxwidth + "px";
	}
	for (var num = 0; num < this._layers.length; num++) 
	{
		var current_layer = this._layers[num];
		current_layer.level = getlevel(current_layer.handler);
		current_layer.parentindex = getparentindex(current_layer.handler);
		current_layer.outerwidth = current_layer.handler.offsetWidth;
		current_layer.outerheight = current_layer.handler.offsetHeight;
		current_layer.innerwidth = current_layer.handler.getElementsByTagName("li")[0].childNodes[0].offsetWidth;
		current_layer.innerheight = 0;
		current_layer.border = (current_layer.outerwidth - current_layer.innerwidth) / 2;
		current_layer.topmargin = gettopmargin(current_layer.handler);
		current_layer.shifter = getparentheight(current_layer.handler);
	}
	for (var num = 0; num < this._layers.length; num++) 
	{
		var level = this._layers[num].level;
		var current_layer = this._layers[num];
		if (_orientation == "h" && level > 1 || _orientation == "v" && level > 0) 
		{
			current_layer.x = this._layers[current_layer.parentindex].innerwidth + _shiftX;
			current_layer.y = current_layer.handler.offsetTop - current_layer.topmargin - current_layer.shifter + _shiftY;
			current_layer.handler.style.left = current_layer.x + "px";
			current_layer.handler.style.top = current_layer.y + "px";
		}
	}
	setpositions(getClientWidth(), getScrollLeft());
}
function changeOpac(obj_num, layer_num, opacity) 
{
	var object = obj_menu[obj_num];
	var layer = object._layers[layer_num];
	layer.degree = opacity;
	layer.handler.style.opacity = opacity / 100;
	layer.handler.style.MozOpacity = opacity / 100;
	layer.handler.style.KhtmlOpacity = opacity / 100;
	layer.handler.style.filter = "alpha(opacity=" + opacity + ")";
	if (opacity > 98) 
	{
		layer.handler.style.filter = "none";
	}
	if (opacity > 0) 
	{
		layer.handler.style.visibility = "visible";
	}
	if (opacity <= 0) 
	{
		layer.handler.style.visibility = "hidden";
	}
}
function changePOS(obj_num, layer_num, pos, ori) 
{
	var object = obj_menu[obj_num];
	var layer = object._layers[layer_num];
	var level = layer.level;
	var width = layer.outerwidth;
	var height = layer.outerheight;
	var margintop = layer.topmargin;
	var reverse = layer.reverse;
	layer.degree = pos;
	if (!reverse) 
	{
		if (level == 1 && ori == 0) 
		{
			var h = height - pos * height / 100;
			layer.handler.style.clip = "rect(" + h + "px 2000px 2000px 0px)";
			layer.handler.style.marginTop = - h + margintop + ("px");
		} 
		else 
		{
			var w = width - pos * width / 100;
			layer.handler.style.clip = "rect(0px 2000px 2000px " + w + "px)";
			layer.handler.style.marginLeft = - w + "px";
		}
	} 
	else 
	{
		var w = width - pos * width / 100;
		var mw = width - w;
		layer.handler.style.clip = "rect(0px " + mw + "px 2000px 0px)";
		layer.handler.style.marginLeft = w + "px";
	}
	if (pos <= 0) 
	{
		layer.handler.style.visibility = "hidden";
		layer.handler.style.clip = "rect(-2000px, 2000px, 2000px, -2000px)";
		layer.handler.style.marginLeft = "auto";
	}
	if (pos > 0) 
	{
		layer.handler.style.visibility = "visible";
	}
	if (pos > 98) 
	{
		layer.handler.style.clip = "rect(-2000px, 2000px, 2000px, -2000px)";
		layer.handler.style.marginLeft = "auto";
	}
}
function close() 
{
	for (var i = 0; i < obj_menu.length; i++) 
	{
		obj_menu[i].pcloseall();
	}
}
function is_all_ws(nod) 
{
	return !/[^\t\n\r ]/.test(nod.data);
}
function is_ignorable(nod) 
{
	return nod.nodeType == 8 || nod.nodeType == 3 && is_all_ws(nod);
}
function node_after(sib) 
{
	while ((sib = sib.nextSibling)) 
	{
		if (!is_ignorable(sib)) 
		{
			return sib;
		}
	}
	return null;
}
function getClientWidth() 
{
	return document.documentElement.clientWidth;
}
function getClientHeight() 
{
	return document.documentElement.clientHeight;
}
function getScrollLeft() 
{
	return document.compatMode == "CSS1Compat" && !window.opera ? document.documentElement.scrollLeft : document.body.scrollLeft;
}
function findPos(obj) 
{
	var curleft = curtop = 0;
	if (obj.offsetParent) 
	{
		do 
		{
		curleft += obj.offsetLeft;
		curtop += obj.offsetTop;
		} 
		while ((obj = obj.offsetParent));
	}
	return [curleft, curtop];
}

document.onclick = close;
