
	// PERCEPTICON CORESPIN Application Framework
	// http://www.percepticon.com, contact@percepticon.com
	//*****************************************
	// EventListener
    function ExecuteEventQueue() {
        EventListener.run();
    }

	EventListener = {

        events:[],
        
		testEvents:function() {
            sFunction = 'alert';
            for (a=0;a<4;a++) {
                aArguments = (a%2==0)?("lolcats"):("");
                EventListener.primeEvent(sFunction, aArguments);
            }
            EventListener.run();
		},

		trace:function(message) {
            alert(message);
        },

		primeEvent:function(sFunction, aArguments) {
            return EventListener.events.push( [sFunction, aArguments] );
		},
		run:function(ids) { //
            if(typeof(ids)=="Array") {
                count = ids.length-1;
                for (a=count;a>=0;a--) { //execute from top down
                    aCall = EventListener.events[ids[a]];
                    sFunction = aCall[0];
                    aArguments = aCall[1];
                    EventListener.execute(sFunction, aArguments);
                    EventListener.events.splice(ids[a], 1);//remove call from stack
                }
            } else {
                count = this.events.length-1;
                for (a=count;a>=0;a--) { //execute from top down
                    aCall = EventListener.events[a];
                    sFunction = aCall[0];
                    aArguments = aCall[1];
                    EventListener.execute(sFunction, aArguments);
                    EventListener.events.pop();//remove call from stack
                }
            }
		},
		execute:function(sFunction, aArguments) {
			try {
				sFunction(aArguments);
			} catch(e) {
                if(typeof(window[sFunction])=='function') {
    				try {
    					window[sFunction](aArguments);
    				} catch(e) {
                        EventListener.trace( sFunction + ':' + aArguments + ' /*window:no dice*/');
                    }
    			} else if(typeof(this[sFunction])=='function') {
    				try {
    					this[sFunction](aArguments);
    				} catch(e) {
                        EventListener.trace('/*this:no dice*/');
                    }
    			} else {
                    EventListener.trace('/*no dice*/');
                }
            }
		},

		addEvent:function(oElement, sType, eHandler) {
			try {
				oElement.addEventListener(sType, eHandler, false);
			} catch(someException) {
				if(oElement.attachEvent) {
					oElement.attachEvent('on'+sType, eHandler);
				} else { 
					oElement['on'+sType] = eHandler;
				}	
			}
			return [oElement, sType, eHandler];
		},
		removeEvent:function(event) {
			var oElement = event[0]; 
			var sType = event[1];
			var eHandler = event[2];
			try {
				oElement.removeEventListener(sType, eHandler, false);
			} catch(someException) {
				if(oElement.detachEvent) {
					oElement.detachEvent('on'+sType, eHandler);
				} else {
					oElement['on'+sType] = null;
				}	
			}
		},
		cancelEvent:function(e) {
			try {
				e.preventDefault();
				e.stopPropagation();
			} catch (someException) {
				e.returnValue = false;
			}	return (false);
		}
	}
	//*****************************************


    //EventListener.testEvents();

