﻿var Observable = (function() {
	function fnObservableConstructor() {
		/****************************************************/
		/*                                                  */
		/*                                                  */
		/*                 Private Variables                */
		/*                                                  */
		/*                                                  */
		/****************************************************/
		
		var aObservers = $A(new Array());
		var bChanged = false;
		
		/****************************************************/
		/*                                                  */
		/*                                                  */
		/*          Class Level Priveleged Methods          */
		/*                                                  */
		/*                                                  */
		/****************************************************/
		
		this.addObserver = function(oObserver) {
			try {
				if (oObserver.update)
					aObservers.push(oObserver);
			}
			catch (eException) {
			
			}
		}
		
		this.clearChanged = function() {
			bChanged = false;
		}
		
		this.countObservers = function() {
			return aObservers.length;
		}
		
		this.hasChanged = function() {
			return bChanged;
		}
		
		this.notifyObservers = function(oArguments) {
			if (this.hasChanged()) {
				for (var iObserver = aObservers.length - 1; iObserver > -1; iObserver--) {
					try {
						aObservers[iObserver].update(oArguments);
					}
					catch (eException) {
					
					}
				}
				this.clearChanged();
			}
		}
		
		this.removeAllObservers = function() {
			aObservers = $A(new Array());
		}
		
		this.removeObserver = function(oObserver) {
			for (var iObserver = 0; iObserver < aObservers.length; iObserver++) {
				if (aObservers[iObserver] == oObserver) {
					aObservers.splice(iObserver, 1);
					break;
				}
			}
		}
		
		this.removeObserverAt = function(iIndex) {
			if (iIndex < aObservers.length)
				aObservers.splice(iIndex, 1);
		}
		
		this.setChanged = function() {
			bChanged = true;
		}
	}
	
	return fnObservableConstructor;
})();