function call (/*function*/ method, /*object*/ obj /*arguments*/) {
	obj.__base = method;
	obj.__base(arguments[2], arguments[3], arguments[4], arguments[5],
		arguments[6], arguments[7], arguments[8], arguments[9]);
}

/*void*/ function eventDispatcher(event) {
	//event.cancelBubble();
	var sender;
	if (!event) {
		event = window.event;
		sender = this;
		event.target = event.srcElement;
	} else {
		sender = event.currentTarget;
	}

	for (var i = 0; i < sender.listeners.length; i++) {
		if (sender.listeners[i].type == event.type) {
			call(sender.listeners[i].method, sender.listeners[i].object, sender, event);
		}
	}

	//sender[event.type + "Listener"].call(sender[event.type + "Object"], sender, event);
}

function addEventListener(eventSourse/*:DomElement*/, eventType/*:String*/,
		eventTarget/*:Object*/,	eventListener/*:Function*/)/*:Void*/ {
	if (!eventSourse.listeners) {
		eventSourse.listeners = [];
	}

	eventSourse.listeners.push({
		type  : eventType,
		object: eventTarget,
		method: eventListener
	});

	if (!eventSourse["on" + eventType]) {
		eventSourse["on" + eventType] = eventDispatcher;
	}
}

function removeEventListener(eventSourse/*:DomElement*/, eventType/*:String*/, eventListener/*:Function*/)/*:Void*/ {
	if (!eventSourse.listeners) return;

	for (var i = 0; i < eventSourse.listeners.length; i++) {
		if(eventSourse.listeners[i].type == eventType && eventSourse.listeners[i].method == eventListener) {
			eventSourse.splice(i);
			break;
		}
	}
}

var EVENTS_JS = true;