/*

VERSION: 1.0.0
FILENAME: scorm2004.js
LAST MODIFICATION: 02/12/2010
DESCRIPTION: 

  Funciones especificas para el estandar SCORM 2004

------------------------------------------------------------------------------*/

var g_oAPI=null;
var g_bAPIIsInitialized=false;



// Buscar API_1484_11 con SCORM 2004
// ---------------------------------
function FindAPIInWindowHierarchy( p_oWindow ) {
   	if (p_oWindow.API_1484_11!=null) return p_oWindow.API_1484_11;
  	if (p_oWindow.length>0)	{
  		for (var i=0;i<p_oWindow.length;i++ ) {
  			var theAPI = FindAPIInWindowHierarchy(p_oWindow.frames[i]);
  			if (theAPI!= null) return theAPI;
  		}
  	}
  	return null;
}
  
function FindAPI() {
  	var oAPI;
  
  	oAPI=FindAPIInWindowHierarchy(this.top);
  	if (oAPI==null) {
  		if (typeof(this.opener)!="undefined") {
  			if (this.opener!=null) oAPI = FindAPIInWindowHierarchy(this.opener.top);
  		}
  	}
  	return oAPI;
}
// -----------------------------------------------------------------------------




// Inicializar con SCORM 2004
// --------------------------
function LMSInitialize() {
    g_oAPI=FindAPI();
     	if (g_oAPI!=null) {
     		if (g_oAPI.Initialize("")) {	                                          // API_1484_11.Initialize()
     			g_bAPIIsInitialized=true;
     		} else {
     			var sLMSError=g_oAPI.GetErrorString( g_oAPI.GetLastError() );
     			DebugMessage("Initialization of the LMS API failed!<br>Error: " + sLMSError,1);
     		}
     	} else {
     		DebugMessage("Initialize(): LMS API not found",1);
     	} 	
}
// -----------------------------------------------------------------------------




// Commit con SCORM 2004
// ---------------------
function LMSCommit() {
  	var oAPI;
  
  	if (!g_bAPIIsInitialized) {
  		DebugMessage("Commit(): LMS API is not initialized",1);
  		return;
  	}
  	oAPI=FindAPI();
  	if (oAPI!=null) {
  		g_oAPI.Commit("");                                                        // API_1484_11.Commit()
  	} else {
  		DebugMessage("Commit(): LMS API not found",1);
  	}
}
// -----------------------------------------------------------------------------




// Finish con SCORM 2004
// ---------------------
function LMSFinish() {
    var oAPI;
     
    LMSOK=false;  
  	if (!g_bAPIIsInitialized) {
  		DebugMessage("Terminate(): LMS API is not initialized",1);
  		return;
  	}
  	oAPI=FindAPI();
  	if (oAPI!=null) {
  		g_oAPI.Terminate("");                                                     // API_1484_11.Terminate()
  		g_bAPIIsInitialized = false;
  	} else {
  		DebugMessage("Terminate(): LMS API not found",1);
  	}
}
// -----------------------------------------------------------------------------



// GetValue con SCORM 2004
// -----------------------
function LMSGetValue(p_sName) {
  	var oAPI;
  	var sValue="";
      
  	if (!g_bAPIIsInitialized) {
  		DebugMessage("GetValue(): LMS API is not initialized",1);
  		return;
  	}
  	oAPI=FindAPI();
  	if (oAPI!=null) {
  		sValue=g_oAPI.GetValue(p_sName);                                          // API_1484_11.GetValue(param)
  		if (CheckForLMSError("Error from GetValue('" + p_sName + "').",true)) { 
  			sValue=""; 
  		}
  	} else {
  		DebugMessage("GetValue(): LMS API not found",1);
  	}
  	return sValue;
}
// -----------------------------------------------------------------------------



// SetValue con SCORM 2004
// -----------------------
function LMSSetValue(p_sName,p_sValue) {
  	var oAPI;
    
  	if (!g_bAPIIsInitialized) {
  		DebugMessage("SetValue(): LMS API is not initialized",1);
  		return;
  	}
  	oAPI=FindAPI();
  	if (oAPI!=null) {
  		sValue=g_oAPI.SetValue(p_sName,p_sValue);                                 // API_1484_11.SetValue(element,value)
  		CheckForLMSError("Error from SetValue('" + p_sName + "').",true);
  	} else {
  		DebugMessage("SetValue(): LMS API not found",1);
  	}
}
// -----------------------------------------------------------------------------




// CheckForLMSError con SCORM 2004
// -------------------------------
function CheckForLMSError(p_sMessage,p_bAddDetail) {
  	var nLastErrorNo;
  	var sMessage; 
    	
  	nLastErrorNo = g_oAPI.GetLastError();                                       // API_1484_11.GetLastError()
  	if (nLastErrorNo!=0) {
  	
    	/// Eliminamos el error 133 solo y solo en el caso de CGD, ya que hace un
    	/// Terminate antes de tiempo, debido al comportamiento de su parametro CGD
    	/// -----------------------------------------------------------------------
    	if ((strCGD=="1") && (nLastErrorNo==133))	 {
    	   return true;
      }
    	/// -----------------------------------------------------------------------
    	
    	
    	/// Eliminamos los errores 403 de primer lanzamiento, donde:
    	/// cmi.suspend_data: debe estar inicializado
    	/// cmi.location      debe estar inicializado
    	/// cmi.score.raw:    debe estar inicializado
    	/// ----------------------------------------------------------------------
    	if (nLastErrorNo==403) {
    	   return true;
      }
      /// ----------------------------------------------------------------------
      
      
      // Objetivos
      // ---------
      if (p_sMessage.indexOf("cmi.objectives._children") != -1) {
          // No implementado en la plataforma
          // --------------------------------
          if (nLastErrorNo==401) {
            DebugWrite("La plataforma no implementa Objectives");
            return true;
          }     
      }
        
      // Interacciones
      // -------------
      if (p_sMessage.indexOf("cmi.interactions._children") != -1) {
          // No implementado en la plataforma
          // --------------------------------
          if (nLastErrorNo==401) {
            DebugWrite("La plataforma no implementa Interactions");
            return true;
          }     
      }
       
        	     
      /// En cualquiera de los otros casos, se muestra el error
      /// ----------------------------------------------------------------------
      sMessage=p_sMessage;
      if (p_bAddDetail) {
       		sMessage+="\n\n";
        		sMessage+="Error number: " + nLastErrorNo
        		sMessage+="\n";
        		sMessage+="Error message: " + g_oAPI.GetErrorString(nLastErrorNo)     // API_1484_11.GetErrorString(param)    
        }
        DebugMessage(sMessage,1);
        return true; 
    	} 
    	/// ----------------------------------------------------------------------
  	
    else 
    {
  		return false;
  	}
}  
// -----------------------------------------------------------------------------




// GetScorm con SCORM 2004
// -----------------------
function getScorm() {
  	sScormAPI = '';       
   	LMSInitialize();
  	LMSOK = g_bAPIIsInitialized;
    	if (LMSOK){
    	
    	  /// Obtener los datos SCORM
        /// -------------------------------------------------------------------
  	   	suspend_data=LMSGetValue("cmi.suspend_data");	
  	   	location_2004=LMSGetValue("cmi.location");
        success_status=LMSGetValue("cmi.success_status");
        completion_status=LMSGetValue("cmi.completion_status");
  	   	score=LMSGetValue("cmi.score.raw");
  	   	learner_id=LMSGetValue("cmi.learner_id");
  	   	learner_name=LMSGetValue("cmi.learner_name");
  
        /// Configurar idiomas
        /// -------------------------------------------------------------------
        configLangs();
        configLangsString();
        
        /// Construir cadena de parametros y lanzar curso
        /// -------------------------------------------------------------------
  		  ScormData='&LOCATION_2004='+location_2004+'&SUSPEND_DATA='+suspend_data+'&SCORE='+score+'&SUCCESS_STATUS='+success_status+'&COMPLETION_STATUS='+completion_status+'&LEARNER_ID='+learner_id+'&LEARNER_NAME='+learner_name;
  	   	DebugMessage("Data from LMS:\n"+ScormData,3);
  	   	
  		LaunchCourse();
  	   	return sScormAPI;
  	} else {
  		DebugMessage("LMS: problem initializing",1);
  	} 
}
// -----------------------------------------------------------------------------




// SetScorm con SCORM 2004
// -----------------------
function setScorm(args,fin) {
    var oi;
    
    if (fin==undefined) fin=true;
    //if (args=="") return 0;
    
  	if (!LMSOK) {
      LMSInitialize();
  	  LMSOK = g_bAPIIsInitialized;
  	}	
    
    if (LMSOK) {
  	
  		DebugMessage("Sending to LMS:\n"+args,3);
  		
  		/// Objetivos
  		/// ---------
  		if (strObjectives=="1") { // 1
      
         var objChildren = LMSGetValue("cmi.objectives._children");
        
        // La plataforma admite Objectives
        // -------------------------------
        if (objChildren.indexOf("status") != -1) { // 2
        
            for (oi=0;oi<aiccExtractDataValue(args,"objectives","0");oi++) {
              LMSSetValue("cmi.objectives."+oi+".id",aiccExtractDataValue(args,"cmi.objectives."+oi+".id",""));
        		  LMSSetValue("cmi.objectives."+oi+".score.raw",aiccExtractDataValue(args,"cmi.objectives."+oi+".score.raw","0"));
        		  LMSSetValue("cmi.objectives."+oi+".success_status",aiccExtractDataValue(args,"cmi.objectives."+oi+".success_status","failed"));
        		  LMSSetValue("cmi.objectives."+oi+".completion_status",aiccExtractDataValue(args,"cmi.objectives."+oi+".completion_status","incomplete"));
            }
            if (strAddFinalObjective=="1") {
              oi=aiccExtractDataValue(args,"objectives","0");
              LMSSetValue("cmi.objectives."+oi+".id","Eval_final");
        		  LMSSetValue("cmi.objectives."+oi+".score.raw",aiccExtractDataValue(args,"score",""));
        		  LMSSetValue("cmi.objectives."+oi+".success_status",aiccExtractDataValue(args,"cmi.objectives."+oi+".success_status","failed"));
        		  LMSSetValue("cmi.objectives."+oi+".completion_status",aiccExtractDataValue(args,"cmi.objectives."+oi+".completion_status","incomplete"));
            }
        
        } // 2
         
        // La plataforma NO ADMINTE Objectives
        // -----------------------------------
        else {
          DebugWrite("No se guardarán Objectives porque la plataforma no lo implementa.");
        }
        
      } // 1
      // -----------------------------------------------------------------------
      
      
      /// Interacciones
      /// -------------
      if (strInteractions=="1") {
      
         var intChildren = LMSGetValue("cmi.interactions._children");
        
          // La plataforma admite Interactions
          // ---------------------------------
          if (intChildren.indexOf("id") != -1) { // 2
      
              for (oi=0;oi<aiccExtractDataValue(args,"interactions","0");oi++) {
                // LMSSetValue("cmi.interactions."+oi+".id",aiccExtractDataValue(args,"cmi.interactions."+oi+".id",""));
          		  // LMSSetValue("cmi.interactions."+oi+".objectives.0.id",aiccExtractDataValue(args,"cmi.interactions."+oi+".objectives.0.id",""));
                
              //  alert("ENVIANDO cmi.interactions."+oi+".type => "+aiccExtractDataValue(args,"cmi.interactions."+oi+".type","choice"));
          		//  LMSSetValue("cmi.interactions."+oi+".type",aiccExtractDataValue(args,"cmi.interactions."+oi+".type","choice"));
          		  
               // alert("ENVIANDO cmi.interactions."+oi+".correct_responses.0.pattern => "+aiccExtractDataValue(args,"cmi.interactions."+oi+".correct_responses.0.pattern",""));
              //  LMSSetValue("cmi.interactions."+oi+".correct_responses.0.pattern",aiccExtractDataValue(args,"cmi.interactions."+oi+".correct_responses.0.pattern",""));
                
          		//  LMSSetValue("cmi.interactions."+oi+".weighting",aiccExtractDataValue(args,"cmi.interactions."+oi+".weighting","1"));
                
               // alert ("ENVIANDO cmi.interactions."+oi+".learner_response => "+aiccExtractDataValue(args,"cmi.interactions."+oi+".learner_response",""));
          		 // LMSSetValue("cmi.interactions."+oi+".learner_response",aiccExtractDataValue(args,"cmi.interactions."+oi+".learner_response",""));
          		 // LMSSetValue("cmi.interactions."+oi+".result",aiccExtractDataValue(args,"cmi.interactions."+oi+".result","correct"));
              }
          }  // 2
        
        // La plataforma NO ADMINTE Interactions
        // --------------------------------------
        else {
          DebugWrite("No se guardarán Interactions porque la plataforma no lo implementa.");
        }
      }
      // -----------------------------------------------------------------------
      
      /// Score raw
      /// ---------
      if (strSetScore=="1") { 
        LMSSetValue("cmi.score.raw",aiccExtractDataValue(args,"score","0"));
      }
  		
  		/// Time, P[yY][mM][dD][T[hH][mM][s[.s]S]], http://en.wikipedia.org/wiki/ISO_8601
  		/// -----------------------------------------------------------------------------
      if (strNoTime=="1") {
        LMSSetValue("cmi.session_time","PT0H0M0S");
      }
      else {
        LMSSetValue("cmi.session_time",aiccExtractDataValue(args,"time","PT0H0M0S"));
      }
      
      /// Success y Completion Status
      /// ---------------------------
  		if (strCOnStart=="1") {
  		  LMSSetValue("cmi.success_status","passed");
  		  LMSSetValue("cmi.completion_status","completed");
  		}
  		else {
  		  LMSSetValue("cmi.success_status",aiccExtractDataValue(args,"success_status","failed"));
  		  LMSSetValue("cmi.completion_status",aiccExtractDataValue(args,"completion_status","incomplete"));
  		}
  		  
  		/// Resto de valores
  		/// ----------------
  		LMSSetValue("cmi.location",aiccExtractDataValue(args,"location_2004","1"));
  		LMSSetValue("cmi.suspend_data",args.split("[Core_Lesson]")[1]);
  		LMSSetValue("cmi.exit","suspend"); // "logout" / "time-out"
  		LMSCommit();
  		if (fin) LMSFinish();
  	}
}
//------------------------------------------------------------------------------

