/**
 * addEvent(obj, type, fn)
 * 
 * Attaches an event to a given object.
 * 
 * element - The object (or its id string) to attach to (like 'window', 'body' 'a' or someting)
 * type - The type of event (like 'load', 'unload', 'click' or someting)
 * fn - The function to attach; it must be a function without parameters
 * 
 * Example: addEvent(window, 'load', myOnloadFunc);
 * 
 * Ofcourse, it can be an anonymous function:
 *          addEvent(divTag, 'click', function() { setHighlighted('divId', true); alert('selected') });
 */
function addEvent(element, type, fn)
{
  if (typeof(element) != 'object')
    element = document.getElementById(element);

	if (element.addEventListener) {
		element.addEventListener(type, fn, false);
		EventCache.add(element, type, fn);
	} else if (element.attachEvent) {
		element["e"+type+fn] = fn;
		element[type+fn] = function() {
			element["e"+type+fn]( window.event );
		}
		element.attachEvent("on"+type, element[type+fn]);
		EventCache.add(element, type, fn);
	} else {
		element["on"+type] = element["e"+type+fn];
	}
}

var EventCache = function() {
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function (node, sEventName, fHandler) {
			listEvents.push(arguments);
		},
		flush : function() {
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1) {
				item = listEvents[i];
				if (item[0].removeEventListener) {
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if (item[1].substring(0, 2) != "on") {
					item[1] = "on" + item[1];
				};
				if (item[0].detachEvent) {
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window, 'unload', EventCache.flush);


