(function($){
  $.fn.extend({
    tree: function(options) {
      var defaults = {
        animateTime: 250,
        openSubmenuClass: 'open',
        subMenuSelector: '.contents',
        branchSelector: '.branch',
        leafSelector: '.leaf'
      };
        
      var o = $.extend(defaults, options);
      
      var recursiveCollapse = function() {
        $('ul.tree > li', this).each(recursiveCollapse);
        $(o.subMenuSelector, this).hide();
      }; // recursiveCollapse()
    
      var ret_val = this.each(function() {
        var context = this;
        
        $(context).children('li').each(recursiveCollapse);
      
        $(o.branchSelector + ' > a', context).click(function() {
          var sub = $(this).siblings(o.subMenuSelector);
          if (sub.is(':visible')) {
            sub.hide(o.animateTime).removeClass(o.openSubmenuClass);
          } else {
            sub.show(o.animateTime).addClass(o.openSubmenuClass);
          }
          
          return false;
        });
      });
      
      return ret_val;
    }
  });
})(jQuery);
