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

(function()
{
	/**
	 * 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.
	 */
	eventHandler.add = function eventHandler_add(element, type, obj, method)
	{
		var handlerId = this.nextHandlerId++;
		if (obj)
		{
			var handlerObject = {
				'element': element,
				'type': type,
				'func': function(e)
				{
					if (typeof toerEngineError !== 'undefined')
					{
						// Als 'event' gebruikt wordt (IE dus), dan dat ding klonen, omdat
						// IE 'm hergebruikt voor iedere event. Dus zodra er een error Event
						// optreedt, overschrijft IE de huidige event met de error event. En
						// omdat objecten altijd by-reference doorgegeven worden, kan de
						// errorhandler ook niet meer zien wat nou echt de laatste event was.
						toerEngineError.lastE = e || null;
						toerEngineError.lastEvent = typeof event === 'undefined' ? null : eventHandler.clone(event);
						if (isIE)
						{
							// Voor IE geen try/catch, omdat-ie dan geen regelnummers meer geeft in de foutmelding
							var result = obj[method](element, e);
						}
						else
						{
							try { var result = obj[method](element, e); }
							catch(ex) { toerEngineError(ex); }
						}
						toerEngineError.lastE = null;
						toerEngineError.lastEvent = null;
					}
					else
						var result = obj[method]();
					return result;
				}
			};

			this.handlers[handlerId] = handlerObject;
		}
		else
		{
			var handlerObject = {
				'element': element,
				'type': type,
				'func': function(e)
				{
					if (typeof toerEngineError !== 'undefined')
					{
						toerEngineError.lastE = e || null;
						toerEngineError.lastEvent = typeof event === 'undefined' ? null : eventHandler.clone(event);
						if (isIE)
						{
							// Voor IE geen try/catch, omdat-ie dan geen regelnummers meer geeft in de foutmelding
							var result = method(element, e);
						}
						else
						{
							try { var result = method(element, e); }
							catch(ex) { toerEngineError(ex); }
						}
						toerEngineError.lastE = null;
						toerEngineError.lastEvent = null;
					}
					else
						var result = method(element, e);
					return result;
				}
			};

			this.handlers[handlerId] = handlerObject;
		}

		var fName = 'on'+type+' eventHandler for ';
		if (element.nodeType && element.nodeType == 3)  // 3 = ELEMENT_NODE
			handlerObject.func.fName = fName+element.tagName+(element.id ? '#'+element.id : '')+(element.className ? '.'+element.className.replace(/\s/g, '.') : '');
		else if ((typeof toerEngineBlock !== 'undefined') && (element instanceof toerEngineBlock))
			handlerObject.func.fName = fName+'toerEngineBlock '+element.name;
		else
			handlerObject.func.fName = fName+element.toString();

		var handler = this.handlers[handlerId];

		if (document.addEventListener)  // W3C methode
		{
			if (handler.type == 'mousewheel' && typeof opera === 'undefined')  // 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.
	 */
	eventHandler.remove = function eventHandler_remove(handlerId)
	{
		var handler = this.handlers[handlerId];
		if (!handler || !handler.element) // element is al verdwenen van de pagina zonder dat de event ervan verwijderd is
			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.
	 */
	eventHandler.removeAll = function eventHandler_removeAll()
	{
		for (var i in this.handlers)
			this.remove(i);

		return true;
	};

	eventHandler.clone = function eventHandler_clone(obj)
	{
		var cloneObj = { };

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

		return cloneObj;
	};
})();

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


