/* **************************************************
FlashExternalAPI.js
Interface de communication entre JavaScript et Flash AS2
	
Propriétés
- flashName:String										Nom du Flash connecté
		
Méthodes depuis JavaScript:
- doCall(functionName:String[, ...params])				Appelle la fonction Flash demandée en lui passant les paramètres et retourne la valeur retournée par la fonction
- doSet(varName:String, newVal:*)						Modifie la variable Flash spécifiée
- doGet(varName:String)									Récupère la variable Flash spécifiée
		
Méthodes depuis Flash:
- doCall(functionName:String[, ...params]):Object		Appelle la fonction JavaScript demandée en lui passant les paramètres et retourne la valeur retournée par la fonction
- doSet(varName:String, newVal:*)						Modifie la variable JavaScript spécifiée
- doGet(varName:String):Object							Récupère la variable JavaScript spécifiée
	
*/



// Objet constructeur

function FlashExternalAPI(newFlashName) {
	this.flashName = "via";
	if(newFlashName) this.flashName = newFlashName;


	/*	doCall
		Méthode pour appeler une fonction dans Flash

		- functionName: Nom de la fonction à appeler
		- Tout autre paramètres à passer à la fonction

		Retourne la valeur retournée par la fonction dans Flash
	*/
	this.doCall = function(functionName) {
		var fObj = getFlashObj(this.flashName);
		var retVal = undefined;
		if (fObj) {
			retVal = fObj.doCall.apply(fObj, arguments);
		} else {
			if (language == "en") alert("A communication error occured (to Flash, function).\n\nPlease contact technical support if the problem persists.");
			else alert("Une erreur de communication est survenue (vers Flash, function).\n\nVeuillez contacter le support technique si le problème persiste.");
		}
		return retVal;
	}




	/*	doSet
		Méthode pour modifier une variable dans Flash

		- varName: Nom de la variable à modifier dans Flash
		- newVal: Nouvelle valeur à attribuer à la variable
	*/
	this.doSet = function(varName, newVal) {
		var fObj = getFlashObj(this.flashName);
		if (fObj) {
			fObj.doSet(varName, newVal);
		} else {
			if (language == "en") alert("A communication error occured (to Flash, var).\n\nPlease contact technical support if the problem persists.");
			else alert("Une erreur de communication est survenue (vers Flash, var).\n\nVeuillez contacter le support technique si le problème persiste.");
		}
	}




	/*	doGet
		Méthode pour récupérer une variable dans Flash

		- varName: Nom de la variable à récupérer dans Flash
	*/
	this.doGet = function(varName) {
		alert("doGet(" + varName + ") in " + this.flashName);
		var fObj = getFlashObj(this.flashName);
		var retVal = undefined;
		if (fObj) {
			retVal = fObj.doGet(varName);
		} else {
			if (language == "en") alert("A communication error occured (to Flash, var).\n\nPlease contact technical support if the problem persists.");
			else alert("Une erreur de communication est survenue (vers Flash, var).\n\nVeuillez contacter le support technique si le problème persiste.");
		}
		return retVal;
	}
}



// ************ Méthodes génériques *************

	/*	getFlashObj
		Fonction qui retourne la référence à l'objet Flash demandé
						
		- swfID (String): Le nom du swf à trouver
		- fakeFlashObj (Object): Objet à retourner si l'objet Flash n'est pas trouvé (optionnel)
	*/
	function getFlashObj(swfID, fakeFlashObj, noErrorMessage) {
		if (fakeFlashObj != undefined) {
			// Objet fake par défaut à retourner si Flash non trouvé
			var fakeFlashObj = new Object();
			fakeFlashObj.SetVariable = function() { };
			fakeFlashObj.focus = function() { };
			fakeFlashObj.isFake = true;
		}
		var found = false;
		// On retourne la référence à l'objet
		if (document.getElementById(swfID + "-embed") && document.getElementById(swfID + "-embed").SetVariable) { return document.getElementById(swfID + "-embed"); }
		else if (document.getElementById(swfID)) { return document.getElementById(swfID); }
		else { if (!noErrorMessage) alert("Erreur: l'objet Flash '" + swfID + "' est introuvable (erreur -23). Merci de contacter le support technique."); return fakeFlashObj; }
	}




	/*	getCallArguments
		Fonction qui retourne un array d'arguments reçus pour l'appel (enlève le premier qui est le nom de l'appel)

		- args:	Objet arguments reçu parent la fonction d'origine (par ExternalAPI)
	*/
	function getCallArguments(args) {
		var newArgs = new Array();
		for (var i = 1; i < args.length; i++) {
			newArgs.push(args[i]);
		}
		return newArgs;
	}




	/*	safeCall
		Fait l'appel de la fonction et retourne la valeur.
			
		- fName (String): Nom de la fonction
		- obj (Object): Objet qui contient la fonction
		- args (Array):	Array d'arguments à passer à la fonction
	*/
	function safeCall(fName, obj, args) {
		try {
			try {
				// Fonction standard
				if(typeof(obj[fName]) == "function") return obj[fName].apply(obj, args);
			} catch(e) {}
			
			// Fonction mal reconnue
			switch(args.length) {
				case 1: return obj[fName](args[0]);
				case 2: return obj[fName](args[0], args[1]);
				case 3: return obj[fName](args[0], args[1], args[2]);
				case 4: return obj[fName](args[0], args[1], args[2], args[3]);
				case 5: return obj[fName](args[0], args[1], args[2], args[3], args[4]);
				case 6: return obj[fName](args[0], args[1], args[2], args[3], args[4], args[5]);
				case 7: return obj[fName](args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
				case 8: return obj[fName](args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
				case 9: return obj[fName](args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);
				case 10: return obj[fName](args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);
				case 0:
				default: return obj[fName]();
			}
		} catch(e) {
			//alert("safeCall error: " + e.message);
			return null;
		}
	}




// ************ Méthodes internes *************


	/*	_externalAPIInit
		Méthode interne qui répond à Flash pour initialiser la communication
	*/
	function _externalAPIInit() {
		return true;
	}



	/*	_externalAPISetVar
		Méthode interne qui reçoit l'appel de Flash pour modifier une variable dans JavaScript
	*/
	function _externalAPISetVar(varName, newVal) {
		var par = varName.indexOf(".") != -1 ? eval(varName.substring(0, varName.lastIndexOf("."))) : window.document;
		varName = (varName.indexOf(".") != -1 ? varName.substring(varName.lastIndexOf(".") + 1, varName.length) : varName);
		par[varName] = newVal;
	}



	/*	_externalAPIGetVar
		Méthode interne qui reçoit l'appel de Flash pour récupérer une variable dans JavaScript
	*/
	function _externalAPIGetVar(varName) {
		var par = varName.indexOf(".") != -1 ? eval(varName.substring(0, varName.lastIndexOf("."))) : window.document;
		varName = (varName.indexOf(".") != -1 ? varName.substring(varName.lastIndexOf(".") + 1, varName.length) : varName);
		return par[varName];
	}