jQuery(document).ready(function() {
	
	initializeMultiLevelNav('#navigation-inside');
	initializeMultiLevelNav('#tools');
	
});

function initializeMultiLevelNav(navContainer)
{
	var i, navLevelCount;
	
	// define number of levels to support
	navLevelCount = 4;
	
	// apply mouse enter/leave functionality to all defined levels
	for(i = 0; i < navLevelCount; i++){
		jQuery(navContainer + ' ul.nav-level-' + (i + 1) + ' li.has-children').each(function(){
			this.index = (i + 1);
			jQuery(this).mouseenter(function(){
				expandMenuItem(jQuery('ul.nav-level-' + (this.index + 1), this));
			}).mouseleave(function(){
				collapseMenuItem(jQuery('ul.nav-level-' + (this.index + 1), this));
			});
		});
	}
}
function expandMenuItem(menuItem)
{
	// fade next menu level in
	jQuery(menuItem).stop(true, true).fadeIn(100);
	
	// apply class to keep current level in visual hover state
	jQuery(menuItem).parent().addClass('open').find('> a').addClass('open');;
	
	// determine if subsequent menus might fall off the right side of the page and redirect as necessary
	jQuery('>li.has-children', menuItem).each(function(){
		var mainMenuRightEdge = localToGlobal(jQuery('#navigation-inside').get(0)).right;
		var menuItemRightEdge = localToGlobal(jQuery(this).context).right;
		var menuItemWidth = jQuery(this).width();
		if(menuItemRightEdge + menuItemWidth > mainMenuRightEdge && jQuery('>ul>li>ul', this).length >= 1){
			jQuery(this).addClass('expandLeft').parent().addClass('expandLeft');
		}
	});
}
function collapseMenuItem(menuItem)
{
	// apply class to keep current level in visual hover state
	jQuery(menuItem).parent().removeClass('open').find('> a').removeClass('open');;
	
	// fade next menu level out
	jQuery(menuItem).stop(true, true).delay(150).fadeOut(100);
}

function localToGlobal( _el )
{
	var target = _el, target_width = target.offsetWidth, target_height = target.offsetHeight, target_left = target.offsetLeft, target_top = target.offsetTop, gleft = 0, gtop = 0, rect = {};
	
	var moonwalk = function( _parent ) {
		if (!!_parent) {
			gleft += _parent.offsetLeft;
			gtop += _parent.offsetTop;
			moonwalk( _parent.offsetParent );
		} else {
			return rect = {
				top: target.offsetTop + gtop,
				left: target.offsetLeft + gleft,
				bottom: (target.offsetTop + gtop) + target_height,
				right: (target.offsetLeft + gleft) + target_width
			};
		}
	};
	moonwalk(target.offsetParent );
	return rect;
}
