/**
 * Esta clase singleton maneja la conexion/desconexion de eventos de manera portable.
 * @author Lian Castellón
 */
var EventManager =
{
  /**
   * Conecta un handler al evento de un elemento determinado.
   * @param {Object} el Elemento al que se va a conectar el handler.
   * @param {Object} eventName Nombre del evento (nombre oficial según el W3C DOM).
   * @param {Object} handler Manipulador del evento.
   * @param {Object} scope Calling-context donde debe invocarse el handler.
   */
  addEventListener: function( el, eventName, handler, scope)
  {
    // Si nos pasan un scope, nos aseguramos de invocar el handler en este scope
    if (scope)
    {
      var h = handler;
      var s = scope;
      handler = function()
      {
        h.apply( s, arguments);
      };
    }

    if (el.addEventListener) // Firefox et al
    {
      el.addEventListener( eventName, handler, false);
    }
    else if (el.attachEvent) // Fucking IE!
    {
      /* El IE permite registrar el mismo handler más de una vez (no comments...), por eso primero tratamos
       * de desconectarlo (si no estaba conectado, no pasa nada). */

      // Ademas, el evento debe llamarse con un 'on' delante - uff!!
      eventName = 'on' + eventName;

      el.detachEvent( eventName, handler);
      el.attachEvent( eventName, handler);
    }
    else // Para los muy viejitos...
    {
      el[eventName] = handler;
    }
  },

  /**
   * Desconecta el handler de un evento de un elemento específico.
   * @param {Object} el Elemento al que se le va a desconectar el handler.
   * @param {Object} eventName Nombre del evento (nombre oficial según el W3C DOM).
   * @param {Object} handler Manipulador de evento.
   * @param {Object} scope Calling-context donde debe invocarse el handler.
   */
  removeEventListener: function (el, eventName, handler)
  {
    if (el.removeEventListener) // Firefox et al (W3C DOM)
    {
      el.removeEventListener( eventName, handler, false);
    }
    else if (el.detachEvent) // Fucking IE!
    {
      el.detachEvent( 'on' + eventName, handler);
    }
    else // Para los muy viejitos...
    {
      el[eventName] = null;
    }
  },

  /**
   * Caso especial de registro del evento onLoad del documento.
   * @param {Object} handler Manipulador del evento.
   */
  registerOnLoad: function (handler, scope)
  {
    this.addEventListener( window, 'load', handler, scope);
  },
  
  registerOnUnload: function (handler, scope)
  {
    this.addEventListener( window, 'unload', handler, scope);    
  }
};

/**
 * Alias de addEventListener.
 */
EventManager.on = EventManager.addEventListener;

/**
 * Alias de removeEventListener.
 */
EventManager.un = EventManager.removeEventListener;
