if (typeof Prototype == 'undefined')
	throw ("eventManager.js requires Prototype library");

if (!EventManager)
{
	var EventManager = {
		//Static stuff
		Version : "1.0",
		instances : new Hash(),
		getInstance : function (key) {
			if (Object.isUndefined(key)) key=EventManager; // default manager
			var result = this.instances.get(key);
			if (!result)
			{
				result = new EventManager(key);
				this.instances.set(key, result);
			}
			return result;
		}
	};
}
(function() {
	if (EventManager.prototype) return; // Do not create class twice

	//Instance stuff
	var k = Class.create( {
	
		initialize : function() {
			this.listeners = [];
		},
		addListener : function(l) {
			if (!this.listeners.include(l))
				this.listeners.push(l);
		},
		removeListener : function(l) {
			this.listeners = this.listeners.without(l);
		},
		
		// If <value> is defined and any listener returns it this returns true
		// If <value> is not defined listeners results are returned as is
		fireEvent : function(e, value) {
			var results = [];
			this.listeners.each( function(l, index) {
				results.push(l(e));
			});
			if (value != undefined)
				return results.indexOf(value) != -1;
			else
				return results;
		}
	});

	// Extend class with static stuff
	Object.extend (k, EventManager);
	EventManager = k;
})();
