/**
 *  Observable Class
 *
 *  @constructor
 *  @param  oTarget  {Object}  Object which should be extended by the "Observable" interface
 *
 *  @version  2.0
 *  @author  Mista K.
 */



ICFO.Observable = function (oTarget) {
	// callback holder
	this.aObservers = [];
	// inject into target object
	oTarget.oObservable = this;
	// apply interface
	oTarget.attachObserver = function (sEventType, mObserver) {
		this.oObservable.attachObserver(sEventType, mObserver);
	};
	oTarget.detachObserver = function (sEventType, mObserver) {
		this.oObservable.detachObserver(sEventType, mObserver);
	};
	oTarget.notify = function (sEventType, data) {
		this.oObservable.notify(sEventType, data);
	};
};

ICFO.Observable.prototype = {
	attachObserver: function (sEventType, mObserver) {
		if (!(mObserver instanceof Object)) {
			return;
		}
		if (!this.aObservers[sEventType]) {
			this.aObservers[sEventType] = [];
		}
		this.aObservers[sEventType].push(mObserver);
	},
	detachObserver: function (sEventType, mObserver) {
		if (this.aObservers[sEventType]) {
			var a = this.aObservers[sEventType];
			for (var i = 0; i < a.length; i++) {
				if (a[i] === mObserver) {
					a.splice(i, 1);
					break;
				}
			}
		}
	},
	notify: function (sEventType, data) {
		if (!this.aObservers[sEventType]) {
			return;
		}
		for (var i = 0, aObservers = this.aObservers[sEventType], iLength = aObservers.length; i < iLength; i++) {
			if (aObservers[i] instanceof Function) {
				aObservers[i](data);
			}
		}
	}
};
