
(function($) {
$.fn.dropmenu = function(user_options) {

    var timer_id = null;
    var opened = null;

    var options = {
        column_height: 150,
        v_offset : 0,
        h_offset : 0,
        timeout : 2000,
        fade_speed : 300
    };


    function build_dropmenu(container) {

        var list = $(container).children('ul.dropmenu');
        if (list.length == 0) return null;

        var is_multicolumn = false;

        var items = $('<div />').css({
            position: 'absolute',
            top: 0,
            left: 0,
            zIndex: 9999,
            width: '100%'
        }).addClass('dropmenu');

        var current_column = $('<div />').addClass('column').addClass('first').css('overflow', 'hidden');
        items.append(current_column);
        $('body').append(items);

        var max_item_width = 0;
        var column_count = 1;
        $(list).children('li').each(function(){
            var link = $(this).find('a');
            link.css({
                display: 'block',
                float: 'left',
                clear: 'both'
            });
            current_column.append(link);

            if( $(current_column).outerHeight() > options.column_height) {
                is_multicolumn = true;
                link.remove();
                current_column = $('<div />').addClass('column').css('overflow', 'hidden');
                items.append(current_column);
                current_column.append(link);
                column_count = column_count+1;
            }

            var link_width = link.outerWidth();
            if (link_width>max_item_width) max_item_width = link_width;
        });

        var total_height = items.children('.column.first').outerHeight(true);

        var column_css = {
            width: max_item_width,
            float: 'left',
            zIndex: 8000
        };

        if (is_multicolumn) column_css.height = items.children('.column.first').innerHeight();

        var total_width = 0;
        items.children('.column').css(column_css).each(function(){
            total_width = total_width+$(this).outerWidth(true);
        }).children('a').css({float: 'none'});

        items.children('.column:last').addClass('last');

        items.css({width: total_width, height: total_height});

        var background = $('<div />').addClass('background').css({
            position: 'absolute',
            width: total_width,
            height: total_height,
            zIndex: 0
        });

        items.removeClass('dropmenu');//.remove();

        var dropmenu = $('<div />').addClass('dropmenu').css({
            position: 'absolute',
            height: total_height,
            width: total_width
        }).append(background).append(items);

        list.replaceWith(dropmenu);

        //bind_popup_maps();

        return dropmenu;
    }

    function show_dropmenu(container) {
        cancel_timer();

        var dropmenu = $(container).children('div.dropmenu');
        if (dropmenu.length == 0) dropmenu = build_dropmenu(container);

        if (!dropmenu) {
            if (opened) hide_dropmenu(opened.parent('li'));
            return;
        }

        if (dropmenu.css('display') == 'block') return;

        if (opened) hide_dropmenu(opened.parent('li'));


        var c_height = $(container).outerHeight();
        var c_position = $(container).position();

        dropmenu.css({
            left: c_position.left + options.h_offset,
            top: c_position.top + c_height + options.v_offset
        });

        dropmenu.fadeIn(options.fade_speed);
        opened = dropmenu;
        $(container).addClass('highlighted');
    }

    function hide_dropmenu(container) {
        $(container).children('div.dropmenu').fadeOut(options.fade_speed);
        opened = null;
        $(container).removeClass('highlighted');
    }

    function cancel_timer() {
        if (timer_id != null) clearTimeout(timer_id);
        timer_id=null;
    }

    function shedule_hide(container) {
        cancel_timer();
        timer_id = setTimeout(function(){hide_dropmenu(container)}, options.timeout);
    }


    function init_li(li) {
        $(li).mouseover(function(){
            show_dropmenu(this);
        }).mouseout(function(){
            shedule_hide(this);
        });
    }


    return this.each(function() {
        if (options) $.extend(options, user_options);

        $(this).children('li').each(function(){
            init_li(this);
        });
    });

}

})(jQuery);


