var Observable = Class.create({
    initialize: function(_options) {
        for(var p in _options){
            this[p] = _options[p];
        }
        this.events = {};
        if(this.listeners){
            this.addListener(this.listeners);
            delete this.listeners;
        }
    },
    addListener : function(eventName, fn, scope){
        if(typeof eventName == "object"){
            var o = eventName;
            for(var e in o){
                if(typeof o[e] == "function"){
                    // shared options
                    this.addListener(e, o[e], o.scope);
                }else{
                    // individual options
                    this.addListener(e, o[e].fn, o[e].scope);
                }
            }
            return;
        }
        eventName = eventName.toLowerCase();
        var ce = this.events[eventName];
        if(!ce){
            this.events[eventName] = [];
		}	
		var event = {
			eventName: eventName
			,listener: ({fn: fn, scope: scope})
		};
        this.events[eventName].push(event);
    },
	removeListener : function(eventName, fn, scope){
        var ce = this.events[eventName.toLowerCase()];
        if(ce){
            for (var i = 0; i < ce.length; i++) {
				var e = ce[i];
				if (e.listener.fn == fn && e.listener.scope == scope) {
					ce.splice(i, 1);
				}
			}
        }
    },
    fireEvent: function() {
        var ce = this.events[arguments[0].toLowerCase()];
		if(ce){
			var args = Array.prototype.slice.call(arguments, 1);
			for (var i = 0; i < ce.length; i++) {
				if (ce[i].listener.fn.apply(ce[i].listener.scope||window, args) === false) {
					return false;
				}
			}
        }
        return true;
    }
});
Observable.prototype.on = Observable.prototype.addListener;
Observable.prototype.un = Observable.prototype.removeListener;

