/**
* eventRouter
* created by Ingo Taraske (zoo2002.de)
*
* observer Pattern to manage events
* V. 0.2 (29-05-2006)
*
**/


// Package jsEvent declaration
var events = new Object();

events.observers = new Hash();

/**
* a unique way to get Observers
* @params: DOM-element to observe, eventType to observe
* @returns: observer object
*
*/
events.getObserver = function(element, eventType){
	
	var observer = null;
	
	if(!element.id)
		element.id = 'element'+getRandom();
	
	var key = element.id+'_'+eventType;
	
	
	if(observer = events.observers.has(key))
		return observer;
	
	else
	return events.observers.add(key, new events.Observer(element, eventType));
}

events.Observer = Class.create();
events.Observer.prototype = {
	
	initialize: function(element, eventType){
		this.ls = new Hash();
		this.element = element;
		this.eventType = eventType;
		
		// stroring id and router in array
		if(!element.id)
			element.id = 'element'+getRandom();
		
		var eventRouterId = element.id+"_"+eventType;
		element[eventType] = this.callback;
		element['router'+eventRouterId] = this;
},

addListener: function(lsnr, target, method, command, pars){
	// for backwards compatibily
	if(!method)
		method = lsnr;
	
	if(this.hasListener(lsnr))
		return false;

	this.ls.add(lsnr, {'target': target, 'method': method, 'command': command, 'pars': pars});
	return true;
	},

	removeListener: function(lsnr){
		this.ls.del(lsnr);
	},
	
	hasListener: function(lsnr){
		return this.ls.has(lsnr);
	},
	
	notify: function(e){
		for (var i=0; i<this.ls.items.length; i++){
			var item = this.ls.items[i];
			item[1].method.call(this, e, item[1].target, item[1].command, item[1].pars);
		}
	},
	
	callback: function(event){
		var e=event || window.event;
		var eventRouterId = this.id+"_on"+e.type;
		var router = this['router'+eventRouterId];
		router.notify(e);
	}

};

