// EventBridge 
// v1.5
// 2009.04.22
if (!window.EventBridge) var EventBridge = new function(){
	if (!document.getElementById) return;
	
	var channel = "external";
	this.setChannel = function(name){
		channel = name;
	};
	this.getChannel = function(){
		return channel;
	};
	
	/*
	 * debugMode is used to send messages to a specifically named textarea/form.  
	 * If you would like to turn on debugging, call EventBridge.setMode("debug")
	 * and copy and paste the html below into your document
	 * <form name="eventbridge_debug_form">
			<textarea rows="20" cols="75" name="eventbridge_debug_txt" style="width:620"></textarea>
		</form>
	 */
	var mode = "normal";
	this.setMode = function(m){
		mode = m;
	};
	this.getMode = function(){
		return mode;
	};
	
	// Get a valid reference to Flash Object
	this.getFlash = function(movieName){
		if (navigator.appName.indexOf("Microsoft") != -1)
			return window[movieName];
		else
			return document[movieName];
	};
	
	var listeners = {};
	this.dispatchEvent = function(evtObj){
		
		// debug call
		var prefix = "dispatchEvent ";
		this.debug(prefix + "TYPE : " + evtObj.type + " DATA : " + evtObj.data);
		
		var type = evtObj.type;
		if (!listeners[type]) return;
		
		for (var i in listeners[type]) {
			for (var j = 0, l = listeners[type][i].length; j < l; j++) {
				var target = listeners[type][i][j].target;
				var func = listeners[type][i][j].func;
				target[func](evtObj);
			}
		}
	};
	
	this.addListener = function(type, target, func){
		listeners[type] = listeners[type] || {};
		listeners[type][target] = listeners[type][target] || [];
		
		// debug call
		var prefix = "addListener : ";
		this.debug(prefix + "TYPE : " + type + " - TARGET : " + target + " FUNCTION : " + func);
		
		listeners[type][target].push({
			target: this.getFlash(target) || target,	// flash || DOM listener
			func: func
		});
	};
	
	// changed register to add just keeping backwards compatibility
	this.registerListener = this.addListener;
	
	this.removeListener = function(type, target, func){
		
		// debug call
		var prefix = "removeListener ";
		this.debug(prefix + "TYPE : " + type + " - TARGET : " + target + " FUNCTION : " + func);
		
		// get qualified reference
		var brain = this.getFlash(target) || target;
		
		// find match and remove
		for (var i = 0, l = listeners[type][target].length; i < l; i++) {
			if (listeners[type][target][i].target.id == target && listeners[type][target][i].func == func)
				listeners[type][target].splice(i, 1);
		}
	};
	
	this.hasListener = function(type, target, func){
		var brain = this.getFlash(target) || target;
		if (func) {
			for (var i = 0, l = listeners[type][target].length; i < l; i++) {
				var listener = listeners[type][target][i];
				if ((listener.target.id == brain.id || listener.target == target) && listener.func == func){
					this.debug("hasListener TYPE : " + type + " TARGET : " + target + " FUNCTION : " + func);
					return true;
				}
			}
			this.debug("hasListener false");
			return false;
		}
		else {
			var exists = !!listeners[type][target];
			this.debug("hasListener : " + exists);
			return exists;
		}
	};
	
	this.removeAllListeners = function(){
		listeners = {};
	};
	
	this.debug = function(msg){
		if (document.eventbridge_debug_form && mode == "debug") {
			document.eventbridge_debug_form.eventbridge_debug_txt.value += (msg + "\n");
		}
	};
};