Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Captivate SCORM 2004 Output, cleaned up Captivate_DoExternalInterface
// set document.domain property here, if it works for your environment/SCORM implementation
// document.domain="";
var strURLFile = "sample.swf", // Name of the flash file
flashvars = {},
params = { bgcolor: "#f5f4f1", menu: "false" },
attributes = { id: "Captivate", name: "Captivate" },
CaptivateSWF; //Cache the reference to the SWF to avoid future lookups
function callbackFn(e){
//e.ref is the <object> aka SWF file. No need for getElementById
if(e.success && e.ref){
CaptivateSWF = e.ref;
CaptivateSWF.tabIndex = -1; //Set tabIndex to enable focus on non-form elements
CaptivateSWF.focus();
}
}
//swfobject.embedSWF has a built-in domready call,
//so it doesn't need to be wrapped in a window.onload event.
swfobject.embedSWF(strURLFile + strURLParams, "CaptivateContent", "641", "512", "10", false, flashvars, params, attributes, callbackFn);
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,
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 Finish(){
if(isAPI() && g_bFinishDone == false){
g_objAPI.Commit("");
g_bFinishDone = (g_objAPI.Terminate("") === "true");
}
return g_bFinishDone + ""; // Force type to string
}
function Captivate_DoExternalInterface(command, parameter, value, variable){
var strErr = "true";
// do nothing, if SCORM API is not available
if(!isAPI()){ return; }
if(command === "Initialize"){
CaptivateSWF.SetScormVariable(variable, g_objAPI.Initialize(""));
if(g_objAPI.GetValue("cmi.completion_status") == "not attempted"){
g_objAPI.SetValue("cmi.completion_status", "incomplete");
}
} else if(command === "SetValue"){
strErr = g_objAPI.SetValue(parameter, value);
CaptivateSWF.SetScormVariable(variable, strErr);
} else if(command === "Terminate"){
g_bFinishDone = g_objAPI.Terminate("");
strErr = g_bFinishDone;
CaptivateSWF.SetScormVariable(variable, g_bFinishDone);
} else if(command === "Commit"){
strErr = g_objAPI.Commit("");
CaptivateSWF.SetScormVariable(variable, strErr);
} else if((value) && (value.length > 0)){
if(command === "GetLastError"){
strErr = g_objAPI.GetLastError();
CaptivateSWF.SetScormVariable(variable, strErr);
} else {
strErr = g_objAPI[command](parameter);
CaptivateSWF.SetScormVariable(variable, strErr);
}
}
return strErr;
}
// 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
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.