﻿jQuery.fn.menu = function(parameters){
	var $self = $(this);
	var defaults = {
		opener : $self.parent(),
		speed : null,
		position : "bottom",
		callbackShow : function(){},
		callbackHide : function(){}
	};
	jQuery.extend(defaults, parameters);
	
	var priv = {
	    top : null,
        left : null,
        opener : null,
        padlock    : false,
        
        show    : function(){
            if(priv.padlock){
                //if we are locked do not start another run
                return;
            }
            //set the padlock to prevent a loop were the menu opens and closes contstantly
            if(defaults.speed){
                priv.padlock = true;
            }
            
            //append to the $opener if not done already
            if(defaults.opener.get(0) !== $self.parent().get(0)){
                defaults.opener.append($self);
            }
            //make sure the $opener has a position:relative or absolute style
            if(defaults.opener.css("position") != "absolute"){
                defaults.opener.css({"position" : "relative", "display" : "block"});
            }
            
            //determine position
            if(priv.top == null || priv.left == null){
                if(defaults.position == "bottom"){
                    priv.top = defaults.opener.height() + parseInt(defaults.opener.css("padding-top")) + parseInt(defaults.opener.css("padding-bottom"));
                    priv.left = 0;
                }
                else if(defaults.position == "right"){
                    priv.top = 0;
                    priv.left = defaults.opener.width() + parseInt(defaults.opener.css("padding-left")) + parseInt(defaults.opener.css("padding-right"));
                }
                else if(defaults.position == "top" || defaults.position == "left") {
                    //alert with "not implemented"
                    alert("postition '" + defaults.position + "' not yet implemented");
                }
            }
            
            $self.css({"position" : "absolute", "z-index" : "100", "top" : priv.top + "px", "left" : priv.left + "px"})
            
            
            //now show the menu
            $self.show(defaults.speed, 
                function(){
                    //we are done so unlock
                    priv.padlock = false;
                    priv.callbackShow();
                }
            );
            /*
            //height correction (weird bug with UL)
            if($self.height() == 0){
                var height = 0;
                for(i=0; i<$self.children().length; i++){
                    height += $self.children(i).height();// + parseInt($self.children(i).css("padding-top")) + parseInt($self.children(i).css("padding-bottom"));
                }
                $self.height(height);
            }
            */
                       
        },
        
        hide    : function(){
            //hide the menu
			
            $self.hide(defaults.speed,
                function(){
                    priv.callbackHide();
                }
            );
        },
        
        callbackShow : function(){
            
            defaults.callbackShow();
        },
        
        callbackHide : function(){
            defaults.callbackHide();
        },
        
        lastitem : null
	};
	
	return defaults.opener.hover(
        function(evt){
            priv.show();
        },
        function(evt){
            priv.hide();
        }
    );
};