/** **********************
*  FlashMessenger
*  Michael Bagur
*  
* ********** dépendences
*  FlashLauncher.js
*  log4js
*  prototype.js
*  
** **********************/


var FlashMessenger = {

	logger: log4js.getLogger("JsMessenger"),
	flashLogger: log4js.getLogger("FlashMessenger"),
	messengerId: 'FlashMessenger',
	
	loaded: false,
	connected: false,
	
	connectAttempts: 1,
	maxConnectAttemps: 10,
	
	eventListeners: {},
	
	flashFilesPath: '/swf/',

	init: function(communicationSessionId, target) {
		FlashMessenger.logger.debug(">> init()");
	
		if(!FlashMessenger.eventListeners['error'] || typeof(FlashMessenger.eventListeners['error'])!="function") {
			FlashMessenger.eventListeners['error'] = FlashMessenger.handleError;
		}
		if(!FlashMessenger.eventListeners['FlashError'] || typeof(FlashMessenger.eventListeners['error'])!="function") {
			FlashMessenger.eventListeners['FlashError'] = FlashMessenger.handleError;
		}
		
		setTimeout("FlashMessenger.checkIfLoaded()",3000);
		
		var parameters = {communicationSessionId:communicationSessionId};
		
		if (FlashMessenger.logger.isDebugEnabled()) {
			parameters.debug = true;
		}
	
		FlashLauncher.insert({
			fileName: FlashMessenger.messengerId,
			width: "1",
			height: "1",
			path: FlashMessenger.flashFilesPath,	
			target: target,
			parameters : parameters
		});
		
		FlashMessenger.logger.debug("<< init()");
	},
	
	sendMessage: function(messageType, data) {
		FlashMessenger.logger.debug(">> sendMessage()");
		
		if (FlashMessenger.logger.isDebugEnabled()) {
			FlashMessenger.logger.debug("Message Type :" + messageType);
			FlashMessenger.logger.debug("Message Data :" + Object.toJSON(data));
		}
		
		if(!FlashMessenger.loaded || !FlashMessenger.connected) {
			logger.warn("Trying to send a message but not connected yet...");
			setTimeout(function() { FlashMessenger.sendMessage(messageType, data);},500);
		} else {
			$(FlashMessenger.messengerId).sendMessage(messageType, Object.toJSON(data));
		}
		
		FlashMessenger.logger.debug("<< sendMessage()");
	},
	
	connect: function(port) {
		FlashMessenger.logger.debug(">> connect()");
		if (!FlashMessenger.loaded) {
			logger.debug("Trying to connect but flash not finished loading yet...");
			setTimeout('FlashMessenger.connect('+port+')',500);
		} else {
			if (typeof($(FlashMessenger.messengerId).connect)=="function") {
				$(FlashMessenger.messengerId).connect(port);
			} else {
				logger.warn("connect is not a function on the flash object, retry");
				FlashMessenger.connectAttempts++;
				if (FlashMessenger.connectAttempts<FlashMessenger.maxConnectAttemps) {
			setTimeout('FlashMessenger.connect('+port+')',500);
				} else {
					logger.error("Could not call flash's connect method");
				}
			}
		}
		FlashMessenger.logger.debug("<< connect()");
	},
	
	log: function(level,message) {
	  switch (level) {
	  	case 'debug':
	  	   FlashMessenger.flashLogger.debug(message);
	  	   break;
	  	case 'info':
	  		FlashMessenger.flashLogger.info(message);
	  		break;
	  	case 'warn':
	  		FlashMessenger.flashLogger.warn(message);
	  		break;
	  	case 'error':
	  		FlashMessenger.flashLogger.error(message);
	  		break;
	  	case 'fatal':
	  		FlashMessenger.flashLogger.fatal(message);
	  		break;
	  	default: 
	  		FlashMessenger.flashLogger.warn("Got message with unknown level "+level+" logging it in warn");
	  		FlashMessenger.flashLogger.warn(message);
	  }
	},
	
	onEvent: function(event, data) {
		FlashMessenger.logger.debug(">> onEvent()");
		
		try {
			if (event=="load") {
				FlashMessenger.loaded = true;
			}
			if (event=="connect") {
				FlashMessenger.connected = true;
			}
			
			if (FlashMessenger.eventListeners[event] && typeof(FlashMessenger.eventListeners[event]=="function")) {
				FlashMessenger.eventListeners[event].call(this,data);
			} else {
				FlashMessenger.logger.warn("No listener for event "+event);
			}
		} catch (e) {
			alert(Object.toJSON(e));
			logger.error("Error in onEvent : event="+event+" data="+ Object.toJSON(data));
		}
			
		FlashMessenger.logger.debug("<< onEvent()");
	},
	
	handleError: function(data) {
		FlashMessenger.logger.debug(">> handleError()");
		
		alert('got error ' + data.errorCode + ' : '+data.errorMessage);
		
		FlashMessenger.logger.debug("<< handleError()");
	},
	
	addEventListener: function(eventType, callback) {
		FlashMessenger.eventListeners[eventType] = callback;
	},
	
	checkIfLoaded: function() {
		if (!FlashMessenger.loaded) {
			FlashMessenger.logger.warn("FlashMessenger not loaded after 3 seconds");
		}
	}
	
}