function event_Engine() {
}

event_Engine.prototype = {

	register: function(evnt, func, o) {
		if ( typeof(func) != 'function' )
		{
			return false;
		}

		if ( typeof(o) == 'undefined' )
		{
			o = window;
		}

		if (o.addEventListener) {
			o.addEventListener(evnt, func, false);

		} else if (o.attachEvent) {
			
			if (!o._listeners) {
				o._listeners = new Array();
			}

			if (!o._listeners[evnt]) {
				o._listeners[evnt] = new Array();
			}

			var workaroundFunc = function() {
				func.apply(o, new Array());
			}

			o._listeners[evnt][func] = workaroundFunc;

			o.attachEvent('on' + evnt, workaroundFunc);
		}
	},

	unregister : function(evnt, func, o) {
		if ( typeof(func) != 'function' )
		{
			return false;
		}

		if ( typeof(o) == 'undefined' )
		{
			o = window;
		}

		if (o.removeEventListener) {
			o.removeEventListener(evnt, func, false);

		} else if (o.detachEvent) {

			if (o._listeners && o._listeners[evnt] && o._listeners[evnt][func]) {
				o.detachEvent('on' + evnt, o._listeners[evnt][func]);
			}

		}

	}

}

/**
 * Prevents an event from propagating.
 */
function stopEvent(event) {
	if (event.preventDefault) {
		event.preventDefault();
		event.stopPropagation();
	} else {
		event.returnValue = false;
		event.cancelBubble = true;
	}
}

var Event = new event_Engine();
