JSVL 						= JSVL 						|| {};

JSVL.EVENT$CLASSDEF = {
	getClassName:function() {
			return "JSVL.EVENT"; 
		},
    name:null       ,
    obj:null        ,
    listeners:[]    ,
    firing:false    ,

    fire : function(){
        var me = this;
        var args = JSVL.TOARRAY(arguments);
        var ret = true;
		
		me.firing = true;
		
		var  len = me.listeners.length;
        for( var i = 0  ; i < len; i++){
			var listener = me.listeners[i];
		
			var o = listener.scope || me.obj || window;
			if (listener.fireFn.apply(o, args) === false) {
                me.firing = false;
                ret = false;
                return ret ;
             }
		}
        me.firing = false;
        return ret;
    } ,


    addListener : function(config){
        config = config ||{};
        var me      = this;
        var listner = null;
        config.scope = config.scope || me.obj;
        if(!me.isListening(config)){
            listner = me.createListener(config);
            if(me.firing){
                me.listeners = me.listeners.slice(0);
            }
            me.listeners.push(listner);
        }
    },


    createListener: function(config){
        config          = config || {};

        var handler  = config.handler || JSVLFUNCDUMMY;
        var options  = config.options || {};
        var scope    = config.scope   || this.obj;

        var listner = {
            handler: handler    ,
            scope  : scope      ,
            options: options
        };

        config.event   = this;

        var delegate = function(){
            handler.apply(scope, JSVL.TOARRAY(arguments));
        };

        listner.fireFn = delegate;
        return listner;
    },

    findListener : function(config){
        config     = config || {};
        var func   = config.handler ;
        var scope  = config.scope;
        var me = this;
        var ret = -1;

		var  len = me.listeners.length;
        for( var i = 0  ; i < len; i++){
			var listener = me.listeners[i];
		
			var s = listener.scope;
			if(listener.func == func && (s == scope || s == me.obj)){
				ret = i;
				return false;
			}
		}
	
        return ret;
    },

    isListening : function(config){
        config = config || {};


        return this.findListener(config) != -1;
    },

    removeListener : function(config){
        var index,
        me = this,
        ret = false;
        if((index = me.findListener(config)) != -1){
            if (me.firing) {
                me.listeners = me.listeners.slice(0);
            }
            me.listeners.splice(index, 1);
            ret = true;
        }
        return ret;
    },

    clearListeners : function(){
        this.listeners = [];
    }
}



JSVL.EVENT = function(){  
	if ( JSVL.ISFUNCTION(this.setupInstance) ){
		this.setupInstance.apply(this,arguments);
	}
	return this;
}
JSVL.EVENT.prototype = new JSVL.COREOBJECT({CREATINGCLASS:true});
JSVL.EVENT.prototype.constructor = JSVL.EVENT;

JSVL.APPLY(JSVL.EVENT.prototype,JSVL.EVENT$CLASSDEF);




