(function($){
	$.fn.navbardrop = function(options, func_param){
		var defaults = {
			timeBeforeDisplay: 1000, //time mouse over before dropdown shows (in milliseconds).
			startup_button: null //sets the startup button to be its colour from its class name.
		};
		
		$(this).data("_navbardrop_param_options", options);
		
		return this.each(function() {
			var objUL = $(this); //first and main UL element
			var options = objUL.data("_navbardrop_param_options"); objUL.data("_navbardrop_param_options", null);
			
			if (objUL.data("_navbardrop_loaded")){ //If navbardrop has already loaded on this element then call the function instead. (Use func_param for any parameters required in the function).
				/*
				var tabElm = objUL.data("_navbardrop_tab_elm");
				var options = objUL.data("_navbardrop_options");
				*/
				var settings = objUL.data("_navbardrop_settings");
				
				switch(options){
					case "select":
						var showDrop = false;
						if (!func_param) func_param = "default_button";
						
						objUL.children("li").removeClass("selected");
						objUL.parent().find(".navbardrop_sub").hide();
						objUL.parent().children(".navbardrop_shadow").hide()[0].className = "navbardrop_shadow";
						
						var sectionName = objUL.children("li." + func_param).addClass("selected").data("section_name");
						if (settings.isOverlay){
							if (!objUL.parent().find(".navbardrop_sub." + sectionName).data("isOverlay")){
								showDrop = true;
							};
						}else{
							showDrop = true;
						};
						
						if (showDrop){
							objUL.parent().find(".navbardrop_sub." + sectionName).show();
							objUL.parent().children(".navbardrop_shadow").addClass(sectionName).show();
						};
						
						break;
					case "_settings":
						if (!func_param) return objUL.data("_navbardrop_settings");
						objUL.data("_navbardrop_settings", func_param);
						
						break;
					default:
						//do nothing.
						break;
				};
			}else{
				options = $.extend(defaults, options);
				var settings = {isOverlay: false, select_timeout: null, unselect_timeout: null, instantSelect: false};
				var tabElm = $("<div></div>").addClass("navbardrop_tab");
				var elmShadow = $("<div></div>").addClass("navbardrop_shadow");
				var elmExtras = [];
				var default_found = false;
				
				elmExtras.push(  elmShadow  );
				
				if (!objUL.hasClass("navbardrop")) objUL.addClass("navbardrop");
				
				//objUL.parent().css("height", "55px");
				
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/////////////												CREATING DEFAULT EVENTS																//////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				var funcDefaultMouseEnterEvent = function(e){
					var settings = objUL.data("_navbardrop_settings");
					if (settings.unselect_timeout) clearTimeout(settings.unselect_timeout);
					if (settings.select_timeout) clearTimeout(settings.select_timeout);
					settings.unselect_timeout = null;
					settings.select_timeout = null;
					
					objUL.data("_navbardrop_settings", settings);
				};
				var funcDefaultMouseLeaveEvent = function(e){
					var settings = objUL.data("_navbardrop_settings");
					if (settings.select_timeout) clearTimeout(settings.select_timeout);
					if (settings.unselect_timeout) clearTimeout(settings.unselect_timeout);
					
					settings.unselect_timeout = setTimeout(function(e){
						var settings = objUL.data("_navbardrop_settings");
						settings.instantSelect = false;
						objUL.navbardrop("select").data("_navbardrop_settings", settings); //Select default button and set settings.
					}, 500);
					
					objUL.data("_navbardrop_settings", settings);
				};
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//FOR EACH LI ELEMENT
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				objUL.children("li").each(function(){
					var objLI = $(this);
					var objLIClass = objLI[0].className;
					var objChildUL = objLI.children("ul");
					var newSubUL, newIL;
					
					objLI.data("section_name", objLIClass);
					if (objLI.hasClass(options.startup_button)){ //if this LI element is the same as the startup button then...
						settings.isOverlay = (objChildUL.length == 0);
						objLI.addClass("selected").addClass("default_button");
						default_found = true;
					};
					
					newSubUL = $("<ul></ul>").addClass("navbardrop_sub").addClass(objLIClass);
					
					if (objChildUL.length > 0){
						objChildUL.slice(1).remove();
						
						objChildUL.children("li").each(function(){
							newIL = $(this).clone().addClass(objLIClass);
							
							newIL.children("a").addClass(objLIClass);
							
							newSubUL.append(newIL);
						});
						
						objChildUL.remove();
						newSubUL.data("isOverlay", false);
						
						objUL.parent().removeClass("overlay");
					}else{
						newSubUL.data("isOverlay", true);
					};
					elmExtras.push(newSubUL);
					
					objLI.mouseenter(function(e){
						var objLI = $(this), settings = objUL.data("_navbardrop_settings");
						if (settings.select_timeout) clearTimeout(settings.select_timeout);
						if (settings.unselect_timeout) clearTimeout(settings.unselect_timeout);
						settings.unselect_timeout = null;
						
						if (settings.instantSelect){
							objUL.navbardrop("select", objLI.data("section_name"));
						}else{
							settings.select_timeout = setTimeout(function(e){
								settings.instantSelect = true;
								objUL.navbardrop("select", objLI.data("section_name")).data("_navbardrop_settings", settings);
							}, 500);
						};
						
						objUL.data("_navbardrop_settings", settings);
					});
					objLI.mouseleave(funcDefaultMouseLeaveEvent);
					
					
				});
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				if (!default_found){
					objUL.children("li").first().addClass("selected").addClass("default_button");
				};
				
				elmShadow.mouseenter(funcDefaultMouseEnterEvent);
				elmShadow.mouseleave(funcDefaultMouseLeaveEvent);
				
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				
				for(var x=0;x<elmExtras.length;x++){
					objUL.parent().append(elmExtras[x]);
				};
				
				objUL.removeClass("overlay");
				if (settings.isOverlay){
					objUL.parent().addClass("overlay");
					objUL.parent().find(".navbardrop_shadow").hide();
				}else{
					//SHOW THE STARTUP OR FIRST BUTTON SUB NAV MENU.
				};
				
				elmShadow.append(tabElm);
				
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				/////////////												SETTING GENERIC EVENTS																//////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				objUL.parent().children(".navbardrop_sub").mouseenter(funcDefaultMouseEnterEvent);
				objUL.parent().children(".navbardrop_sub").mouseleave(funcDefaultMouseLeaveEvent);
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
				//alert(settings.isOverlay);
				
				objUL.data("_navbardrop_tab_elm", tabElm);
				objUL.data("_navbardrop_shadow", elmShadow)
				objUL.data("_navbardrop_options", options);
				objUL.data("_navbardrop_settings", settings);
				
				objUL.data("_navbardrop_loaded", true);
				
				objUL.navbardrop("select"); //Select default button.
			};
		});
	};
})(jQuery);

/*
$(document).ready(function(e){
	$("#navbardrop_main").navbardrop({startup_button: "<%=navbar_Section%>"});
});
*/
