/****************************************************************
@name: /htdocs/js/lib/oggetti/EventBroadcaster.js
@desc: Classe helper per il dispatch di eventi tra gli oggetti
@authors: Marco Biondi
@lastauthor: Marco Biondi

INFO:
Classe staticaa che abilita le funzioni di dispatch su un determinato oggetto.

UTILIZZO:
Invocare nel costruttore dell'oggetto EventDispatcher.initialize(this);
Si ottengono i metodi addListener, delListener e dispatchEvent per
l'istanza specificata.

SINTASSI:
addListener(eventName:String, target:Object)
	Aggancia l'oggetto specificato alla coda di notifica dell'evento
	specificato. Lo scatenarsi dell'evento richiama il metodo "handleEvent"
	o eventName dell'oggetto indicato con un parametro (l'oggetto evento).

delListener(eventName:String, target:Object)
	Rimuove l'oggetto specificato dalla coda dell'evento specificato.

dispatchEvent(objEvt:Object)
	Scatena l'evento descritto da objEvt.
	objEvt ha due campi OBBLIGATORI:
	type : nome dell'evento
	target : un riferimento a chi ha scatenato l'evento (la funzione aggiunge this di default se non specificato)

	Altri eventuali campi significativi per l'evento dipendono
	dall'oggetto che lo lancia e dal tipo di evento.

HISTORY:
	10/03/2006 - Fissato problema di compatibilità con Prototype 1.4.0
*****************************************************************/

var EventBroadcaster =  {
	initialize: function(obj) {
		obj.addListener = EventBroadcaster.addListener;
		obj.delListener = EventBroadcaster.delListener;
		obj.dispatchEvent = EventBroadcaster.dispatchEvent;
		obj.__evtq__ = new Object();
	},

	addListener: function(eventName, target) {
		if(!this.__evtq__[eventName])
		{
			this.__evtq__[eventName] = new Array();
		}

		this.delListener(eventName, target);
		this.__evtq__[eventName].push(target);
	},

	delListener: function(eventName, target) {
		if(this.__evtq__[eventName])
		{
			var i,len;
			len = this.__evtq__[eventName].length;
			for(i = 0; i < len; i++)
			{
				if(this.__evtq__[eventName][i] == target)
				{
					this.__evtq__[eventName].splice(i,1);
					return;
				}
			} 
		}
	},

	dispatchEvent: function(objEvt) {
		if(!objEvt.target)
			objEvt.target = this;
		var q = this.__evtq__[objEvt.type];
		if(q)
		{
			var i,t,k;
			k = q.length;
			for(i=0; i<k; i++)
			{
				t = q[i];
				if(typeof(t) == "object")
				{
					if(t.handleEvent)
						t.handleEvent(objEvt);
					else if(t[objEvt.type])
						t[objEvt.type](objEvt);
				}
				else
				{
					t.apply(this, [objEvt]);
				}
			}
		}
	}
}