// This script is not freeware!
//
// Multi-Level Drop-Down Menu 1.53
// You can find and buy latest version of this script 
// at the http://spicebrains.com/multi-level-drop-down-menu/
//
// Copyright 2007 SpiceBrains.com

var timeout = 1000;
var shift_x = 0;
var shift_y = 0;

////////////////////////////////////////////////////////////////////////////////////////////////////

var MLDDM_ID		= 'mlddm';		// menu id
var obj_menu		= null;			// menu object
var top_level_items = new Array();  // buttons
var all_layers		= new Array();	// menu layers (all li vs ul)

function initmlddm()
{
	var candidates = document.getElementsByTagName('ul');
	for(var i=0; i < candidates.length; i++) 
	{
		if(candidates[i].id == MLDDM_ID) { obj_menu = candidates[i]; break; }
	}
	
	if(obj_menu.hasChildNodes())
	{
		var current = obj_menu.getElementsByTagName("li")[0];
		var i = 0;
		while(current)
		{
			top_level_items[i] = current;
			current = node_after(current);
			i++;
		}
	}

	var all_li = new Array();
	var all_li_vs_ul = new Array();
	var count = 0;
	all_li = obj_menu.getElementsByTagName("li");
	for(var i=0; i<all_li.length; i++)
	{
		if(all_li[i].getElementsByTagName("ul")[0]) 
		{
			all_li_vs_ul[count] = all_li[i];
			count++;
		}

		all_li[i].onmouseover = eventover;
		all_li[i].onmouseout  = eventout;
	}

	obj_menu.onmouseout  = allout;

	for(var i=0; i<all_li_vs_ul.length; i++)
	{
		all_layers[i] = all_li_vs_ul[i].getElementsByTagName("ul")[0];	
	}
	
    /**************************************************************************/
	var li_blocks = new Array();
	var right_plus_left_padding;

	for(index = 0; index < all_layers.length; index++)
	{
		var current_a;

		li_blocks[index] = new Array();
		var current = all_layers[index].getElementsByTagName("li")[0];
		var j = 0;
		while(current)
		{
			li_blocks[index][j] = current;
			current = node_after(current);
			j++;
		}

		for(i = 0; i < li_blocks[index].length; i++)
		{
			current = li_blocks[index][i].getElementsByTagName("a")[0];
			current.style.display = 'inline';
		}
		
		var longest;
		var cur;
		var maxwidth = 0;
		for(i = 0; i < li_blocks[index].length; i++)
		{
			cur = li_blocks[index][i].getElementsByTagName("a")[0];
			
			if(cur.offsetWidth >= maxwidth)
			{
				maxwidth = cur.offsetWidth;
				longest = cur;
			}
		}

		for(i = 0; i < li_blocks[index].length; i++)
		{
			cur = li_blocks[index][i].getElementsByTagName("a")[0];
			cur.style.display = 'block';
			if(cur.offsetWidth >= maxwidth)
			{
				maxwidth = cur.offsetWidth;
				longest = cur;
			}
		}

		longest.style.width   = maxwidth + 'px';
		right_plus_left_padding = longest.offsetWidth - maxwidth;

		for(var i=0; i < li_blocks[index].length; i++)
		{
			current_a = li_blocks[index][i].getElementsByTagName("a")[0];
			current_a.style.display = 'block';
			current_a.style.width   = maxwidth - right_plus_left_padding + 'px';
		}
	}

	/**************************************************************************/
	for(index = 0; index < all_layers.length; index++)
	{
		var level = 0;
		var currentobj = all_layers[index];
		while(currentobj.id != MLDDM_ID)
		{
			if(currentobj.tagName == 'UL') level++;
			currentobj = currentobj.parentNode;
		}
		
		if(level > 1)
		{
			var parent_ul;
			var parent_a;
			var curr = all_layers[index].parentNode;
			while(curr.tagName != 'UL') 
			{	
				if(curr.parentNode)
					curr = curr.parentNode;
				else
					return 1;
			}
			parent_ul = curr;

			var curr = all_layers[index].parentNode;
			while(curr.tagName != 'LI') 
			{
				if(curr.parentNode)
					curr = curr.parentNode;
				else
					return 1;
			}
			parent_a = curr.getElementsByTagName("a")[0];

			var a_tags = new Array();
			var i = 0;
			curr = parent_ul.getElementsByTagName("li")[0];
			while(curr)
			{
				if(curr.getElementsByTagName("a")[0]) a_tags[i] = curr.getElementsByTagName("a")[0];
				curr = node_after(curr);
				if(curr) if(curr.tagName == 'LI') i++;
			}

			var num = 0;			
			for(var i = 0; i < a_tags.length; i++)
			{
				if(a_tags[i] != parent_a) num++;
				else break;
			}

			var tag_a  = parent_ul.getElementsByTagName("a")[0];
			var width  = tag_a.offsetWidth;
			var height = tag_a.offsetHeight;
		
			all_layers[index].style.position = 'absolute';
			all_layers[index].style.left     = width      + shift_x + 'px';
			all_layers[index].style.top      = height*num + shift_y +'px';
		}
	}
}
	
