/** NeatEvents - bfults@gmail.com - 2006-04-11                              **
 ** Code licensed under The Academic Free License v2.1                      **
 ** http://www.opensource.org/licenses/afl-2.1.txt                          **
 ** Attribution Notice: Original Author: bfults@gmail.com                   **/
var Events = {};
Events.pageLoaded = false;
Events.eventStack = [];
Events.unloadStack = [];
Events.loadStack = [];
Events.setup = function()
{
  var el = null;
  Events.pageLoaded = true;

  for (var i = Events.loadStack.length - 1; i >= 0; i--)
  {
    if (typeof Events.loadStack[i] == "function")
    {
        Events.loadStack[i]();
    }
    delete Events.loadStack[i];
  }

  for (i=0; i < Events.eventStack.length; i++)
  {
    el = Events.eventStack[i];
    if (el[0] == true)
    _xbEventAddHandler(el[1], el[2], el[3], el[4]);
  }
  return true;
}
Events.cleanup = function()
{
  var el = null;
  try
  {
    if (Events.unloadStack && Events.unloadStack.length)
    {
      while (el = Events.unloadStack.pop())
        el();
    }
    if (Events.eventStack && Events.eventStack.length)
    {
      while (el = Events.eventStack.pop())
        _xbEventRemoveHandler(el[1], el[2], el[3], el[4]);
    }
    for (var i in Events) delete Events[i];
    delete window._xbEventRemoveHandler;
    delete window._xbEventAddHandler;
    delete window.Events;
    } catch (e) {}
  return true;
}
// Member Functions
Events.addHandler = function(xEl, sEvt, fnCB)
{
  bCap = false;
  if (xEl == window)
  {
    if (sEvt == "load")
    {
      Events.loadStack.push(fnCB);
      return true;
    }
    else if (sEvt == "unload")
    {
      Events.unloadStack.push(fnCB);
      return true;
    }
  }

  Events.eventStack.push([!Events.pageLoaded, xEl, sEvt, fnCB, bCap]);

  if (Events.pageLoaded == true)
  {
    return _xbEventAddHandler(xEl, sEvt, fnCB, bCap);
  }
  return true;
}
Events.removeHandler = function(xEl, sEvt, fnCB)
{
  var oEl =  (typeof (xEl) == "string") ? document.getElementById(xEl) : xEl;
  bCap = false;
  for (var i=0, el=null; i < Events.eventStack.length; i++)
  {
    el = Events.eventStack[i];
    if (el[1] == oEl && el[2] == sEvt && el[3] == fnCB && el[4] == bCap)
    {
      Events.eventStack.splice(i, 1);
      return _xbEventRemoveHandler(oEl, sEvt, fnCB, bCap);
    }
  }
  return false;
}
Events.getTargetElement = function(evt)
{
  if (!evt && window.event) evt = window.event;
  if (!evt) return null;
  return evt.target || evt.srcElement;
}
// Private Functions
function _xbEventRemoveHandler(oEl, sEvt, fnCB, bCap)
{
  if (oEl)
  {
      if (!bCap) bCap = false;
      if (oEl.removeEventListener)
      {
        oEl.removeEventListener(sEvt, fnCB, bCap);
        return true;
      }
      else if (oEl.detachEvent)
      return oEl.detachEvent("on"+ sEvt, fnCB);
  }
  return false;
}
function _xbEventAddHandler(xEl, sEvt, fnCB, bCap)
{
  var oEl =  (typeof (xEl) == "string") ? document.getElementById(xEl) : xEl;
  if (oEl)
  {
      if (!bCap) bCap = false;
      if (oEl.addEventListener)
      {
        oEl.addEventListener(sEvt, fnCB, bCap);
        return true;
      }
      else if (oEl.attachEvent)
      return oEl.attachEvent("on"+ sEvt, fnCB);
  }
  return false;
}
_xbEventAddHandler(window, "load", Events.setup, false);
_xbEventAddHandler(window, "unload", Events.cleanup, false);
/* End NeatEvents */

