(function($){

  var style = { menu: { listStyleType: "none", position: "absolute", margin: 0, padding: 0, zIndex: 2000 } }

  $loadMenu = function(menu, menux, menuy, onShow) {
    currentMenu = menu;
    hideMenu(menu);
    showMenu(menu, style, menux, menuy);
  }

  function showMenu(menu, style, x, y) {
    menu = $(menu);
    if (menu.is(":visible")) return;

    menu.find("ul")
        .prev("li")
        .end()
        .parent("li")

    menu.find("li")
        .bind("mouseenter", style, onItemEnter);

    menu.css(style.menu)
        .css("left", x)
        .css("top", y)
        .show();
  }

  // Hide submenus in reverse order
  function hideMenu(menu) {
    var submenus = $(menu).find("ul")
                          .get()
                          .reverse();
    $(submenus).hide();
    $(menu).hide();
  }

  function getSubmenu(item) {
    item = $(item);
    var submenu = item.next();
    if (!submenu.is("ul")) {
      submenu = item.children();
    }
    if (submenu.is("ul")) {
      return submenu;
    }
  }

  // Return false for items that have submenus so that clicking on such items doesn't close menu
  function onItemClick(e) {
    if (this == e.target) {
      return !getSubmenu(this);
    }
  }

  function onItemEnter(e) {
    var self = this;
    var style = e.data;
    var menu = $(this).parent();
    menu.children("li").each(function() {
      var item = $(this);
      var submenu = getSubmenu(item);
      if (submenu) {
        var x = menu.width() - 2;
        var y = item.position().top;
        self == this ? showMenu(submenu, style, x, y) : hideMenu(submenu);
      }
    });
  }
})(jQuery);
