var g_objAPI = null, | |
g_nAPI = 0, // type of API to start searching for; allowable values: 0 - SCORM 2004; 1 - SCORM 1.2 (or 1.1) | |
g_aAPI = ["1.0", "0.2"], // Array that stores the API versions | |
g_zAPIVersion = -1, | |
g_bFinishDone = false, | |
g_intAPIType = 0, // Specifies SCORM 2004 | |
strURLFile = "sample.swf", // Name of the flash file | |
intIntervalSecs = 1, // Number of seconds to wait for SCORM API to load | |
g_intAPIOrder = 0, // Way to search for API object (0 - starts with bottom up; 1 - starts top down) | |
strURLParams = ""; | |
timeCurrent_int = new Date().getTime(), | |
timeLimit_int = new Date().getTime() + (intIntervalSecs * 1000); | |
function findAPI(win) { | |
// Search the window hierarchy for an object named "API_1484_11" for SCORM 2004 or "API" for SCORM 1.2 or below | |
// Look in the current window (win) and recursively look in any child frames | |
if(g_nAPI == 0){ | |
if(win.API_1484_11 != null){ | |
return win.API_1484_11; | |
} | |
} else if(g_nAPI == 1 || g_nAPI == "") { | |
if (win.API != null){ | |
g_zAPIVersion = g_aAPI[g_nAPI]; | |
return win.API; | |
} | |
} | |
if (win.length > 0){ // check frames | |
for (var i=0;i<win.length;i++){ | |
var objAPI = findAPI(win.frames[i]); | |
if (objAPI != null){ | |
return objAPI; | |
} | |
} | |
} | |
return null; | |
} | |
function getAPI(intAPISearchOrder) { | |
// intAPISearchOrder is 0 - start at current window and work way up; 1 - start at top window and work way down. | |
var objAPI = null; | |
intAPISearchOrder = (typeof intAPISearchOrder === "undefined") ? 0 : intAPISearchOrder; | |
if(intAPISearchOrder == 0) { | |
// start and the current window and recurse up through parent windows/frames | |
var objCurrentWindow = window, | |
xCount = 0; | |
objAPI = findAPI(objCurrentWindow); | |
while(objCurrentWindow && !objAPI && xCount < 100){ | |
xCount++; | |
if(objCurrentWindow.opener != null && typeof objCurrentWindow.opener !== "undefined"){ | |
objCurrentWindow = objCurrentWindow.opener; | |
} else { | |
objCurrentWindow = objCurrentWindow.parent; | |
} | |
objAPI = findAPI(objCurrentWindow); | |
} | |
if(objAPI == null && g_nAPI < (g_aAPI.length-1)){ | |
g_nAPI++; | |
objAPI = getAPI(intAPISearchOrder); | |
} | |
} else { | |
// start at the top window and recurse down through child frames | |
objAPI = findAPI(this.top); | |
if (objAPI == null){ | |
// the API wasn't found in the current window's hierarchy. If the | |
// current window has an opener (was launched by another window), | |
// check the opener's window hierarchy. | |
objTopWindow=window.top; | |
objTopWindow = objTopWindow.opener; | |
while (objTopWindow && !objAPI){ | |
//checking window opener | |
objAPI = findAPI(objTopWindow.top); | |
if (objAPI==null){ | |
objTopWindow = objTopWindow.opener; | |
} | |
} | |
if(objAPI == null && g_nAPI < (g_aAPI.length-1)){ | |
g_nAPI++; | |
objAPI = getAPI(intAPISearchOrder); | |
} | |
} | |
} | |
if(objAPI == null) { | |
//can't find API | |
} else if(objAPI != null && g_zAPIVersion == -1) { | |
g_zAPIVersion = objAPI.version; | |
} | |
return objAPI; | |
} | |
function setAPI() { | |
while(g_objAPI == undefined){ | |
g_objAPI = getAPI(0); | |
} | |
} | |
function isAPI() { | |
return typeof g_objAPI !== "undefined" && g_objAPI != null; | |
} | |
// called in the outer HTML file | |
// g_objAPI = getAPI(); | |
function dataToFlash(layer, msg) { | |
// set the comm HTML | |
fcomValue = "<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\" WIDTH=\"2\" HEIGHT=\"2\" id=\"scorm_support\" ALIGN=\"\"> <PARAM NAME=movie VALUE=\"scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\" quality=high bgcolor=#FFFFFF WIDTH=\"2\" HEIGHT=\"2\" NAME=\"scorm_support\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"></EMBED> </OBJECT>"; | |
// get the browser info | |
var IE = swfobject.ua.ie, | |
NS4 = (navigator.appName.indexOf("Netscape")!=-1 && parseInt(navigator.appVersion)<5), | |
NS6 = (navigator.appName.indexOf("Netscape")!=-1 && parseInt(navigator.appVersion)>4.9); | |
if (IE){ | |
IE_dynamic.document.body.innerHTML=fcomValue; | |
} | |
if (NS4){ | |
// change the comm HTML | |
fcomValue = "<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\" WIDTH=\"2\" HEIGHT=\"2\" id=\"scorm_support\" ALIGN=\"\"> <PARAM NAME=movie VALUE=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\" quality=high bgcolor=#FFFFFF WIDTH=\"2\" HEIGHT=\"2\" NAME=\"scorm_support\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"></EMBED> </OBJECT>"; | |
eval("var echoecho = document.layers.NS_"+layer+".document;"); | |
echoecho.open(); | |
echoecho.write(fcomValue); | |
echoecho.close(); | |
} | |
if (NS6){ | |
// change the comm HTML | |
fcomValue = "<OBJECT classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" codebase=\"http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0\" WIDTH=\"2\" HEIGHT=\"2\" id=\"scorm_support\" ALIGN=\"\"> <PARAM NAME=movie VALUE=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name¶m=" + msg + "\" quality=high bgcolor=#FFFFFF WIDTH=\"2\" HEIGHT=\"2\" NAME=\"scorm_support\" ALIGN=\"\" TYPE=\"application/x-shockwave-flash\" PLUGINSPAGE=\"http://www.macromedia.com/go/getflashplayer\"></EMBED> </OBJECT>"; | |
document.getElementById("NS_"+layer).innerHTML = fcomValue; | |
} | |
} | |
function dataFromFlash(strSCOfunction, strSCOproperty, varSCOvalue, strFLvariableName) { | |
var varResult = false; | |
if(isAPI()){ | |
if (varSCOvalue != ""){ | |
varResult = g_objAPI[strSCOfunction](strSCOproperty, varSCOvalue); | |
} else { | |
if(strSCOfunction == "LMSGetLastError"){ | |
varResult = g_objAPI[strSCOfunction](); | |
} else { | |
varResult = g_objAPI[strSCOfunction](strSCOproperty); | |
} | |
} | |
} else { | |
if (SCOvalue != ""){ | |
varResult = strSCOfunction(strSCOproperty, varSCOvalue); | |
} else { | |
varResult = strSCOfunction(strSCOproperty); | |
} | |
} | |
if(strSCOfunction == "Terminate"){ | |
// set global variable to result of Finish function | |
g_bFinishDone = varResult; | |
} | |
dataToFlash("dynamic", strFLvariableName + "|" + varResult); | |
} | |
function Finish(){ | |
if(isAPI() && g_bFinishDone == false){ | |
g_objAPI.Commit(""); | |
g_bFinishDone = (g_objAPI.Terminate("") === "true"); | |
} | |
return g_bFinishDone + ""; // Force type to string | |
} | |
// Handle fscommand messages from a Flash movie | |
function Captivate_DoFSCommand(command, args){ | |
var CaptivateObj = document.getElementById("Captivate"), | |
strFSArgs = new String(args), | |
strFSCmd = new String(command), | |
strErr = "true", | |
strFSArg1, | |
strFSArg2, | |
strFSArg3, | |
intFSDelimiter = strFSArgs.indexOf("|"), | |
strFSTemp; | |
if(intFSDelimiter > -1){ | |
strFSArg1 = strFSArgs.substr(0, intFSDelimiter); // Name of data element to get from API | |
strFSTemp = strFSArgs.substr(intFSDelimiter + 1); | |
intFSDelimiter = strFSTemp.indexOf("|"); | |
if(intFSDelimiter > -1){ | |
strFSArg2 = strFSTemp.substr(0, intFSDelimiter); // Value | |
strFSArg3 = strFSTemp.substr(intFSDelimiter + 1); // Variable | |
} else { | |
strFSArg2 = strFSTemp; | |
} | |
} else { | |
strFSArg1 = strFSArgs; | |
} | |
// do nothing, if SCORM API is not available | |
if(!isAPI()){ return; } | |
if(strFSCmd == "Initialize"){ | |
CaptivateObj.SetVariable(strFSArg3, g_objAPI.Initialize("")); | |
} else if(strFSCmd == "SetValue"){ | |
strErr = g_objAPI.SetValue(strFSArg1, strFSArg2); | |
CaptivateObj.SetVariable(strFSArg3, strErr); | |
} else if(strFSCmd == "Terminate"){ | |
g_bFinishDone = g_objAPI.Terminate(""); | |
strErr = g_bFinishDone; | |
CaptivateObj.SetVariable(strFSArg3, g_bFinishDone); | |
} else if(strFSCmd == "Commit"){ | |
strErr = g_objAPI.Commit(""); | |
CaptivateObj.SetVariable(strFSArg3, strErr); | |
} else if(strFSArg2 && (strFSArg2.length > 0)){ | |
if(strFSCmd == "GetLastError"){ | |
strErr = g_objAPI.GetLastError(); | |
CaptivateObj.SetVariable(strFSArg3, strErr); | |
} else { | |
strErr = g_objAPI[strFSCmd](strFSArg1); | |
CaptivateObj.SetVariable(strFSArg3, strErr); | |
} | |
} | |
return strErr; | |
} | |
function Captivate_DoExternalInterface(command, parameter, value, variable){ | |
var CaptivateObj = document.getElementById("Captivate"), | |
strFSCmd = new String(command), | |
strErr = "true", | |
strFSArg1 = parameter, | |
strFSArg2 = value, | |
strFSArg3 = variable, | |
courseStatus; | |
// do nothing, if SCORM API is not available | |
if(!isAPI()){ return; } | |
if(strFSCmd == "Initialize"){ | |
CaptivateObj.SetScormVariable(strFSArg3, g_objAPI.Initialize("")); | |
courseStatus = g_objAPI.GetValue("cmi.completion_status"); | |
if(courseStatus == "not attempted"){ | |
g_objAPI.SetValue("cmi.completion_status", "incomplete"); | |
} | |
} else if(strFSCmd == "SetValue"){ | |
strErr = g_objAPI.SetValue(strFSArg1, strFSArg2); | |
CaptivateObj.SetScormVariable(strFSArg3, strErr); | |
} else if(strFSCmd == "Terminate"){ | |
g_bFinishDone = g_objAPI.Terminate(""); | |
strErr = g_bFinishDone; | |
CaptivateObj.SetScormVariable(strFSArg3, g_bFinishDone); | |
} else if(strFSCmd == "Commit"){ | |
strErr = g_objAPI.Commit(""); | |
CaptivateObj.SetScormVariable(strFSArg3, strErr); | |
} else if((strFSArg2) && (strFSArg2.length > 0)){ | |
if(strFSCmd == "GetLastError"){ | |
strErr = g_objAPI.GetLastError(); | |
CaptivateObj.SetScormVariable(strFSArg3, strErr); | |
} else { | |
strErr = g_objAPI[strFSCmd](strFSArg1); | |
CaptivateObj.SetScormVariable(strFSArg3, strErr); | |
} | |
} | |
return strErr; | |
} | |
// Hook for Internet Explorer | |
if(swfobject.ua.ie){ | |
document.write("<script language=\"VBScript\"\>\n"); | |
document.write("On Error Resume Next\n"); | |
document.write("Sub Captivate_FSCommand(ByVal command, ByVal args)\n"); | |
document.write("Call Captivate_DoFSCommand(command, args)\n"); | |
document.write("End Sub\n"); | |
document.write("</script\>\n"); | |
document.write("<script language=\"VBScript\"\>\n"); | |
document.write("On Error Resume Next\n"); | |
document.write("Sub Captivate_DoExternalInterface(ByVal command, ByVal parameter, ByVal value, ByVal variable)\n"); | |
document.write("Call Captivate_DoExternalInterface(command, parameter, value, variable)\n"); | |
document.write("End Sub\n"); | |
document.write("</script\>\n"); | |
} | |
// This simply loops for a set period of time, waiting for the API to | |
// load and/or be found. A better solution would be to use setInterval | |
// and on the timeout, redirect or load the resulting Captivate file. | |
while(g_objAPI == null && timeCurrent_int < timeLimit_int){ | |
g_objAPI = getAPI(g_intAPIOrder); | |
timeCurrent_int = new Date().getTime(); | |
} | |
//If SCORM connection is active, append the following querystring to the URL | |
if(g_objAPI != null){ | |
strURLParams = "?SCORM_API=" + g_zAPIVersion + "&SCORM_TYPE=0"; | |
} | |
window.onunload = Finish; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment