var initMenu = function(hide)
{
	var $nodes = $("#navigation .lvl2-item");
	var $wrapper = null;
	var $node = null;

	for(var i = 0; i < $nodes.length; i++)
	{			
		$node = $($nodes[i]);
		if($node.find("ul"))
		{
			$wrapper = $(".nav-multi-column-wrapper", $node).hide();
			if(hide)
				leaveItem($node, $wrapper);
			else
				initMenuMultiColumns($node, $wrapper);
		}
	}
};

var initMenuMultiColumns = function($item, $wrapper)
{
	var lv = {};
	lv.$wrapper = $wrapper.show();
	
	if(!lv.$wrapper.length)
	 return;
	
	lv.$first_list = lv.$wrapper.find("ul:eq(0)").show();
	lv.lvl2_timeout = "";

	$item.hover(
		function() { 
			window.clearTimeout(lv.lvl2_timeout);
			initMenu(true);
			hoverItem($(this), lv.$wrapper); 
		}
	,
		function() {  
			lv.lvl2_timeout = window.setTimeout(function() {
				leaveItem($item, lv.$wrapper);
			}, 200);
		}
	);
	
	lv.top_line = lv.$wrapper.offset().top + parseInt(lv.$wrapper.css("padding-top"));
	lv.i = 0;
	$item.find("ul").each(function() {
								
		lv.$list = $(this).show();
	
		setColumnWidth(lv.$list, $wrapper);
		setColumnHeight(lv.$list, $wrapper);

		if(lv.i > 0)
		{
			lv.$list.css({top : (lv.$list.offset().top * - 1 + lv.top_line)});
		}
		
		lv.$list.children().filter("li").each(function() {
			lv.$item = $(this);
			
			if(lv.$item.hasClass("has-children"))
			{
				lv.$item.hover(
					function() { hoverItem($(this), lv.$wrapper); }
				,
					function() { leaveItem($(this), lv.$wrapper); }
				);
			}
		});
		
		lv.i++;
	});
	
	checkBoundary(lv.$wrapper);
	
	$item.find("ul").slice(1).each(function() {
		$(this).hide();
	});
	
	lv.$wrapper.hide();
};

var hoverItem = function($item, $wrapper)
{
	var lv = {};
	lv.item_level = getItemLevel($item, $wrapper);
	
	lv.$list = $item.find("ul:eq(0)").addClass("lvl" + (lv.item_level + 1) + "-list-hovered");
	$item.addClass("lvl" + lv.item_level + "-item-hovered");

	if(lv.item_level - 1 == 1)
	{
		$wrapper.show();	
	}
	
	styleMenuMultiColumns($item, $wrapper, lv.$list, true, { force : false });
};

var leaveItem = function($item, $wrapper)
{ 
	var lv = {};
	lv.item_level = getItemLevel($item, $wrapper);
	
	lv.$list = $item.find("ul:eq(0)").removeClass("lvl" + (lv.item_level + 1) + "-list-hovered");
	$item.removeClass("lvl" + lv.item_level + "-item-hovered");
	
	if(lv.item_level - 1 == 1)
	{
		$wrapper.hide();
		return;
	}
	
	styleMenuMultiColumns($item, $wrapper, lv.$list, false, { force : false });
};

var styleMenuMultiColumns = function($item, $wrapper, $next_list, hover, settings)
{
	if(!settings.force && getItemLevel($item, $wrapper) <= 2)
		return;
	
	var lv = {};
	lv.i = 0;
	lv.item_level = 0;
	lv.max_height = 0;
	lv.width = 0;
	lv.$init_column = $wrapper.find("ul:eq(0)");
	lv.lists = new Array();

	if(!settings.force)
	{
		lv.item_level = getItemLevel($item, $wrapper);
		lv.$parents = $item.parents("." + $wrapper.attr("class").split(" ")[0] + " ul");
		if(hover)
		{
			$next_list.show();
			lv.$parents = $.merge(lv.$parents, $next_list);
		}
		else
		{
			$next_list.hide();
		}
	}
	else
	{
		lv.$parents = $wrapper.find("ul").show();	
	}
	
	$wrapper.find("ul").removeClass("v-line");
	lv.$parents.each(function() {
		lv.$list = $(this);
		lv.list_item_level = getItemLevel(lv.$list.find("li:eq(0)"), $wrapper);
	
		setColumnHeight(lv.$list, $wrapper);	

		if(lv.$list.outerHeight(true) > lv.max_height)
		{
			lv.max_height = lv.$list.outerHeight(true);
		}
		lv.width += lv.$list.outerWidth(true);
		lv.lists[lv.i] = lv.$list;
		lv.i++;
		if($wrapper.hasClass("collapse-left"))
		{
			if(lv.list_item_level > 3)
			{
				lv.$list.addClass("v-line").css({"background-position" : lv.$list.outerWidth() - parseInt(lv.$list.css("padding-right")) / 2 + "px 0"});	
				if(IE6)
				{
					lv.$list.addClass("v-line").css({"background-position" : lv.$list.outerWidth() - parseInt(lv.$list.css("padding-right")) / 2 - 22 + "px 0"});		
				}
			}
		}
		else if((hover & lv.i < lv.$parents.length) | (!hover & lv.i < lv.$parents.length + 1))
		{
			lv.$list.addClass("v-line");
		}
	});
	
	for(lv.i = 0; lv.i < lv.lists.length; lv.i++)
	{
		lv.lists[lv.i].css({height : lv.max_height});	
	}
	
	if(settings.force)
	{
		lv.$parents.hide();	
		lv.$parents.eq(0).show();
	}
	else if(!hover)
	{
		if(($wrapper.hasClass("collapse-left") & lv.item_level < 3) | !$wrapper.hasClass("collapse-left"))
		{
			$item.parent().removeClass("v-line");
		}
	}

	$wrapper.css({height : lv.max_height, width : lv.width});
	$wrapper.find("div:eq(0)").css({height : lv.max_height + 18});
	$wrapper.find("div:last").css({height : lv.max_height + 18});

	if(IE6) {
		if($wrapper.hasClass("collapse-left"))
		{
			$wrapper.find("div:eq(0)").css({height : lv.max_height + (settings.force ? -20 : 18)});
			$wrapper.find("div:last").css({height : lv.max_height + (settings.force ? -19 : 18)});
		}
		
		$wrapper.find(".nav-multi-column-bottom").css({width : lv.width, bottom: -11});
	}
};

var checkBoundary = function($wrapper)
{ 
	var lv = {};
	lv.site_width = 968;

	lv.wrapper_offset_left = $wrapper.offset().left + (15); // shadow adjust

	styleMenuMultiColumns(null, $wrapper, null, true, { force : true });

	lv.overflow_right = lv.site_width - ($wrapper.outerWidth() + lv.wrapper_offset_left);
	
	if(lv.overflow_right < 0)
	{
		$wrapper.addClass("collapse-left");
		$wrapper.find("ul ul").each(function() {
			lv.left = parseInt($(this).css("width")) + parseInt($(this).css("padding-right"));
			$(this).css({left : lv.left * -1});
		});
		
		if(IE6)
			styleMenuMultiColumns(null, $wrapper, null, true, { force : true });
	}
	
	$wrapper.find("li.has-children:eq(0)").mouseleave();
};

var setColumnWidth = function($list, $wrapper)
{
	var lv = {};
	lv.max_width = 0;
	lv.$children = $list.children().filter("li");
	
	lv.item_level = getItemLevel(lv.$children);
	lv.wrapper_padding = $wrapper.find("div:eq(0)").width() + $wrapper.find("div:last").width() - (15); // shadow adjust
	
	$list.css({width : "999px"});
	lv.$children.find("a").each(function() {
		lv.$link = $(this);

		if(lv.$link.width() > lv.max_width)
		{
			lv.max_width = lv.$link.width();
			lv.outer_width = lv.$link.outerWidth(true);
		}
	});
	
	if(lv.item_level == 3 & lv.outer_width < $wrapper.parent().find("a:eq(0)").innerWidth())
	{
		lv.outer_width = $wrapper.parent().find("a:eq(0)").width() - lv.wrapper_padding;
		if(IE6)
		{
			lv.outer_width += 2;	
		}
	}	
	
	lv.$children.each(function() {
		$(this).css({width : lv.outer_width});
		$(this).find("a:eq(0)").css({width : lv.max_width});
	});
	
	$list.css({width : lv.outer_width});
};

var setColumnHeight = function($list, $wrapper)
{
	var lv = {};
	
	lv.height = getListHeight($list);  
	
	$list.css({height : lv.height});
};

var getListHeight  = function($list)
{
	var height = 0;
	
	$list.children().filter("li").find("a:eq(0)").each(function() {
		height += $(this).outerHeight(); 
	}); 
	
	return height;
};

var getItemLevel = function($item, $wrapper)
{
	return ($item.parents("ul").length + 1);
};
