﻿var allUIMenus = [];
var fixedheight = false;
$.fn.menu = function(options) {
    var caller = this;
    if ($(caller).val() == "") {
        $(caller).val(desText);
    }
    var options = options;
    var m = new Menu(caller, options);
    allUIMenus.push(m);
    //Phong added: unbind click event, then bind again, quick fix for double menu issues   
    
    
    $(this).unbind('click').click(function() {
        if (m.open == false) {
            m.showMenu();
        }
        else {
            m.kill();
        }
        return false;
    });
}

function Menu(caller, options){
    var menu = this;
    var caller = $(caller);
    var container = $("<div class='menu-container' style='position: absolute;'><div style='position: relative;'></div></div>");
    
    this.open = false;
    this.exists = false;
    
    var options = jQuery.extend({
        data: null,
        onselect: null,
        converter: null,
        width: 94
    }, options);
    
    var killAllMenus = function(){
        $.each(allUIMenus, function(i){
            if (allUIMenus[i].open) {
                allUIMenus[i].kill();
            }
        });
    };
    
    this.kill = function(){
        if ($(caller).val() == "") {
            $(caller).val(desText);
        }
        container.hide();
        menu.open = false;
        $(document).unbind("click", killAllMenus);
        //$(document).unbind("keydown");
    }
    
    this.showMenu = function(){
        killAllMenus();
        if (!menu.exists) {
            menu.create();
            menu.exists = true;
            return false;
        }
        if ($(caller).val() == desText) {
            $(caller).val("");
        }
        container.find("ul ul").hide();
        //container.parent().show().click(function() { menu.kill(); return false; });
        /*var offset = $(caller).offset();
         container.css({
         top: offset.top + 20,
         left: offset.left
         }).hide().slideDown("medium");*/
        container.bgiframe();
		if(!fixedheight){
			var maxheight = 0;
			container.find('ul').each(function(){
				if(maxheight < $(this).height()){
					maxheight = $(this).height();
				}
			});
			container.find('ul').height(maxheight);
			fixedheight= true;
		}
        container.hide().show();
        menu.open = true;
        $(document).click(killAllMenus);
    }
    
    this.creating = false;
    this.create = function(){
        if (menu.creating) 
            return;
        menu.creating = true;
        $.ajax({
            url: options.data,
            success: function(data){
                var offset = $(caller).offset();
                container.css({
                    top: offset.top + 24,
                    left: offset.left
                })
                var ul = options.converter(data);
                // append title
                $.each(ul.add(ul.find("ul[text]")), function(){
                    var title = $(this).attr("text");
                    $("<li class=\"title\">" + title + "</li>").prependTo(this);
                });
                container.appendTo("body").find("div").append(ul).find("ul:first").addClass("top");
                menu.flyOut(container, options);
                menu.exists = true;
                menu.showMenu();
            }
        });
    };
    
    this.chooseItem = function(item){
        menu.kill();
        options.onselect(item);
    };
}

Menu.prototype.flyOut = function(container, options){
    var menu = this;
    
    container.find("a:not(.leaf)").append("<span class='arrow'>&gt;</span>");
    container.find("li").each(function(){
        $(this).find("a:first").hover(function(){
            $(this).parent().parent().find("> li > a").removeClass("hover");
            var a = $(this).addClass("hover");
            menu.flyOutItem(container, a);
            if (!$(a).hasClass("leaf")) {
                a.next("ul").show();
            }
            var list3nd = false;
            $('ul[text="Provincie"]').each(function(){
                if ($(this).css('display') == "block") {
                    list3nd == true;
                };
            });
            if (list3nd) {
                container.width(297);
            }
            else {
                container.width(198);
            }
        }, function(){
            container.find("a.hover").removeClass("hover");
        });
    });
    
    container.find("a").click(function(){
        menu.chooseItem(this);
        return false;
    });
}

Menu.prototype.flyOutItem = function(container, a){
    var tree = container.find("ul ul");
    
    var ul = $(a).parent().parent();
    while (!ul.hasClass("top")) {
        ul.prev().addClass("hover");
        tree = tree.not(ul);
        ul = ul.parent().parent();
    }
    tree.hide();
}

