Skip to content

Instantly share code, notes, and snippets.

@pipwerks
Created January 13, 2012 04:38
Show Gist options
  • Save pipwerks/1604718 to your computer and use it in GitHub Desktop.
Save pipwerks/1604718 to your computer and use it in GitHub Desktop.
Captivate SCORM 2004 Output, begin cleanup of scorm_support.js
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&param=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name&param=" + 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&param=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name&param=" + 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&param=" + msg + "\"> <PARAM NAME=quality VALUE=high> <PARAM NAME=bgcolor VALUE=#FFFFFF> <EMBED src=\"SCORM_support/scorm_support.swf?invokeMethod=methodToExecute&lc_name=lc_name&param=" + 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