﻿/*
**  jquery.toggleMenu.js -- jQuery plugin that is a DropDownList replacement (with links instead).
*   dependancies: jquery.align.js plugin.
* 
*/

(function($) {
	// Toggle Menu List function. DropDownList replacement (with links instead).
	// Expected use: $("#linkID").click(function(){$(this).toggleMenu('#menuID');});
	// @params: m menu, a align element (image works best).
	$.fn.extend({
		toggleMenu : function (m,a) { 
			m = $(m);
			if (m.get(0)!=null)
			{
				var m_id = m.get(0).id;
				if (!$.isAligned("#"+m_id)) {
					$(a).align("#"+m_id,getMenuOffset(m_id));
				}
				// init menu settings. (only for toggle menus).
				if (!menuSettings || !menuSettings[m_id]) {  
					menuSettings[m_id] = { lastToggle:null, showMenuTimeout:0 }; // initialize
					wireUpToggleMenu(m); 
				}
				// toggle (isVisible)
				menuSettings[m_id].lastToggle = !(menuSettings[m_id].lastToggle);
				if (!menuSettings[m_id].lastToggle) {  
					showHideMenu(m,"hide");
					menuTimeout(m_id,null); // clear timeout
				} else {
					// Show Menu
					showHideMenu(m,"show");
					menuTimeout(m_id,2000); // settimeout.
				}
			}
		}
	});
	
	// Internal variables.
	var menuSettings = {};  //default: [lastToggle:null,showMenuTimeout:0 }];
	// menu offset (set by $.setMenuOffset)
	var menuOffset = [{'eX':0,'eY':22}];
	
	// Main show/hide function.
	function showHideMenu(menu,v)
	{
		menu.css("visibility",((v=="show") ? "visible":"hidden"));
		//$("#output").html($("#output").html()+"<br />"+v);
	}
	
	function menuTimeout(m_id,timeout)
	{
		if (menuSettings[m_id].showMenuTimeout!=0) { window.clearTimeout(menuSettings[m_id].showMenuTimeout); // clear any previous timeout.
        menuSettings[m_id].showMenuTimeout=0; }
		if (timeout && timeout>0) { menuSettings[m_id].showMenuTimeout=setTimeout("$.hideMenuExt('#"+m_id+"')",timeout); }
	}
	// Hide menu: setTimeout function required external function.
	$.hideMenuExt = function (id) {	
		id=$(id);
		if (menuSettings[id.get(0).id]) { menuSettings[id.get(0).id].lastToggle=null; } // reset toggle.
		showHideMenu(id,"hide");
	}

	function wireUpToggleMenu(m)
	{
		var m_id=m.get(0).id;
		m.hover(function(e) { e.stopPropagation();showHideMenu(m,"show");menuTimeout(m_id,null); },function(e){ e.stopPropagation();menuTimeout(m_id,800);});
	}
	
	function getMenuOffset(id)
	{
		if (menuOffset[id]){ return menuOffset[id]; }
		else { return menuOffset[0]; }
	}
	
	// Externally accessible functions / settings.
	$.setMenuOffset = function(id,offset)
	{
		menuOffset[id] = offset;
	}
	$.resetMenu = function()
	{
		menuSettings = {}; // reset settings.
		$.alignedIds = { }; // reset alignment.
	}
	
	
	/* Hover Menu */
	// Dropdown Menu function.  No timeout req.
	// Expected use: $("#LinkID").hover(function(){ $(this).hoverMenu('#MenuID','#NavContainterID',true); },function(){ $(this).hoverMenu('#MenuID','#NavContainterID',false);});
    $.fn.extend({
		hoverMenu : function (m,c,show) {
			m = $(m); // menu
			if (m.get(0)!=null)
			{
				c = (c)?$(c):null; // container
				var m_id = m.get(0).id, c_id = (c) ? c.get(0).id:"";
				if (c && !$.isAligned("#"+c_id)) {
					this.align("#"+c_id,getMenuOffset(c_id));
				} else if (!c && !$.isAligned("#"+m_id)) { // no container used. (cont=null).
					this.align("#"+m_id,getMenuOffset(m_id));
				}
				if (!menuSettings || !menuSettings[m_id]) {  
					menuSettings[m_id] = {showMenuTimeout:0 }; // initialize
					wireUpHoverMenu(m,c); 
				}
				if (!show) {  
					//menuTimeout(m_id,10); // start timeout
					if(c){showHideMenu(c,"hide");}
					showHideMenu(m,"hide");			
				} else {
					// Show Menu
					//menuTimeout(m_id,null); // clear timeout
					if(c){showHideMenu(c,"show");}
					showHideMenu(m,"show");
				}
			}
		}
	});
	
	function wireUpHoverMenu(m,c)
	{
		m.hover(function(e){ e.stopPropagation(); showHideMenu(m,"show"); if(c){showHideMenu(c,"show");} },
				function(e){ e.stopPropagation(); showHideMenu(m,"hide"); if(c){showHideMenu(c,"hide");} });
	    //m.hover(function(e){ showHideMenu(m,"show"); menuTimeout(m_id,null);},function(e){ menuTimeout(m_id,10); })
	}	
})(jQuery);
