/**
 * Simple to use drop down mennu using
 * ol elements styled using css.
 *
 * @author Oliver Green <green2go@gmail.com>
 * @copyright Copyright (c) 2009-2011 CodeBlog.co.uk. (http://www.codeblog.co.uk)
 * @version $Revision: XXX $ $Date: XXX $
 * 
 * @todo Add data file locking procedure.
 */

(function( $ ){
  $.fn.oMenu = function() {
      
    /* Global vars */
    var baseDepth;
    var topMenu = $(this);
    var openMenus = new Array();
    var c = 0;
    
    //var ddWidth = 52;
    var zIndex = 4;
    /* Margin between menus */
    var ddVMargin = 20;
    /* A selector that will be shown on hover */
    var showSelectorOnHover = ".drop-down-arrow";
    
    function closeMenusToDepth(depth,excID)
    {
	if(depth==undefined) {
	    depth = 0;
	}
	
	/* Loop through registered menus and close open ones */
	for(var i = 0; i < openMenus.length; i ++) {
	    if(openMenus[i]['depth'] >= depth && excID == undefined 
		|| openMenus[i]['depth'] >= depth && excID !== openMenus[i]['id']){
		closeMenu(openMenus[i]['id']);
	    }
	}
    }
    
    function closeMenu(id) {
	var subMenuLink = $("#" + id + "-link");
	var subMenu = $("#" + id);
	
	subMenu.fadeOut(150,function(){
	     $("#" + openMenus[id]['id']).css('display','none');
	     //subMenuLink.css("background-image","");
	     //subMenuLink.css("background-color","");
	     //subMenuLink.css("color","");
	     $(subMenuLink).removeClass('hover');
	     subMenuLink.find(showSelectorOnHover).css("display","none");
	     openMenus[id]['state'] = "closed";
	});
	
    }
    
    init();
    
    function init() {
	
	/* Find & loop all child li */
	topMenu.find(" > li").each(function(){
	
	    var tabID = 0;
	    
	    /* Set our base depth */
	    baseDepth = $(this).parents().length + 1;

	    /* Loop through each li with an ol  */
	    $(this).has("ol").each(function(){

	        /* Find all decendant ols */
		$(this).find("ol").each(function(){

		    bindList($(this),tabID,$(this).parents().length);

		});

		tabID++;
	    });
	});
	
	return $(topMenu);
    }
    
    function bindList(ele,tab,depth){
	
	/* Setup some local references */
	var subMenu = ele;
	var subMenuLink = subMenu.parent().find("a:first");
	var subMenuDepth = depth;	
	var closeTimer;
	
	/* Set our menus ID */
	var subMenuID =  c;
	subMenu.attr("id",subMenuID);
	subMenuLink.attr("id",subMenuID + "-link");
	
	/* Register */
	tOpenMenu = [];
	tOpenMenu["id"] = subMenuID;
	tOpenMenu["tab"] = tab;
	tOpenMenu["depth"] = subMenuDepth;
	tOpenMenu["state"] = "closed";
	openMenus[subMenuID] = tOpenMenu;
	
	/* Get the CSS states */
	var subMenuLinkCSS = [];
	subMenuLinkCSS['normal'] = [];
	subMenuLinkCSS['normal']['background-image'] = subMenuLink.css("background-image");
	subMenuLinkCSS['normal']['background-color'] = subMenuLink.css("background-color");
	subMenuLinkCSS['normal']['color'] = subMenuLink.css("color");
	
	subMenuLinkCSS['hover'] = [];
	subMenuLinkCSS['hover']['background-image'] = subMenuLink.css("background-image");
	subMenuLinkCSS['hover']['background-color'] = subMenuLink.css("background-color");
	subMenuLinkCSS['hover']['color'] = subMenuLink.css("color");
	
	
	/* Triggers */
	$(subMenuLink).parent().mouseover(function(){
	/* Set the CSS values for hover */
	
	    //subMenuLinkCSS['hover']['background-image'] = subMenuLink.css("background-image");
	    //subMenuLinkCSS['hover']['background-color'] = subMenuLink.css("background-color");
	    //subMenuLinkCSS['hover']['color'] = subMenuLink.css("color");
	    $(subMenuLink).addClass('hover');
	    //alert($(subMenuLink).html())
	    //console.log(subMenuLink.html());
	    //subMenuLink.find(showSelectorOnHover).css("display","");
	    clearTimeout(closeTimer);closeTimer = null;
	    closeTimer = setTimeout(function(){ showMenu(); },50);
	});
	
	$(subMenuLink).parent().mouseout(function(){ 
	    closeTimer = setTimeout(function(){ closeMenu(subMenuID);clearTimeout(closeTimer); }, 400); 
	});
	
	$(subMenu).mouseover(function(){ clearTimeout(closeTimer); closeTimer = null;  });
	

	
	function showMenu(){
	    
	    if(openMenus[subMenuID]['state']=="open") {
		return;
	    }
	    
	    closeMenusToDepth(subMenuDepth,subMenuID);
	    
	    /* Position the drop downs */
	    subMenu.css("position","absolute");
	    subMenu.css("zIndex",zIndex);

	    var parentPos = subMenu.parent().position();
	    //console.debug(parentPos);
	    //console.debug(subMenu.parent());
	    if(typeof parentPos.left == "undefined") parentPos.left = 0;
	    
	    

	    if(subMenuDepth > baseDepth) { 
		parentPos.left += subMenu.parent().width(); 
		//parentPos.top += (subMenu.parent().height() / 4); 
	    } else {
		parentPos = subMenu.parent().offsetParent();
		
		
		if(typeof parentPos.left == "undefined") parentPos.left = subMenu.parent().width() - 20;
		/* Adjusts the first menus position */
		//parentPos.left -= 1;
		parentPos.top = subMenu.parent().height();
		//alert(subMenu.parent().width())
		//alert(parentPos.left);
		//console.log(parentPos);
	    }
	    
	    
	    if(typeof ddVMargin !== "undefined") {
		parentPos.left += ddVMargin;
	    } 
	    
	    if(navigator.appVersion.indexOf("MSIE 7.0") > -1)  {
	      subMenu.css("left", subMenu.parent().position().left + "px");
	    }
	    subMenu.css("top", parentPos.top + "px");
	    
	    /* Set the drop dow heights and width */
	    if(typeof ddWidth == "undefined" || ddWidth == "auto") {
		subMenu.width(subMenu.parent().width());
	    } else {
		subMenu.width(ddWidth + "px");
	    }
	    
	    
		var mState = subMenu.css('display');

		if(mState=="none") {		    
		    //subMenuLink.css("background-image",subMenuLinkCSS['hover']['background-image']);
		    //subMenuLink.css("background-color",subMenuLinkCSS['hover']['background-color']);
		    //subMenuLink.css("color",subMenuLinkCSS['hover']['color']);
		    subMenuLink.addClass('hover');
		    //console.log(subMenuLink.html());
		    subMenuLink.find(showSelectorOnHover).css("display","");
		    openMenus[subMenuID]['state'] = "open";
		}
	    
	    subMenu.slideDown(300);
	    
	}
	
	c++;
	
    }
    

  };
  
  
})( jQuery );


