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

  this.setupPlugin(options.setup || jQuery.fn.boundCheckbox.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(":checked")) {
        handle.trigger("handleChecked", handle);
      } else {
        handle.trigger("handleUnchecked", handle);
      }
    });

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

  return this;
};

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

      handle.addClass("bound-checkbox-handle");
      target.addClass("bound-checkbox-target");

      if (!handle.is(":checked")) {
        target.hide(); // no options
      }
    });
  }],

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

      target.slideDown(
        $d(handle).options.speed || $d(handle).defaultOptions.speed
      );
    });
  }],

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

      target.slideUp(
        $d(handle).options.speed || $d(handle).defaultOptions.speed
      );
    });
  }]
};

