function Observable(){

}

Observable.prototype = {
    attach_observer: function(observer){
        if (!(observer instanceof Object)) {
            return;
        }
        var attached = false;
        for (var i=0; i<this.observers.length; i++) {
            if (this.observers[i] == observer) {
                attached = true;
                break;
            }
        }
        if (!attached) {
			this.observers.push(observer);
		}
    },

    detach_observer: function(observer){
        for (var i=0; i<this.observers.length; i++) {
            if (this.observers[i] === observer) {
                this.observers.splice(i, 1);
            }
        }
    },

    notify: function(event_type){
		for (var i=0; i<this.observers.length; i++) {
            if (this.observers[i] instanceof Function) {
                this.observers[i](event_type, this);
        }
        else
            if (this.observers[i].listen instanceof Function) {
				this.observers[i].listen(event_type, this);
            }
        }
    },

    listen: function(e, obj) {}
};

var Dispatcher = function(){
    this.objects = [];

	this.find = function(obj){
		for (var i=0; i<this.objects.length; i++) {
			if (obj == this.objects[i]) {
				return obj;
			}
		}
		return false;
	}

    this.register = function(obj){
        if (this.find(obj)) {
			return;
		}
		for (var i=0; i<this.objects.length; i++) {
		    this.objects[i].attach_observer(obj);
		    obj.attach_observer(this.objects[i]);
		    obj.listen('change', this.objects[i]);
		}
        this.objects.push(obj);
    }
}

var dispatcher = new Dispatcher();
