jQuery.fn.collapsible = function(options) {
  options = options || {};

  this.setupPlugin(options.setup || jQuery.fn.collapsible.defaultSetup);
  // Initialize
  this.each(function() {
    var handle = jQuery(this); 
    var target = handle.getTarget(options);
    $d(handle).target  = target;
    $d(handle).options = options;
    $d(handle).defaultOptions = {
      speed: "slow"
    };

    handle.bind("click", function() {
      if (handle.is(".collapsed")) {
        handle.trigger("expanded", handle);
      } else {
        handle.trigger("collapsed", handle);
      }
    });

    handle.trigger("initialize");
  });

  return this;
};

jQuery.fn.collapsible.defaultSetup = {
  initialization: [function(options) {
    this.bind("initialize", function(elem) {
      var handle = jQuery(this);
      var target = $d(handle).target;

      handle.addClass("collapsible-handle");
      target.addClass("collapsible-target");

      if (handle.is(".start-collapsed")) {
        // DRYME 2 trigger collapsed(handle, { immediate: true})
        handle.addClass("collapsed");
        target.addClass("collapsed");
        target.hide(); // no options
      } else {
        handle.addClass("expanded");
        target.addClass("expanded");
      }
    });
  }],

  expand: [function(options) {
    this.bind("expanded", function(elem, handle) {
      var handle = jQuery(this);
      var target = $d(handle).target;

      target.slideDown(
        $d(handle).options.speed || $d(handle).defaultOptions.speed,
        function() {
          handle.removeClass("collapsed").addClass("expanded");
          target.removeClass("collapsed").addClass("expanded");
        }
      );
    });
  }],

  collapse: [function(options) {
    this.bind("collapsed", function(elem, handle) {
      var handle = jQuery(this);
      var target = $d(handle).target;

      target.slideUp(
        $d(handle).options.speed || $d(handle).defaultOptions.speed,
        function() {
          handle.addClass("collapsed").removeClass("expanded");
          target.addClass("collapsed").removeClass("expanded");
        }
      );
    });
  }]
};
