/***
**  JQUERY EDPMenu PLUGIN
**	WRITTEN BY TOM ROMBAUT
**  Version 0.1
**  04/2010
**  DEPENDENCIES : JQUERY 1.3.1+
***/

var EDPMenu = function(element, options) {
	var conf = $.extend({}, $.fn.edpmenu.defaults, options);
	var menu = $(element);
	var panels = [];	
	var active = "";
	var base = "";
	var status = "NONE"; //OR CRUMB|PANEL
	var enabled = true;
	
	var hovering = false;
	var timer = false;
	var closetimer = false;
	
	var initialize = function() {
		//CLOSE ALL PANELS
		conf.container.css("display","none");
		conf.panels.css("display","none");
		$(".panel",conf.panels).css("display","none");
		
		$(".panel h2",conf.panels).each(function(){
			if($(this).attr("href")){
				$(this).hover(function(){
					$(this).parent(0).addClass("hover");
				},function(){
					$(this).parent(0).removeClass("hover");
				});
				$($(this)).click(function(){
					window.location.href = $(this).attr("href");
				});
			}
		});
		
		$("a",menu).each(function(){
			if($("div[rel='"+$(this).attr("rel")+"']",conf.panels).length > 0){
				$(this).click(function(){
					if(hovering){
						menu.clearShowTimer();
						menu.clearCloseTimer();
						hovering = false;
					}
					menu.open($(this));
					return false;
				});
			}else{
				$(this).click(function(){
					return enabled;
				});
			}
			if($(this).parent(0).hasClass("active")){
				conf.container.css("display","block");
				active = $(this);
				base = $(this);
				if(conf.crumbs.length == 1){
					status = "CRUMB";
				}
			}
		});
		
		if(status == "NONE"){
			if(conf.crumbs.length == 1){
				menu.opencrumbs();
			}
		}
		
		$(".nav-toggle",conf.container).click(function(){
			if($(this).hasClass("nav-toggle-open")){
				hovering = false;
				menu.clearShowTimer();
				menu.open(active);
			}else{
				hovering = false;
				menu.close();
			}
		});
		conf.container.mouseover(function(e){
			if($(e.target).parent(0).is("#crumbs")){
				menu.clearShowTimer();
			}else{
				if(status == "CRUMB"){
					menu.setShowTimer();
				}else if(hovering){
					menu.clearCloseTimer();
				}
			}
		});
		
		conf.container.mouseout(function(){
			if(status == "CRUMB"){
				menu.clearShowTimer();
			}else if(hovering){
				menu.setCloseTimer();
			}
		});
		
		if(!active){
			$(".nav-toggle",conf.container).hide();
		}
		
	};
	menu.closeAll = function(){
		$("a",menu).each(function(){
			$("div[rel='"+$(this).attr("rel")+"']",conf.panels).css("display","none");
			$(this).parent(0).removeClass("active");
		});
		conf.panels.css("display","none");
		conf.crumbs.css("display","none");
		conf.container.css("display","none");
		status = "NONE";
	};
	menu.reset = function(){
		if(base){
			conf.container.css("display","block");
			base.parent(0).addClass("active");
			conf.crumbs.css("display","block");
			active = $(this);
			status = "CRUMB";
		}
	};
	menu.enable = function(){
		enabled = true;
	};
	menu.disable = function(){
		enabled = false;
	};
	menu.opencrumbs = function(){
		conf.container.css("display","block");
	};
	menu.open = function(item){
		if(enabled == true){
			if(active && active.attr("rel") == item.attr("rel") && status == "PANEL"){
				//already open;
			}else{
				conf.container.css("display","block");
				conf.panels.css("display","block");
				if(conf.crumbs.length == 1){
					conf.crumbs.css("display","none");
				}
				menu.hidebanners();
				if(active){
					$("li.active",menu).removeClass("active");
					$("div[rel='"+active.attr("rel")+"']",conf.panels).slideUp(conf.slideuptime);
				}
				$(".nav-toggle",conf.container).show();
				$("div[rel='"+item.attr("rel")+"']",conf.panels).slideDown(conf.slidedowntime,function(){
					menu.showbanners();
				});
				item.parent(0).addClass("active");
				status = "PANEL";
				active = item;
				
				$(".nav-toggle",conf.container).removeClass("nav-toggle-open");
				$(".nav-toggle",conf.container).addClass("nav-toggle-close");
			}
			timer = false;
		}
		return false;
	};
	menu.close = function(){
		if(active && enabled){
			menu.hidebanners();
			$("div[rel='"+active.attr("rel")+"']",conf.panels).slideUp(conf.slideuptime,function(){
				if(conf.crumbs.length == 1){
					active.parent(0).removeClass("active");
					if(base){
						base.parent(0).addClass("active");
					}
					conf.panels.css("display","none");
					conf.crumbs.css("display","block");
					status = "CRUMB";
				}else{
					conf.panels.css("display","none");
					active.parent(0).removeClass("active");
					conf.container.css("display","none");
					status = "NONE";
				}
				//if(base){
				active = base;
				//}
				$(".nav-toggle",conf.container).removeClass("nav-toggle-close");
				$(".nav-toggle",conf.container).addClass("nav-toggle-open");
				if(!active){
					$(".nav-toggle",conf.container).hide();
				}
				menu.showbanners();
				
			});
		}
		closetimer = false; 
	};
	menu.showbanners = function(){
		if($.browser.msie && $.browser.version < 8){
			$(".hidewhenslide").css("visibility","visible");
		}
	};
	menu.hidebanners = function(){
		if($.browser.msie && $.browser.version < 8){
			$(".hidewhenslide").css("visibility","hidden");
		}
	};
	menu.setShowTimer = function(){
		if(!timer){
			timer = setTimeout(function(){hovering=true;menu.open(active);},conf.hovertime);
		}
	};
	menu.clearShowTimer = function(){
		if(timer){
			clearTimeout(timer);
			timer = false;
		}
	};
	menu.setCloseTimer = function(){
		if(!closetimer){
			closetimer = setTimeout(function(){menu.close();},conf.hoverclosetime);
		}
	};
	menu.clearCloseTimer = function(){
		if(closetimer){
			clearTimeout(closetimer);
			closetimer = false;
		}
	};
	
	initialize();
	
	return menu;
};

(function($) {	
	$.fn.edpmenu = function(options) {
		return this.each(function() {
			var element = $(this);
			// Return early if this element already has a plugin instance
			if (element.data('edpmenu')) return;
			// pass options to plugin constructor
			var w = new EDPMenu(this, options);
			// Store plugin object in this element's data
			element.data('edpmenu', w);
		});
	};
	
})(jQuery);

$.fn.edpmenu.defaults = {
		hovertime	   	: 	500,
		hoverclosetime 	: 	500,
		slideuptime		: 	500,
		slidedowntime	:	500,
		container	: "",
		panels 		: "",
		crumbs 		: ""
};
