







































Module('ca.carleton.gcrc.mvc.observable','$Revision: 2028 $',function(mod){






mod.Observer=Class(function(publ,priv){



publ.__init__=function(){

this._observationTokens=null;
}
















publ.Observe=function(observable_,eventType_,method_,data_){

var observerToken=observable_.AddObserver(eventType_,this,method_,data_);


if(null==this._observationTokens){
this._observationTokens=new Array();
}
this._observationTokens.push(observerToken);
}














publ.ObserveAllEvents=function(observable_,method_,data_){

var observerToken=observable_.AddAllEventObserver(this,method_,data_);


if(null==this._observationTokens){
this._observationTokens=new Array();
}
this._observationTokens.push(observerToken);
}





publ.StopObserving=function(){

if(null!=this._observationTokens){
var loop;
for(loop=0;loop<this._observationTokens.length;++loop){
this._observationTokens[loop].RemoveObserver();
}
}
this._observationTokens=null;
}




publ.Terminate=function(){

this.StopObserving();
}
});











mod.Observable=Class(mod.Observer,function(publ,priv,supr){



publ.__init__=function()
{







supr.__init__.call(this);





this._observersByType={};




this._allEventObservers=new Array();




this._uniqueObserverId=1;
}
























publ.AddObserver=function(eventType,observerContext,observerFunction,observerData){
if(null==this._observersByType[eventType]){
this._observersByType[eventType]=new Array();
}
this._observersByType[eventType].push([observerContext,observerFunction,observerData,this._uniqueObserverId]);

var observerToken=new mod.ObserverToken(this,eventType,this._uniqueObserverId);


++this._uniqueObserverId;

return observerToken;
}






















publ.AddAllEventObserver=function(observerContext,observerFunction,observerData){
this._allEventObservers.push([observerContext,observerFunction,observerData,this._uniqueObserverId]);

var observerToken=new mod.ObserverToken(this,null,this._uniqueObserverId);


++this._uniqueObserverId;

return observerToken;
}











publ.RemoveObserver=function(observerToken_){

var observersArray=null;
if(observerToken_.type){
observersArray=this._observersByType[observerToken_.type];
}else{
observersArray=this._allEventObservers;
}


if(null!=observersArray){
var loop;
for(loop=0;loop<observersArray.length;++loop){
if(observerToken_.id==observersArray[loop][3]){
observersArray.splice(loop,1);
return true;
}
}
}


return false;
}


















publ.CallObservers=function(eventType_,data_,originator_){

var event={};
event.type=eventType_;
event.data=data_;
if(null==originator_){
event.originator=this;
}else{
event.originator=originator_;
}


var observers=this._observersByType[eventType_];
if(null!=observers){

var loop;
for(loop=0;loop<observers.length;++loop){
var observerContext=observers[loop][0];
var observerFunction=observers[loop][1];
event.observerData=observers[loop][2];


if(null!=observerFunction){

if(null!=observerContext){
observerFunction.call(observerContext,event);
}else{

observerFunction(event);
}
}
}
}


var loop;
var observers=this._allEventObservers;
for(loop=0;loop<observers.length;++loop){
var observerContext=observers[loop][0];
var observerFunction=observers[loop][1];
event.observerData=observers[loop][2];


if(null!=observerFunction){

if(null!=observerContext){
observerFunction.call(observerContext,event);
}else{

observerFunction(event);
}
}
}
}










publ.RedirectEvent=function(event_){
this.CallObservers(event_.type,event_.data,event_.originator);
}








publ.Terminate=function(){
supr.Terminate.call(this);


this._observersByType={};


this._allEventObservers=new Array();
}
});








mod.ObserverToken=Class(function(publ,priv){






publ.__init__=function(observed_,eventType_,serialId_){
this.id=serialId_;
this.type=eventType_;
this.observed=observed_;

this.registered=1;
}




publ.RemoveObserver=function(){
if(this.registered){
this.observed.RemoveObserver(this);
this.registered=0;
}
}
});
});