var DOMEvents = {
	constructor: function() {
		if (!DOMEvents.init) {
			DOMEvents.init = true;
			DOMEvents.add(window, "unload", DOMEvents.flush);
		}
	},
	init: false,
	list: [],
	add: function(obj, type, fn) {
		DOMEvents.constructor();

		if (obj.addEventListener) {
			obj.addEventListener(type, fn, false);
			DOMEvents.cache(obj, type, fn);
		}
		else if (obj.attachEvent) {
			var typefn = type + fn;
			obj["e"+typefn] = fn;
			obj[typefn] = function() { obj["e"+typefn](window.event); }
			obj.attachEvent("on"+type, obj[typefn]);
			DOMEvents.cache(obj, type, fn);
		}
		else
			obj["on"+type] = obj["e"+type+fn];
	},
	cache: function(node, sEventName, fHandler) {
		DOMEvents.list.push(arguments);
	},
	flush: function() {
		var i, item, list = DOMEvents.list;
		for (i = list.length - 1; item = list[i]; 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;
		}
	}
}
