$.fn.popupMenu = function(options) {
  var options = $.extend({callback: function() {}}, options);
  var remove_now = function() { var tmp = $(this); if(tmp.data('is_now') != true) tmp.removeClass('now'); };
  var showhide = function(b)
  {
      return function() {
          var that = $(this);
          var els = that.filter('li').children('ul').add(that.parents('ul'));

          if(b) { els.clearQueue().show(); els.closest('li').addClass('now').siblings('li').each(remove_now).find('ul').clearQueue().hide(); }
          else { els.clearQueue().delay(250).hide(1).queue(function() { that.parents('li').andSelf().each(remove_now); }); }
          
          options.callback.call(this, els);
      }
  }
  return this
      .delegate('li', 'mouseenter', showhide(true))
      .delegate('li', 'mouseleave', showhide(false));
};

$(function() {
    $('menu.popup-menu').popupMenu({callback: function(els) {
        if(els.size() < 2 || $(this).children('ul').size() == 0 || els.eq(1).data('css_top_set')) return;
        els.eq(1)
            .css('top', $(this).offset().top - $(this).parent().children('li:first').offset().top)
            .data('css_top_set', true);
    }}).find('.now').data('is_now', true);
});

