
var EventDispatcher = {};


EventDispatcher.exceptions = { move: 1, draw: 1, load: 1 };

EventDispatcher._removeEventListener = function( queue, event, handler ) {
	if ( typeof queue != "undefined" ) {
		
		var l = queue.length;
		for (var i = 0; i < l; i++) {
			var o = queue[i];
			if (o == handler) {
				queue.splice(i, 1);
				return;
			}
		}
	}
	return;
}

EventDispatcher.initialize = function( object ) {
	object.addListener 		= EventDispatcher.addListener;
	object.removeListener 	= EventDispatcher.removeListener;
	object.dispatchEvent 	= EventDispatcher.dispatchEvent;
	object.dispatchQueue 	= EventDispatcher.dispatchQueue;
}

EventDispatcher.dispatchQueue = function( queueObj, eventObj ) {
	
	var queueName = "__q_" + eventObj.type;
	var queue = queueObj[queueName];
	
	if( typeof queue != "undefined" ) {

		var i = queue.length;

		while( i-- ) {
			
			var o = queue[i];
			
			if( typeof o[ eventObj.type ] == "function" ) {
				
				o[ eventObj.type ]( eventObj );
			}
		}
	}
	
}

EventDispatcher.dispatchEvent = function( eventObj ) {
	
	if ( typeof eventObj.target == "undefined" )  
		eventObj.target = this;

	try {
		this[ eventObj.type + "Handler" ]( eventObj );
	} catch( e ) {}
	this.dispatchQueue( this, eventObj );
	
}

EventDispatcher.addListener = function( event, handler ) {
	
	var queueName = "__q_" + event;

	if ( typeof this[ queueName ] == "undefined" ) {

		this[ queueName ] = new Array();
	
	}
	
	EventDispatcher._removeEventListener( this[ queueName ], event, handler );
	this[queueName].push( handler );
	
}

EventDispatcher.removeListener = function( event, handler) {
	var queueName = "__q_" + event;
	EventDispatcher._removeEventListener( this[queueName], event, handler );
}

