
function Notification(name, object, userInfo)
{
	this.name = name;
	this.userInfo = userInfo;
	this.object = object;
	return this;
}

function NotificationCenter()
{
	this.observers = new Array();
	return this;
}
// Use this method to post a notification
Notification.postNotification = function(name, object, info)
{
	Notification.defaultCenter.postNotification(name, object, info);
}
// Use this method to add an observer
// Use only a persistent object as the target
NotificationCenter.addObserver = function(target, method, name, object)
{
	NotificationCenter.defaultCenter.addObserver(target, method, name, object);
}
// Use this method to remove an oserver
NotificationCenter.removeObserver = function(target, name, object)
{
	NotificationCenter.defaultCenter.removeObserver(target, name, object);
}


NotificationCenter.defaultCenter = Notification.defaultCenter = new NotificationCenter();
 
NotificationCenter.prototype.postNotification = function(name, object, info)
{
	try{
		var note = new Notification(name, object, info);
		if(window.console && window.console.log)
			window.console.log("-- posting notification name '" + note.name + "' object " + note.object);
		for(var n=0;n<this.observers.length;n++){
			var observer = this.observers[n];
			if(observer && observer.name == note.name && 
					(observer.object == note.object || observer.object == null)){
				if(window.console && window.console.log)
					window.console.log("-- sending notification " + note.name + " method " + observer.method);
				if(observer.target && observer.target[observer.method])
					observer.target[observer.method].apply(observer.target, [note]);
				else if(window.console && window.console.log)
					window.console.log("*** Notification: method not found " + observer.method);
				//observer.target[observer.method](note);
			}
		}
	}catch(e){
		if(window.logError)
			logError(e);
		throw(e);
	}
}
function Observer(target, method, name, object)
{
	this.target = target;
	this.name = name;
	this.object = object;
	this.method = method;
	return this;
}
Observer.prototype.toString = function(){
	return 'Observer ' + this.name + ' ' + this.target + ' ' + this.method + ' ' + this.object?this.object:'null';
}

NotificationCenter.prototype.addObserver = function (target, method, name, object)
{
	this.observers.push(new Observer(target, method, name, object));
}

NotificationCenter.prototype.removeObserver = function(target, name, object)
{
	var n = this.observers.length;
	while(n-- > 0){
		var observer = this.observers[n];
		if(observer.target == target){
			if((name == null || name == observer.name) && (object == null || object == observer.object))
				this.observers.splice(n, 1);
		}
	}
}


