Skip to content

Instantly share code, notes, and snippets.

@pipwerks
Created January 13, 2012 23:25
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save pipwerks/1609326 to your computer and use it in GitHub Desktop.
Save pipwerks/1609326 to your computer and use it in GitHub Desktop.
Captivate SCORM 2004 Output, replaced findAPI and getAPI code
// 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();
}
}
//Initialize SCORM API
SCORM_API = getAPI();
//Only embed SWF if SCORM API is found
if(SCORM_API){
//swfobject.embedSWF has a built-in domready call,
//so it doesn't need to be wrapped in a window.onload event.
swfobject.embedSWF(strURLFile + "?SCORM_API=1.0&SCORM_TYPE=0", "CaptivateContent", "641", "512", "10", false, flashvars, params, attributes, callbackFn);
} else {
//Provide a useful error message for the learner. Will only show up if SCORM API is not found!
swfobject.addDomLoadEvent(function(){
document.getElementById("CaptivateContent").innerHTML = "Sorry, but the course is not available at this time (SCORM API not found). Please try again. If you continue to encounter problems, please contact the course administrator.";
});
}
<!-- Copyright [2008] Adobe Systems Incorporated. All rights reserved -->
<!-- saved from url=(0013)about:internet -->
<!DOCTYPE HTML>
<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>
<script src="https://ajax.googleapis.com/ajax/libs/swfobject/2.2/swfobject.js"></script>
<script src="standard.js"></script>
<script src="SCORM_support/scorm_support.js"></script>
<script src="captivate.js"></script>
<style>
body { background: #f5f4f1; text-align: center; }
</style>
</head>
<body>
<div id="CaptivateContent"></div>
<noscript>
This course requires JavaScript to be enabled in your browser. Please enable JavaScript, then relaunch the course.
</noscript>
</body>
</html>
var SCORM_API = null,
foundAPI = false,
g_bFinishDone = false;
/* -------------------------------------------------------------------------
findAPI(window)
Adapted from pipwerks SCORM wrapper
https://github.com/pipwerks/scorm-api-wrapper
Looks for an object named API in parent and opener windows
Parameters: window (the browser window object).
Returns: Object if API is found, null if no API found
---------------------------------------------------------------------------- */
var findAPI = function(win){
var API,
findAttempts = 0,
findAttemptLimit = 500;
while (!win.API_1484_11 && win.parent && win.parent != win && findAttempts <= findAttemptLimit){
findAttempts++;
win = win.parent;
}
API = win.API_1484_11 || null;
/*
if(!API){
alert("Error finding API. \nFind attempts: " +findAttempts +". \nFind attempt limit: " +findAttemptLimit);
}
*/
return API;
};
/* -------------------------------------------------------------------------
getAPI()
Adapted from pipwerks SCORM wrapper
https://github.com/pipwerks/scorm-api-wrapper
Looks for an object named API_1484_11, first in the current window's frame
hierarchy and then, if necessary, in the current window's opener window
hierarchy (if there is an opener window).
Parameters: None.
Returns: Object if API found, null if no API found
---------------------------------------------------------------------------- */
var getAPI = function(){
var API = null,
win = window;
//Look in parent windows first
if(win.parent && win.parent != win){
API = findAPI(win.parent);
}
//Look in opener windows next
if(!API && win.top.opener){
API = findAPI(win.top.opener);
}
//Plateau LMS needs special hand-holding
if(!API && win.top.opener && win.top.opener.document) {
API = findAPI(win.top.opener.document);
}
//if(!API){ alert("getAPI failed: Can't find the API!"); }
return API;
};
//Quick way to check if SCORM API is available and communicative
function SCORM_API_Available() {
return (SCORM_API && SCORM_API.GetLastError && typeof SCORM_API.GetLastError() !== "undefined");
}
function Finish(){
if(SCORM_API_Available() && g_bFinishDone == false){
SCORM_API.Commit("");
g_bFinishDone = (SCORM_API.Terminate("") === "true");
}
return g_bFinishDone + ""; // Force type to string
}
function Captivate_DoExternalInterface(command, parameter, value, variable){
var strErr = "true";
//Ensure SCORM API is still available
if(!SCORM_API_Available()){ return; }
if(command === "Initialize"){
CaptivateSWF.SetScormVariable(variable, SCORM_API.Initialize(""));
if(SCORM_API.GetValue("cmi.completion_status") == "not attempted"){
SCORM_API.SetValue("cmi.completion_status", "incomplete");
}
} else if(command === "SetValue"){
strErr = SCORM_API.SetValue(parameter, value);
CaptivateSWF.SetScormVariable(variable, strErr);
} else if(command === "Terminate"){
g_bFinishDone = SCORM_API.Terminate("");
strErr = g_bFinishDone;
CaptivateSWF.SetScormVariable(variable, g_bFinishDone);
} else if(command === "Commit"){
strErr = SCORM_API.Commit("");
CaptivateSWF.SetScormVariable(variable, strErr);
} else if((value) && (value.length > 0)){
if(command === "GetLastError"){
strErr = SCORM_API.GetLastError();
CaptivateSWF.SetScormVariable(variable, strErr);
} else {
strErr = SCORM_API[command](parameter);
CaptivateSWF.SetScormVariable(variable, strErr);
}
}
return strErr;
}
window.onunload = Finish;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment