(function ($) 
{
    // STANDARD SETTINGS
	var dd_element = null;
    var settings = {
        'animation': 'slideDown',
		'easing': null,
        'time': 200,
		'fillout': false,
		'css_level': 'dd_level_',
		'leave_timeout': 600,
		'sub_width': 150,
		'margin_left': 0,
		'margin_top': 0
    };

    $.Dropdown = function (element, options) {

        element.data("Dropdown", this);

        // PUBLIC FUNCTIONS
        this.init = function (elm, params) {
            $.extend(settings, params);
			dd_element = elm;
			
			initialize();
        };
				
        // INIT ELEMENT
        this.init(element, options);
    };

    // PRIVATE VARIABLES
    var dd_leave_timer = null;
	var dd_over_timer = null;
	var dd_subs_current = null;
	var dd_subs = null;
	var dd_over_last = false;
	
    // PRIVATE FUNCTIONS
	function initialize() 
	{	
		dd_element.find("li").each(function() 
		{
			$(this)
			.hover(
			function() { 
				
				var dd_obj = $(this);
				var dd_level = dd_obj.parent().attr("class").replace(settings.css_level, "");
				var dd_link = dd_obj.find("a");
				dd_subs = dd_obj.find("ul:first");
				
				hide_menuitems(dd_level);
				show_menuitems(dd_link, dd_subs, dd_level);
			},
			function() 
			{
				var dd_obj = $(this);
				var dd_level = dd_obj.parent().attr("class").replace(settings.css_level, "");
				
				window.clearTimeout(dd_leave_timer);
				dd_leave_timer = window.setTimeout(function() { hide_menuitems(dd_level); }, settings.leave_timeout);
			});
		});
	
		if(settings.fillout) {
			calculate_fillout();
		}
	}
	function show_menuitems(obj, subs, lvl) 
	{	
		subs.css({
			'position': 'absolute',
			'left': (lvl == 1 ? (settings.margin_left + obj.position().left) : (obj.position().left + obj.outerWidth(true))),
			'top': (lvl == 1 ? (settings.margin_top + obj.position().top + obj.outerHeight()) : obj.position().top),
			'width': settings.sub_width
		});
		
		custom_animation(subs, false);
	}
	function hide_menuitems(lvl) 
	{
		window.clearTimeout(dd_leave_timer);
		
		if (dd_over_last == false)
		{
			dd_over_last = true;
			
			dd_element.find("ul").each(function() 
			{
				var dd_level = Number($(this).attr("class").replace(settings.css_level, ""));
				if (dd_level > Number(lvl))
					custom_animation($(this), true);
			});
			
			dd_over_timer = window.setTimeout(function() { clear_mouseout(); }, 10);
		}
	}
	function custom_animation(obj, out)
	{
		var dd_out_effect = "";
		switch(settings.animation)
		{	
			case "easing":
			
				dd_out_effect = "height";
				break;
				
			case "fade":
			
				dd_out_effect = "opacity";
				break;
				
			case "none":
			
				dd_out_effect = "";
				break;
		
		}
		
		if (out) {
			
			if (dd_out_effect == "opacity")
				obj.css(dd_out_effect, 0).hide();
			else if (dd_out_effect == "height")
				obj.slideUp(settings.time);
			else	
				obj.hide();
			
		} else {
			
			if (dd_out_effect == "height")
			{
				obj.stop(false, true).slideDown({
					duration: settings.time,
					easing: settings.easing
				});
			}
			else if (obj.css(dd_out_effect) == 0 && dd_out_effect == "opacity")
			{
				obj.css('display','block').stop().animate({opacity:1}, settings.time);
			}
			else if (dd_out_effect == "")
			{
				obj.stop().show();
			}
		}
	}
	function clear_mouseout() 
	{
		window.clearTimeout(dd_over_timer);
		dd_over_last = false;
	}
	function calculate_fillout() 
	{	
		var dd_width = dd_element.outerWidth(true);
		var dd_items = dd_element.find("ul." + settings.css_level + "1 > li").length;
		var dd_division = (dd_width/dd_items);
		
		dd_element.find("ul." + settings.css_level + "1 > li > a").each(function() {
		
			var this_padding = Number($(this).css("padding-left").replace("px", "")) + Number($(this).css("padding-right").replace("px", ""));
			var this_margin = Number($(this).css("margin-left").replace("px", "")) + Number($(this).css("margin-right").replace("px", ""));
			var this_border = Number($(this).css("border-left").replace("px", "")) + Number($(this).css("border-right").replace("px", ""));
			var this_total_width = dd_division - (this_padding + this_margin + this_border);
			
			$(this).css({
				'width': this_total_width
			});		
		});
	}
	
	function log(txt) {
		
		$('#console').html($('#console').html() + txt + "<br>");
		
	}
	
    // JQUERY PLUGIN
    $.fn.Dropdown = function (options) {
        return this.each(function () {
            (new $.Dropdown($(this), options));
        });
    };

})(jQuery);
