Array.prototype.removeItem = function(item) {
	var j = 0;
	while (j < this.length) {
		if (this[j] == item) {
		   this.splice(j, 1);
		} else {
		   j++;
		}
	}
};
	
var Observable = Class.create({
	initialize : function(){
		this.observerTypeList = new Object();
	},
	removeAllObservers : function(){
		for(var i in this.observerTypeList){
			delete this.observerTypeList[i];
		}
	},
	addObserver : function(newObserver, eventType){
		if(this.observerTypeList[eventType] == null){
		   this.observerTypeList[eventType] = new Array();
		}
		this.observerTypeList[eventType].push(newObserver);
	},
	removeObserver : function(newObserver, eventType){
		var typeArray = this.observerTypeList[eventType];
		if(typeArray == null){
			throw "No observer for event type "+eventType;
		}
		typeArray.removeItem(newObserver);
		if(typeArray.length == 0){delete this.observerTypeList[eventType];}
	},
	notifyObservers : function(eventType, args){
		var list = this.observerTypeList[eventType];
		  
		for(var i=0;i<list.length;i++){
			list[i].notifyObserver(eventType, this, args);
		}
	}
});

var Observer = Class.create({
	initialize : function(){
		
	},
	notifyObserver : function(eventType, eventSubject, args){
		alert("NotifyObserver method must be overridden by subclass");
	}
});
