/*******************************************************************************
** initialisations
*******************************************************************************/
var sTrack_score = "";
var sTrack_session_time = "";
var sTrack_lesson_status = "";
var sTrack_lesson_location = "";
var sTrack_suspend_data = "";

//Liste des header des interactions envoyées par la player.
//var aInteractionHeaders = ["id","type","result","weighting","latency","correct_response_text","student_response_text","description","theme"];
var aInteractionHeaders = ["interaction_id","type","result","weighting","latency","correct_response_text","student_response_text","description","id_theme"];
//Liste des headers des interaction de thème
var aThemeHeaders = ["title","score","status","time"];
//Liste des interactions.
var aInteractionsList = new Array();
//Liste des thèmes.
var aThemesList = new Array();

var bDebug = true; //Est-on en mode débug ?

var _bOneShotTracking = false;
var _pTrackingInstructions;

/*******************************************************************************
** fonctions d'alert.
*******************************************************************************/

function trace(sText){
	if(bDebug) alert(sText);	
}


/*******************************************************************************
** fonctions LMS
*******************************************************************************/
function getLMSParameters() { // retourne des paramètres url_encoded avec des infos sur le tracking
	
	//trace('getLMSParameters');
	
	var buffer = "";
	if(bAPIBased) { 
		buffer = APIBased_getLMSParameters();
	} else {
		buffer = HACP_getLMSParameters();
	}
	
	//trace('Parametres : '+buffer);
	return buffer;
}

function myLMSInitialize() {
	//alert('myLMSInitialize');
	var buffer = APIBased_LMSInitialize(); // on essaie d'abord de trouver une API
	if (buffer != true) buffer = HACP_LMSInitialize(); // si pas d'API alors on essaie de trouver des paramètres HACP
	

	/*********
	* FORCER HACP, API BASED...
	*********/
	//Forcer API Based
	//var buffer = APIBased_LMSInitialize(); // on essaie de trouver une API
	//Forcer HACP.
	//var buffer = HACP_LMSInitialize(); // on initialise le système HACP.

	_pTrackingInstructions = new Object();
	
	return buffer;
}

function myLMSFinish() {
	var buffer = false;
	//trace('LMSFinish _bOneShotTracking=' + _bOneShotTracking);

	if (_bOneShotTracking) {
		_bOneShotTracking = false;
		for (var str in _pTrackingInstructions) {
			myLMSSetValue(str, _pTrackingInstructions[str]);
		}
		myLMSSetValue("lesson_status", _pTrackingInstructions["lesson_status"]);
	}

	//alert('bHACP=' + bHACP);

	if(bAPIBased) { buffer = APIBased_LMSFinish(); } else { if(bHACP) { buffer = HACP_LMSFinish(); } }
	// on désactive le tracking qui est maintenant terminé
	bAPIBased = false;
	bHACP = false;	
	
	
	return buffer;
}


function myLMSSetValue(sElement, sValue) { // on stocke simplement les données dans des variables : le véritable envoie vers le LMS se fera dans myLMSFinish()
	//alert('myLMSSetValue :' + sElement + ' | ' + sValue);

	var buffer = false;
	
	if (_bOneShotTracking) {
		_pTrackingInstructions[sElement] = sValue;
	} else {
		//alert('LMSSetValue ' + sElement + ' = ' + sValue);
		switch (sElement) {
			case "score":
				sTrack_score = sValue;
				if(bAPIBased) { APIBased_LMSSetValue("cmi.core.score.raw", sValue, false); }
				buffer = true;
			break;
			case "session_time":
				sTrack_session_time = sValue;
				if(bAPIBased) { APIBased_LMSSetValue("cmi.core.session_time", sValue, false); }
				buffer = true;
			break;
			case "lesson_status":
				sTrack_lesson_status = sValue;
				if(bAPIBased) { APIBased_LMSSetValue("cmi.core.lesson_status", sValue, false); }
				buffer = true;
			break;
			case "lesson_location":
				sTrack_lesson_location = sValue;
				if(bAPIBased) { APIBased_LMSSetValue("cmi.core.lesson_location", sValue, false); }
				buffer = true;
			break;
			case "suspend_data":
				sTrack_suspend_data = sValue;
				if(bAPIBased) { APIBased_LMSSetValue("cmi.suspend_data", sValue, false); }
				buffer = true;
			break;
			default: // c'est sans doute une interaction (API Based)
				//Cas de l'HACP, on va garder les interactions pour les envoyer à la fin dans une url encodée.
				var aElements = sElement.split(".");
				
				//On va garder ces différentes infos sur l'élément.
				var sCom = aElements[0]; //Type de communication, normalement "cmi".
				var sDataType = aElements[1] ; //Type de donnée "interactions" ou "theme".
				var sId = aElements[2] ; //Id de la donnée.
				var sDataName = aElements[3] ; //Nom de la donnée : "type", "title", "status" ...

				//alert(sDataName + ' : ' + sValue);
				addInteractionsInfo(sDataType, sId, sDataName, sValue);

				//Cas API Based
				if(bAPIBased) { APIBased_LMSSetValue(sElement, sValue, true); }
			break;
		}
	}
	return buffer;
}

function myLMSGetValue(sElement) {
	var buffer = "";
	if(bAPIBased) { buffer = APIBased_LMSGetValue(sElement); }
	return buffer;
}

/**
* Méthode relative à la sauvegarde et mise en forme des interaction et données des plages Elm en HACP
* @sDataType : String - type d'information : "interactions", "theme"
* @sId : String - Référence de l'intéraction dans le tableau associatif général
* @sDataName : String - Nom de champs de l'interaction
* @sValue : String - Valeur de l'interaction
*/

function addInteractionsInfo(sDataType, sId, sDataName, sValue){
	//Si on cherche à stocker des données d'interaction simple.
	if(sDataType == "interactions"){
		
		//On va renommer des données pour coller avec le formatage final.
		if(sDataName == "id") sDataName = "interaction_id";
		if(sDataName == "theme") sDataName = "id_theme";		
		
	
		//Si cet id d'interaction n'existe pas encore :
		if(aInteractionsList[sId] == undefined){ 
			aInteractionsList[sId] = initArray(aInteractionsList[sId], aInteractionHeaders.length);
		}
		
		//On stocke l'info au bon endroit : recherche l'index du champ correspondant
		//var nIndex = getInteractionHeaderIndex(sDataName);
		var nIndex = getStringIndex(aInteractionHeaders, sDataName);
		aInteractionsList[sId][nIndex] = unescape(sValue);
		//trace(sDataName + ", sValue : " + sValue);
			
	//Sinon, si on cherche à stocker des données de thème	
	} else if(sDataType == "theme"){
		
		//Si cet id de thème n'existe pas encore :
		if(aThemesList[sId] == undefined){
			aThemesList[sId] = initArray(aThemesList[sId], aThemeHeaders.length);
		}

		//On stocke l'info au bon endroit : recherche l'index du champ correspondant
		//var nIndex = getThemesHeaderIndex(sDataName);
		var nIndex = getStringIndex(aThemeHeaders, sDataName);
		aThemesList[sId][nIndex] = unescape(sValue);
		//trace(sDataName + ", sValue : " + sValue);
	}
}

/**
* getStringIndex
* @aTab : Array - Tableau dans lequel on doit rechercher la chaine
* @sName : String - Chaine recherchée
*
* @return : Number - renvoi l'index de la chaine recherchée dans le tableau
*/
function getStringIndex(aTab, sName){
	var buffer = -1;
	
	var nInteracs = aTab.length;
	for (var i = 0; i<nInteracs; i++) {
		var sTempName = aTab[i];
		if(sTempName == sName) buffer = i;
	}
	
	return buffer;
}

/**
* créé un tableau de la taille spécifiée, prérempli avec des chaines vides
* @nSize : Number - la taille du tableau
*
* @return : le nouveau tableau
*/
function initArray(nSize){
	var buffer = new Array();
	for (var i = 0; i<nSize; i++) {
		buffer.push('""');
	}
	return buffer;
}
/*******************************************************************************
**
** DoFSCommand()
**
*******************************************************************************/
function DoFSCommand(command, args) {
	//alert("DoFSCommand : " + command + ", " + args);
	var buffer = false;
	args = String(args);
	command = String(command);
	var aArgs = args.split(";");
	switch (command) {
		case "LMSInitialize": buffer = myLMSInitialize(); break;
		case "LMSFinish": buffer = myLMSFinish(); break;
		case "LMSSetValue": buffer = myLMSSetValue(aArgs[0], aArgs[1]); break;
		case "LMSGetValue": buffer = myLMSGetValue(aArgs[0]); break;
		case "sendQuit": buffer = true; top.close(); break;
		case "OnOpenDocument": window.open(aArgs[0], '',''); break;
		case "OnGetSuspendDataBlock": sendSuspendDataToPlayer(aArgs[0]); break;
	}
	//return buffer; pas de return sinon un getURL sur DoFSCommand recharge la page internet
}

/*******************************************************************************
**
** utils
**
*******************************************************************************/
function writeFlashPlayer(sParameters, sBgColor, sWidth, sHeight, sOneShotTracking) {
	_bOneShotTracking = (sOneShotTracking == "1");

	var s = '';
	// cadrage
	s += '<table width="100%" height="100%" cellspacing="0" cellpadding="0"><tr><td valign="middle" align="center">';
	// IExplorer
	s += '<OBJECT classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0" ID="player" width="' + sWidth + '" height="' + sHeight + '">';
	s += '<param name="allowScriptAccess" value="sameDomain">';
	s += '<param name="movie" value="player.swf?' + sParameters + ' ">';
	s += '<param name="quality" value="high">';
	s += '<param name="bgcolor" value="' + sBgColor + '">';		
	// Netscape
	s += '<EMBED SRC="player.swf?' + sParameters + '" quality="high" bgcolor="' + sBgColor + '" width="' + sWidth + '" height="' + sHeight + '" name="player" align="middle" swLiveConnect="true" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">';
	s += '</EMBED></OBJECT>';
	s += '</td></tr></table>';
	document.write(s);
}

function setFlashVariable(sVarName, sValue) {
	var movie = getFlashMovieObject("player");
	if(movie != null) movie.SetVariable(sVarName, sValue);
}

function getFlashMovieObject(movieName) {
  if (window.document[movieName]) {
      return window.document[movieName];
  }
  if (navigator.appName.indexOf("Microsoft Internet")==-1) {
    if (document.embeds && document.embeds[movieName])
      return document.embeds[movieName]; 
  }
  else {
    return document.getElementById(movieName);
  }
}