Skip to content

Instantly share code, notes, and snippets.

@pipwerks
Created January 13, 2012 22:58
Show Gist options
  • Save pipwerks/1609223 to your computer and use it in GitHub Desktop.
Save pipwerks/1609223 to your computer and use it in GitHub Desktop.
Captivate SCORM 2004 Output, removed getAPI timer, only embed SWF if API found
// 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);
}
<!-- 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">&nbsp;</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,
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_bFinishDone = false,
g_intAPIOrder = 0; // Way to search for API object (0 - starts with bottom up; 1 - starts top down)
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){
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
}
return objAPI;
}
function setAPI() {
while(SCORM_API == undefined){
SCORM_API = getAPI(0);
}
}
function isAPI() {
return typeof SCORM_API !== "undefined" && SCORM_API != null;
}
function Finish(){
if(isAPI() && 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";
// do nothing, if SCORM API is not available
if(!isAPI()){ 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