var timeouts = new Array();
var out = true;
var lastparentlayer = 0;

function eventover() 
{
	if(out)
	{	out = false;
		
		mcancelclosetime();

		for(var i=0; i<timeouts.length; i++) window.clearTimeout(timeouts[i]);

		var currentli = this;
		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 index = 0;
		while(currobj.id != MLDDM_ID)
		{
			if(currobj.tagName == 'UL') 
			{
				index++;
				open_layers[index] = currobj;
			}
			currobj = currobj.parentNode;
		}

		var present = false;
		for(var i=0; i<all_layers.length; i++)
		{
			for(var j=0; j<open_layers.length; j++)
			{
				if(all_layers[i] == open_layers[j]) present = true;
			}

			if(!present)
			{
				if(lastparentlayer == open_layers[0])
					timeouts[i] = window.setTimeout('mclose("' + i + '")', 100);
				else 
					mclose(i);
			}
			else
			{	
				present = false;
			}
		}
		
		if(open_layers[0]) mopen(open_layers[0]);
		else switchtopmenuitem(currentli);

		lastparentlayer = open_layers[1];
	}
}

function gettopmenuitem(obj)
{
	var topmenuitem;
	var currobj = obj;
	var index = 0;
	while(currobj.id != MLDDM_ID)
	{	
		if(currobj.tagName == 'LI') 
		{
			index++;
			topmenuitem = currobj;
		}
		currobj = currobj.parentNode;
	}
	return topmenuitem;
}

function switchtopmenuitem(obj)
{
	var topmenuitem = gettopmenuitem(obj);
	if(topmenuitem) 
	{
		topmenuitem = topmenuitem.getElementsByTagName("a")[0];
		topmenuitem.id = 'tophover';
	}

	var anchor;
	for(var i=0; i<top_level_items.length; i++)
	{
		anchor = top_level_items[i].getElementsByTagName("a")[0];
		if(anchor != topmenuitem) anchor.id = 'topnohover';
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////
var closeTimer		= 0;

function allout()
{
	for(var i=0; i<timeouts.length; i++) window.clearTimeout(timeouts[i]);
	mclosetime();
}

function eventout() 
{
	var obj = this;
	var currobj = obj.parentNode;
	var anchor;
	if(currobj.id == MLDDM_ID)
	{
		var haslayer = 0;

		if(obj.hasChildNodes())
		{
			var children = obj.childNodes;
			for (var i = 0; i < children.length; i++) 
			{
				if(children[i].tagName == 'UL') haslayer = 1;
			}
		}

		if(!haslayer)
		{
			anchor = obj.getElementsByTagName("a")[0];
			anchor.id = 'topnohover';
		}
	}


	out = true;
}

function mopen(obj)
{
	switchtopmenuitem(obj);
	if(obj) obj.style.visibility='visible';
}

function mclose(index)
{
	if(all_layers[index]) all_layers[index].style.visibility='hidden';
}

function closeall()
{
	var anchor;
	for(var i=0; i<top_level_items.length; i++)
	{
		anchor = top_level_items[i].getElementsByTagName("a")[0];
		anchor.id = 'topnohover';
	}
	
	for(var i=0; i<all_layers.length; i++)
	{
		mclose(i);
	}

}

function mclosetime()
{
	closeTimer = window.setTimeout("closeall()", TimeOut);
}

function mcancelclosetime()
{
	if(closeTimer)
	{
		window.clearTimeout(closeTimer);
		closeTimer = null;
	}
}

////////////////////////////////////////////////////////////////////////////////////////////////////
function is_all_ws( nod )
{
  return !(/[^\t\n\r ]/.test(nod.data)); // Use ECMA-262 Edition 3 String and RegExp features
}

function is_ignorable( nod )
{
  return ( nod.nodeType == 8) || // A comment node
         ((nod.nodeType == 3) && is_all_ws(nod) ); // a text node, all ws
}

function node_after(sib)
{
	while((sib = sib.nextSibling)) 
	{
		if(!is_ignorable(sib)) return sib;
	}
	return null;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
/* Handlers for automated loading */ 
_LOADERS = Array();

function callAllLoaders() 
{
	var i, loaderFunc;

	for(i=0;i<_LOADERS.length;i++) 
	{
		loaderFunc = _LOADERS[i];
		if(loaderFunc != callAllLoaders) loaderFunc();
	}
}

function appendLoader(loaderFunc) 
{
	if(window.onload && window.onload != callAllLoaders) _LOADERS[_LOADERS.length] = window.onload;
	window.onload = callAllLoaders;
	_LOADERS[_LOADERS.length] = loaderFunc;
}

appendLoader(initmlddm);
document.onclick = closeall;

