// Copyright (C) 2007 Cognos Incorporated. All Rights Reserved.
// Cognos and the Cognos logo are trademarks of Cognos Incorporated.

/*-----------------------------------------------------------------------------------------------------

Class :			CObserver

Description :	

-----------------------------------------------------------------------------------------------------*/

function CObserver(subject) {

	this.m_subject = subject;
	this.m_observers = new Array();
}

function CObserver_attach(observer, callback, evt) {
	// verify that when attaching an observer, the observer has implemented a 'update' function
	if(observer == null || typeof observer.update != "function") {
		alert('Notification Frame Work Error : attach failed');
		return false;
	}

	stateChange = new CState(this.m_subject, observer, callback ? callback : null, evt ? evt : null);
	this.m_observers[this.m_observers.length] = stateChange;	
	return true;
}

function CObserver_detach(observer) {
}

function CObserver_notify(evt) {

	if(typeof evt != "undefined" && evt != null) {
		for(var i = 0; i < this.m_observers.length; ++i) {
			if(this.m_observers[i].getEvt() == evt) {
				theObserver = this.m_observers[i].getObserver();
				theCallback = this.m_observers[i].getCallback();
				cachedHandler = theObserver.update;

				theObserver.update = theCallback;
				theObserver.update(this.m_observers[i]);
				theObserver.update = cachedHandler;
			}
		}
	} else {
		for(var i = 0; i < this.m_observers.length; ++i) {
			this.m_observers[i].getObserver().update(this.m_observers[i].getSubject());
		}
	}
}


CObserver.prototype.attach = CObserver_attach;
CObserver.prototype.detach = CObserver_detach;
CObserver.prototype.notify = CObserver_notify;



/*-----------------------------------------------------------------------------------------------------

Class :			CState

Description :	

-----------------------------------------------------------------------------------------------------*/
function CState(subject, observer, callback,evt) {
	this.m_subject = subject;
	this.m_observer = observer;
	this.m_callback = callback;
	this.m_evt = evt;
}

function CState_getObserver() {
	return this.m_observer;
}	

function CState_getCallback() {
	return this.m_callback;
}

function CState_getSubject() {
	return this.m_subject;
}

function CState_getEvt() {
	return this.m_evt;
}


CState.prototype.getObserver = CState_getObserver;
CState.prototype.getCallback = CState_getCallback;
CState.prototype.getSubject = CState_getSubject;
CState.prototype.getEvt = CState_getEvt;