var allUIMenus = [];

$.fn.menu = function(options){
	var caller = this;
	var options = options;
	var m = new Menu(caller, options);	
	allUIMenus.push(m);

	$(this)
	.click(function(){
		if (m.menuOpen == false) {
            m.showMenu();
        } else {
            m.kill();
        };
		return false;
	});	
};

function Menu(caller, options){
	var menu = this;
	var caller = $(caller);
    
	var container = $(options.content);
    var xy = caller.offset();
    
    var as = container.find('.menu a');
    var len = container.find(".menu li:not('.hidden')").length;

    container.css({
        backgroundColor: 'white',
        border: '1px solid #DAE0E9',
        position: 'absolute',
        zIndex: '9999',
        top: (xy.top+caller.outerHeight()+5)+'px',
        left: xy.left+'px',
        display:'none'
    });    
    
    if (len) {
        if (len < 10) {
            container.height(len*24);
            as.width(container.width()-13);
        } else {
            container.height(240);
            as.width(container.width()-31);
        }
    }


    
    var options = jQuery.extend({
        content: null,
        menuSelection: null,
        menuSelectionVal: null,
        showSpeed: 200
    }, options);
    
	this.menuOpen = false;
	this.menuExists = false;
	
	var killAllMenus = function(){
		$.each(allUIMenus, function(i){
			if (allUIMenus[i].menuOpen) { allUIMenus[i].kill(); };	
		});
	};
	
	this.kill = function(){
		container.hide();	
		menu.menuOpen = false;
		$(document).unbind('click', killAllMenus);
	};

	this.showMenu = function(){
		killAllMenus();
		if (!menu.menuExists) { menu.create() };
        xy = caller.offset();
        container.css({
            top: (xy.top+caller.outerHeight()+5)+'px',
            left: xy.left+'px'
        });

		container.hide().slideDown(options.showSpeed, function() {
            if (len >= 10)
                container.css({overflowX: 'auto'});
        });
		menu.menuOpen = true;

		$(document).click(function(e){
            if ($(e.target).parents().filter(container).length != 1) {
                killAllMenus();
            }
        });
        
	};
	
	this.create = function(){	
			container.find('a[class!="noclick"]').click(function(){
                if (menu.menuOpen)
				    menu.chooseItem(this);
				return false;
			});

		menu.menuExists = true;
	};
	
	this.chooseItem = function(item){
        item = $(item);
        if (!item.hasClass('noclick')) {
            if (options.fromHref) {
                options.menuSelection.text(item.attr('href').substr(1));
            } else {
                options.menuSelection.text(item.text());
            }
            
            if (options.menuSelectionVal) {
                options.menuSelectionVal.val(item.attr('href').substr(1));
                //options.menuSelectionVal.trigger('focus');
                //options.menuSelectionVal.trigger('blur');
                options.menuSelectionVal.trigger('keyup');
            }
            menu.kill();
        }
	};
};


