﻿(function($) {
  $.widget('ui.checkbox', {

    _init: function() {
      /*Constantes*/
      var CONSTANTES = new Object();
      CONSTANTES.CLASS_CHECKED = "checked";
      CONSTANTES.CLASS_UNCHECKED = "unchecked";
      CONSTANTES.CLASS_HOVER = "checkbox-hover";
      CONSTANTES.CLASS_DISABLED = "checkbox-disabled";

      this.options.CONSTANTES = CONSTANTES;

      var controls = new Object();

      controls.$checkbox = this.element.find("input:checkbox");
      controls.checkbox = controls.$checkbox.get(0);
      controls.$checkboxBtn = $('<input type="button" class="input-checkbox-button"/>');

      if (controls.$checkbox.is(":disabled")) {
        controls.$checkboxBtn.attr("disabled", "disabled");
        this.element.addClass(CONSTANTES.CLASS_DISABLED);
      }

      //On applique les classes css
      if (controls.checkbox.checked)
        controls.$checkboxBtn.addClass(CONSTANTES.CLASS_CHECKED);
      else
        controls.$checkboxBtn.addClass(CONSTANTES.CLASS_UNCHECKED);

      //On ajoute l'élément dans la page
      controls.$checkbox.after(controls.$checkboxBtn);
      //on cache l'ancienne checkbox
      controls.$checkbox.hide();

      this.controls = controls;

      /* Evènements */
      this.controls.$checkboxBtn.bind("click", this, function(event) {
        event.data._check(!event.data.controls.checkbox.checked);
      });

      this.controls.$checkboxBtn.bind("mouseover", this, function(event) {
        event.data.element.addClass(event.data.options.CONSTANTES.CLASS_HOVER);
      }).bind("mouseout", this, function(event) {
        event.data.element.removeClass(event.data.options.CONSTANTES.CLASS_HOVER);
      });

      this.controls.$checkbox.bind("change", this, function(event) {
        event.data._afterCheck();
      });
    },

    destroy: function() {
      $.widget.prototype.destroy.apply(this, arguments);
      return this;
    },

    _check: function() {
      this.controls.$checkbox.trigger("click");
      this._afterCheck();
    },

    _afterCheck: function() {
      var CONSTANTES = this.options.CONSTANTES;
      if (this.controls.checkbox.checked)
        this.controls.$checkboxBtn.addClass(CONSTANTES.CLASS_CHECKED).removeClass(CONSTANTES.CLASS_UNCHECKED);
      else
        this.controls.$checkboxBtn.removeClass(CONSTANTES.CLASS_CHECKED).addClass(CONSTANTES.CLASS_UNCHECKED);
    }
  });
})(jQuery);

$("span.checkbox").checkbox();
