﻿//////////////////////////////////////////
// Navigation Menu - Populate Functions //
//////////////////////////////////////////

function navigationMenu_initialize() {
	$('[menu-layer=0]').each(function() {
		navigationMenu_initializeMenu($(this));
	});
}

function navigationMenu_initializeMenu($navigationMenu) {
	// Iterate through items and initialize their sub menus if applicable
	navigationMenu_getMenuItems($navigationMenu).each(function() {
		navigationMenu_initializeSubMenu($(this));
	});

	// Bind mouse events for maintaining/hiding menu content
	$navigationMenu.mouseenter(function() {
		var blurID = $navigationMenu.attr('blur-id');

		// If we're entering the menu and we've queued a "blur" event, cancel it
		if (blurID) {
			clearTimeout(blurID);
			$navigationMenu.removeAttr('blur-id');
		}
	}).mouseleave(function(event) {
		// Queue a "blur" event to occur in 1000 ms
		$navigationMenu.attr('blur-id', setTimeout('navigationMenu_hideSubMenus(\'#' + $navigationMenu.attr('id') + '\');', 1000));
	});
}

function navigationMenu_initializeSubMenu($navigationMenuItem) {
	var $subNavigationMenu = navigationMenu_getSubMenu($navigationMenuItem);
	var subLayer = navigationMenu_getMenuItemLayer($navigationMenuItem) + 1;

	// If the item contains a sub menu, iterate through its items and initialize sub menus recursively
	if ($subNavigationMenu.length > 0) {
		navigationMenu_getMenuItems($subNavigationMenu).each(function() {
			navigationMenu_initializeSubMenu($(this));
		});
	}

	// Bind event for hiding all other menus if this item contains the mouse
	$navigationMenuItem.mouseenter(function(event) {
		// Get the top-most menu and check to see if we've already been focusing on it
		var $navigationMenu = $navigationMenuItem.parents('[menu-layer=0]');
		var focusID = $navigationMenu.attr('focus-id');

		// If we haven't been focusing on it, check to see if the highlighted item started a "focus" event
		if (!focusID) {
			focusID = $navigationMenuItem.attr('focus-id');

			// If we have a focus id, then this item is calling itself and the id needs to be reassigned to the top-level menu
			if (focusID) {
				$navigationMenuItem.removeAttr('focus-id');
				$navigationMenu.attr('focus-id', focusID);
			}
		}

		// If we have a focus id at this point, we're allowed to show the menu, else queue a "focus" event to occur in 200 ms
		if (focusID) {
			// IE 7 is lame and makes me hide the children before the parents (otherwise the children don't get hidden)
			var $others = $('[menu-layer=' + subLayer + ']');
			$others.find('[menu-layer]').hide();
			$others.hide();

			if ($subNavigationMenu.length > 0) {
				$subNavigationMenu.show();
			}
		}
		else {
			$navigationMenuItem.attr('focus-id', setTimeout('$(\'#' + $navigationMenuItem.attr('id') + '\').mouseenter();', 200));
		}
	}).mouseleave(function(event) {
		var focusID = $navigationMenuItem.attr('focus-id');

		// If we're leaving the item, then we need to cancael its "focus" event if applicable
		if (focusID) {
			clearTimeout(focusID);
			$navigationMenuItem.removeAttr('focus-id');
		}
	});
}

function navigationMenu_hideSubMenus(selector) {
	var $navigationMenu = $(selector).removeAttr('blur-id').removeAttr('focus-id');
	
	// IE 7 is lame and makes me hide the children before the parents (otherwise the children don't get hidden)
	var $children = $('[menu-layer=1]', $navigationMenu);
	$children.find('[menu-layer]').hide();
	$children.hide();
}

//////////////////////////////////
// Navigation Menu - Properties //
//////////////////////////////////

function navigationMenu_getMenuLayer($navigationMenu) {
	return parseInt($navigationMenu.attr('menu-layer'));
}

function navigationMenu_getMenuItems($navigationMenu) {
	return $('li[menu-item-layer=' + $navigationMenu.attr('menu-layer') + ']', $navigationMenu);
}

function navigationMenu_getMenuItemLayer($navigationMenuItem) {
	return parseInt($navigationMenuItem.attr('menu-item-layer'));
}

function navigationMenu_getSubMenu($navigationMenuItem) {
	return $navigationMenuItem.children('[menu-layer=' + (navigationMenu_getMenuItemLayer($navigationMenuItem) + 1) + ']');
}
if(typeof(Sys)!=='undefined')Sys.Application.notifyScriptLoaded();