/*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.enableMouseover = function (popup) {
  var callbacks, show, hide, get$, addListItem, removeListItem,
    activators = [], addActivator, removeActivator;

  callbacks = {
    created : function () {
      this.element.mouseleave(hide);
    }
  };

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

  hide = function (event) {
    var relatedTarget;
    relatedTarget = jQuery(event.relatedTarget);
    if (popup.element.get(0) === relatedTarget.get(0)) {
      return true;
    }
    if (jQuery.inArray(popup.element.get(0), relatedTarget.parents()) !== -1 && jQuery.inArray(relatedTarget.get(0), activators) === -1) {
      return true;
    }
    popup.hide();
  };

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

  addActivator = function ($el) {
    addListItem(activators, $el, show);
    get$($el).mouseenter(show);
    get$($el).mouseleave(hide);
  };

  removeActivator = function ($el) {
    removeListItem(activators, $el, show);
    get$($el).unbind('mouseenter', show);
    get$($el).unbind('mouseleave', 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 {
    addActivator    : addActivator,
    removeActivator : removeActivator
  };
};
