/*global jQBoxa, jQuery */
/*jslint white: true, onevar: true, browser: true, undef: true, nomen: true, eqeqeq: true, plusplus: true, bitwise: true, regexp: true, newcap: true, immed: true, maxerr: 50, indent: 2 */
jQBoxa.enableClick = function (popup) {
  var callbacks, trigger, show, hide, get$, addListItem, removeListItem,
    addTrigger, removeTrigger,
    addActivator, removeActivator,// activators = [], 
    deactivators = [], addDeactivator, removeDeactivator;

  callbacks = {
    postShow : function () {
      jQuery(document).click(hide);
    },
    preHide : function () {
      jQuery(document).unbind('click', hide);
    }
  };

  trigger = function (event) {
    if (popup.isActive()) {
      popup.hide();
    }
    else {
      popup.show();
    }
    event.stopImmediatePropagation();
    event.preventDefault();
  };

  show = function (event) {
    popup.show();
    event.stopImmediatePropagation();
    event.preventDefault();
  };

  hide = function (event) {
    var target, deactivator;
    target = jQuery(event.target);
    if (popup.element.get(0) === target.get(0)) {
      return true;
    }
    deactivator = jQuery.inArray(target.get(0), deactivators);
    if (jQuery.inArray(popup.element.get(0), target.parents()) !== -1 && deactivator === -1) {
      return true;
    }
    popup.hide();
    if (event.target === this || deactivator !== -1) {
      event.stopImmediatePropagation();
      event.preventDefault();
    }
  };

  get$ = function ($el) {
    if (!($el instanceof jQuery)) {
      $el = jQuery($el);
    }
    return $el;
  };

  addTrigger = function ($el) {
    get$($el).click(trigger);
  };

  removeTrigger = function ($el) {
    get$($el).unbind('click', trigger);
  };

  addActivator = function ($el) {
    //addListItem(activators, $el, show);
    get$($el).click(show);
  };

  removeActivator = function ($el) {
    //removeListItem(activators, $el, show);
    get$($el).unbind('click', show);
  };

  addDeactivator = function ($el) {
    addListItem(deactivators, $el, hide);
  };

  removeDeactivator = function ($el) {
    removeListItem(deactivators, $el, hide);
  };

  addListItem = function (list, $el, event) {
    $el = get$($el);
    list[list.length] = $el.get(0);
    $el.click(event);
  };

  removeListItem = function (list, $el, event) {
    var i;
    $el = get$($el);
    i = jQuery.inArray($el.get(0), list);
    if (i !== -1) {
      list.splice(i, 1);
    }
    $el.unbind('click', event);
  };

  popup.subscribe(callbacks);

  return {
    addTrigger        : addTrigger,
    removeTrigger     : removeTrigger,
    addActivator      : addActivator,
    removeActivator   : removeActivator,
    addDeactivator    : addDeactivator,
    removeDeactivator : removeDeactivator
  };
};
