﻿//~~~ OBSERVABLE CLASS ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//~~~ http://www.artlebedev.ru/tools/technogrette/js/observable/

Observable.prototype = {
//=== MEMBERS ====================================================================================================
	aObservers : [],
	
//=== METHODS ====================================================================================================
    AttachObserver : function( sEventType, mObserver ) {
		//alert("Attaching... " + mObserver + " for " + sEventType);
        if(!(mObserver instanceof Object)) {
            return;
        }
        if(!this.aObservers[sEventType]) {
            this.aObservers[sEventType] = [];
        }
        this.aObservers[sEventType].push(mObserver);
        //alert("length="+this.aObservers[sEventType].length);
    },

    DetachObserver : function( sEventType, mObserver ) {
		//alert("Detaching... " + mObserver + " from " + sEventType);
        if(Exists(this.aObservers[sEventType])) {
        
			for(var i = 0; i < this.aObservers[sEventType].length; i++) {
				if(this.aObservers[sEventType][i] == mObserver){
					this.aObservers[sEventType][i] = null; // remove this observer
					return true;
				}
			}
        }
        return false;
    },

    Notify : function( sEventType ) {
		//alert("Notifying..."+this.aObservers[sEventType].length);
        if(!this.aObservers[sEventType]) {
            return;
        }
        //var str= "";
        for(var i = 0, aObservers = this.aObservers[sEventType], iLength = aObservers.length; i < iLength; i++) {
            if(aObservers[i] instanceof Function) {
                aObservers[i]( sEventType, this );
            }
            else if(aObservers[i].Update instanceof Function) {
                aObservers[i].Update( sEventType, this );
            }
            //str+=i.toString()+"="+aObservers[i].SharedDropDownID+"\n";
        }
        //alert(str);
    }
};

//=== CONSTRUCTOR ================================================================================================
function Observable() {
    this.aObservers = [];
}
 
//=== INHERIT FROM METHOD ========================================================================================
function inheritFrom(child_class_object, base_class_object)///* Object */ aThis, /* Object */ aParent)
{
  for (var property in base_class_object){
	try{
		child_class_object[property] = base_class_object[property];
	
	}catch(error){ }
  }
}

//=== GLOBAL =====================================================================================================
function Exists(object){
	return (typeof(object)!="undefined" && object != null);
}