__eventListeners = [];

function _addEventListener(instance, eventName, listener)
{
	var listenerFn = listener;
	if (instance.addEventListener) {
		instance.addEventListener(eventName, listenerFn, false);
	} else if (instance.attachEvent) {
		listenerFn = function() {
			listener(window.event);
		}
		instance.attachEvent("on" + eventName, listenerFn);
	} else {
		// Add to the global __eventListeners array even though
		// the object doesn't support event listeners. The 
		// object can still broadcastEvents.
	}
	var event = {
		instance: instance,
		name: eventName,
		listener: listenerFn
	};
	__eventListeners.push(event);
	return event;
}

function _removeEventListener(event)
{
	//console.log("_removeEventListener called");
	var instance = event.instance;
	if (instance.removeEventListener) {
		//console.log("removed event...");
		instance.removeEventListener(event.name, event.listener, false);
	} else if (instance.detachEvent) {
		instance.detachEvent("on" + event.name, event.listener);
		//console.log("removed event...");
	}
	for (var i = 0; i < __eventListeners.length; i++) {
		//console.log("looping through events");
		//console.log("INSTANCE  =| " + (__eventListeners[i].instance == event.instance));
		//console.log("INSTANCE   | " + __eventListeners[i].instance + ": " + event.instance);
		//console.log("NAME      =| " + (__eventListeners[i].name == event.name));
		//console.log("NAME       | " + __eventListeners[i].name     + ": " + event.name);
		//console.log("LISTENER  =| " + (__eventListeners[i].listener == event.listener));
		//console.log("LISTENER   | " + __eventListeners[i].listener + ": " + event.listener);
		//console.log("EVENT     =| " + (__eventListeners[i] == event));
		//console.log("               ")
		if (__eventListeners[i] == event) {
			__eventListeners.splice(i, 1);
			//console.log("removed event...");
			break;
		}
	}
}

function _broadcastEvent(instance,e,o)
{
	
	if(__eventListeners) {
		for(var i = 0; i < __eventListeners.length; i++) {
			
			if(__eventListeners[i].name == e && instance === __eventListeners[i].instance) {
				__eventListeners[i].listener(o);
			}
		}
	}
}

function _unregisterAllEvents()
{
	while (__eventListeners.length > 0) {
		_removeEventListener(__eventListeners[0]);
	}
}

function _delegateCreate(instance, method)
{
    return function() {
        method.apply(instance, arguments);
    }
}
