// JavaScript Document
jQuery((function($){
	$.Events=function(opts){
		opts=$.extend({
			cached: false,
			queued: false,
			queueInterval: false
		},opts);
		
		this._events={};
		
		this.getEventContainer=function(eventName){
			if(typeof(this._events[eventName])=='undefined')this._events[eventName]=[];
			return this._events[eventName];
		};
		
		this.trigger=function(eventName,eventObject){			//process all the event callbacks for this event with the eventObject passed
			var callbacks=this.getEventContainer(eventName);
			for(var idx=0; idx<callbacks.length; idx++){
				try{
					callbacks[idx].apply(eventObject,[eventObject]);
				}catch(e){};
			}
		};
		
		this.addEventListener=function(eventName,eventCallback){ //Add an event callback for the named event
			var callbacks=this.getEventContainer(eventName);
			callbacks.push(eventCallback);
		};
		
		
		this.removeEventListener=function(eventName,eventCallback){ //Remove an event callback from the named event
			var callbacks=this.getEventContainer(eventName);
			for(var idx=0; idx<callbacks.length; i++){
				if(callbacks[idx]==eventCallback){
					callbacks[idx].splice(idx,1);
				}
			}
		};
		
		if(opts.cached){
			this._cache={};
			
			this.getCacheContainer=function(eventName){
				if(typeof(this._cache[eventName])=='undefined')this._cache[eventName]=[];
				return this._cache[eventName];
			};
			
			this.trigger=function(eventName,eventObject){		//Store the event in the cache
				var cache=this.getCacheContainer(eventName);
				cache.push(eventObject);
			};
			
			this.getCachedEvent=function(eventName){			//Retrieve a single event object from the cache
				var cache=this.getCacheContainer(eventName);
				if(cache.length>0){
					return cache.shift();
				}else{
					return null;
				}
			};
			
			this.hasCachedEvent=function(eventName){			//Determine whether there are any cached events in the pipe
				var cache=this.getCacheContainer(eventName);
				return cache.length>0;
			};
		}
		
		if(opts.queued){
			this._queue=[];						
			
			this._interval=null;
			
			this._processEvent=function(){
				if(this._queue.length>0){
					var eventCommand=this._queue.pop();
					eventCommand.callback.apply(eventCommand.eventObject,[eventCommand.eventObject]);
				}
			};
			
			this.processEvent=function(eventCount){						//process n event callback and object from the queue
				eventCount=new Number(eventCount);
				eventCount=eventCount?eventCount:1;
				if(eventCount>this._queue.length)eventCount=this._queue.length;
				for(var idx=0; idx<eventCount; idx++){
					this._processEvent();
				}
			};
			
			this.trigger=function(eventName,eventObject){				//push all new event callback and object on the queue
				var callbacks=this.getEventContainer(eventName);
				for(var idx=0; idx<callbacks.length; idx++){
					this._queue.push({callback:callbacks[idx],eventObject:eventObject});
				}
			};
			
			this.setQueueInterval=function(interval){
				if(typeof(this._interval)!='null')clearInterval(this._interval);
				(function(self){
					self._interval=setInterval(function(){self.processEvent(1);},interval);
				})(this);
			};
			if(opts.queueInterval)this.setQueueInterval(opts.queueInterval);
		}
		
		if(opts.cached && opts.queued){
			this.processEvent=function(){};
		}
		
	}
})(jQuery));	
