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;
		}
	}
}
Function.prototype.bind = function(object) {
	var args = (function(iterable) {
		if (iterable.toArray) {
			return iterable.toArray();
		} else {
			var results = [];
			for (var i = 0, length = iterable.length; i < length; i++)
				results.push(iterable[i]);
			return results;
		}
	})(arguments);
	var __method = this, object = args.shift();
	return function(event) {
		return __method.apply(object, [event || object.window.event].concat(args));
	}
}
function prevent(event) {
	event.stopPropagation();
	event.preventDefault();
	return false;
}
