/**
 * Inspiracija iz http://blog.adampresley.com/software-development/observer-pattern-in-javascript/
* Implementacija malo drugacije varijante observer obrasca.debugger
* umjesto niza objekata on u stvari sadrzi niz sa funkcijama koje su registrovane od strane observera.
*Subjekat je u ovom slucaju model, a observeri se registruju u observer klasu, koja zamjenjuje nasledjivanje
* koje se koristi u izvornom obrascu
*/
function VISObservable(){
		this.registar = {};
		/**
		 * Registrujem hendler za specifican dogadjaj
		 * @param {String} nazivDogadjajaData
		 * @param {Function} funkcijaData
		 * @param {Object} kontekstData
		 */
		this.registrujSe = function(nazivDogadjajaData,funkcijaData,kontekstData){
			var definicija = {
					nazivDogadjaja: nazivDogadjajaData,
					funkcija: funkcijaData,
					kontekst: (kontekstData || undefined)
				};
			if(nazivDogadjajaData in this.registar)
				this.registar[nazivDogadjajaData].push(definicija);//Ako dogadjaj postoji dodaj ovo na kraj
			else
				this.registar[nazivDogadjajaData] = [definicija];//Ako dogadjaj ne postoji kreira se novi ulaz
			
		};
		/**
		 * Moraju biti prepoznati svi fajlovi da bi se smatralo da je izvrsena deregistracija.
		 * OVA METODA NIJE PROVJERENA!!
		 * @param {String} nazivDogadjaja
		 * @param {Function} funkcijaData
		 * @param {Object} kontekstData
		 */
		this.ispisiSe = function(nazivDogadjaja, funkcijaData, kontekstData){
			if(nazivDogadjaja in this.registar){
				for(i=0;i<this.registar[nazivDogadjaja].length;i++){
					if(this.registar[nazivDogadjaja][i]){
						this.registar[nazivDogadjaja].splice(i,1);
					}
				}
			}
		};
		/**
		 * Lansira se dogadjaj
		 * @param {String} nazivDogadjajaData
		 * @param {Object} argumenti
		 */
		this.lansiraj = function(nazivDogadjaja,argumenti){
			var argumenti = argumenti || {};
			if(nazivDogadjaja in this.registar){//da li dogadjaj postoji u registru
				for(i=0;i<this.registar[nazivDogadjaja].length;i++){
					var val = this.registar[nazivDogadjaja][i];
					if ("kontekst" in val && val.kontekst !== undefined)
						val.funkcija.call(val.kontekst, argumenti);
					else
						val.funkcija.call(argumenti);
				};
			}
		};
};
/**
test snippet:
var vo = new ViewObserver();
var a1=function(){
    this.a=0;
    this.proba=function(){
        this.a=2;
        console.debug(this.a);
    }
};
console.debug(vo.registar);
var aa = new a1();
vo.registrujSe('test',aa.proba,aa);

vo.lansiraj('test');
*/
