var eventHandler =
{
	'handlers': { },
	'nextHandlerId': 1,

	/**
	 * Registers an event handler on an HTML element. Returns a handlerId,
	 * which can be used to remove the eventhandler later.
	 *
	 * Parameters:
	 * - element (object) = element on which the handler must be registered.
	 * - type (string)    = event type, like 'load', 'click', 'submit', etc.,
	 *                      without the prefix 'on'.
	 * - obj (object)     = object which contains the method that must be
	 *                      invoked by the event, or null (or empty) if you
	 *                      want to register a normal function, which is not
	 *                      part of an object.
	 * - method (string)  = name of the method (function) that must be invoked
	 *                      by the event. This method will get an event object
	 *                      as its only parameter.
	 */
	'add': function(element, type, obj, method)
	{
		var handlerId = this.nextHandlerId++;
		if (obj)
			this.handlers[handlerId] = { 'element': element, 'type': type, 'func': function(e) { if (window.event) e = eventHandler.clone(window.event); if (window.toerEngineError) toerEngineError.lastEvent = e; var result = obj[method](); if (window.toerEngineError) toerEngineError.lastEvent = null; return result; }};
		else
			this.handlers[handlerId] = { 'element': element, 'type': type, 'func': function(e) { if (window.event) e = eventHandler.clone(window.event); if (window.toerEngineError) toerEngineError.lastEvent = e; var result = method(element, e); if (window.toerEngineError) toerEngineError.lastEvent = null; return result; }};

		var handler = this.handlers[handlerId];

		if (document.addEventListener)  // W3C methode
		{
			if (handler.type == 'mousewheel' && !window.opera)  // in Firefox moet je 'DOMMouseScroll' gebruiken in plaats van '(on)mousewheel'
				handler.type = 'DOMMouseScroll';
			element.addEventListener(handler.type, handler.func, false);
		}

		else if (document.attachEvent)  // Explorer methode
			element.attachEvent('on'+handler.type, handler.func);

		else  // Te oude browser. Geen compatibel eventsysteem
			return false;

		return handlerId;
  },

  /**
   * Unregisters an eventhandler from an HTML element. Returns nothing.
   *
   * Parameters:
   * - handlerId (int) = id of the eventhandler to remove. This is the
   *                     id that was returned by the 'add' method when
   *                     you registered the handler.
   */
  'remove': function(handlerId)
  {
    var handler = this.handlers[handlerId];
    if (!handler)
    	return false;

    if (document.removeEventListener)  // W3C methode
    	handler.element.removeEventListener(handler.type, handler.func, false);

		else if (document.detachEvent)  // Explorer methode
			handler.element.detachEvent('on'+handler.type, handler.func);

		else  // Te oude browser. Geen compatibel eventsysteem
			return false;

    delete this.handlers[handlerId];
    return true;
  },

  /**
   * Unregisters all registered eventhandlers. Returns nothing.
   */
  'removeAll': function()
  {
  	for (var i in this.handlers)
  		this.remove(i);

  	return true;
  },

  'clone': function(obj)
  {
  	var cloneObj = { };

  	for (var i in obj)
  		cloneObj[i] = obj[i];

  	return cloneObj;
  }
};

eventHandler.add(window, 'unload', eventHandler, 'removeAll');
