public
Created

Captivate SCORM 2004 Output, created CONFIG object

  • Download Gist
sample.htm
HTML
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
 
<!-- 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>@MOVIETITLE</title>
<script>
 
// set document.domain property here, if it works for your environment/SCORM implementation
// document.domain="";
 
var CONFIG = {
TITLE = "@MOVIETITLE",
FILEPATH = "@MOVIENAME",
BGCOLOR = "@SKINCOLOR",
FPVERSION = "@FlashPlayerVersion",
WIDTH = "@MOVIEWIDTH",
HEIGHT = "@MOVIEHEIGHT",
WMODE = "@WMODEVALUE",
TARGET = "CaptivateContent",
NOSCORM = "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."
},
flashvars = {},
params = { bgcolor: CONFIG.BGCOLOR, menu: "false" },
attributes = { id: "Captivate", name: "Captivate" };
 
</script>
<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>
<style>
body { text-align: center; background: @SKINCOLOR }
</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>
scorm_support.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242
var SCORM_API = null,
unloaded = false,
isInitialized = false,
isTerminated = false,
courseStatus,
value_store = [],
lastCommand,
setValueWasSuccessful = true,
CaptivateSWF; //Cache the reference to the SWF to avoid future lookups
 
 
/*
cmiCache(property, value)
Caches CMI value to help prevent sending duplicate data to LMS
 
Parameters: property (CMI property name), value (CMI value, normally a string)
Returns: property value if cached version found, false if not cached.
*/
 
var cmiCache = function(property, value){
 
//Ensure we have a valid property to work with
if(typeof property === "undefined"){ return false; }
 
//Replace all periods in CMI property names so we don't run into JS errors
property = property.replace(/\./g,'_');
 
//If cached value exists, return it
if(typeof value_store[property] !== "undefined"){
return value_store[property];
}
 
//Otherwise add to cache
if(typeof value !== "undefined"){
value_store[property] = value;
}
 
return 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.document) {
API = findAPI(win.top.opener.document);
}
 
//if(!API){ alert("getAPI failed: Can't find the API!"); }
 
return API;
 
};
 
 
var Captivate_DoExternalInterface = function (command, parameter, value, variable) {
 
console.log("Captivate_DoExternalInterface: " +command +", " +parameter +", " +value);
 
var strErr = "true",
intercept = false;
 
//Ensure SCORM API was initialized
if(!isInitialized){ return; }
 
if(command === "Initialize"){
 
//We already initialized, just nod politely
//and tell the SWF everything is okay!
 
} else if(command === "SetValue"){
 
if(parameter === "completion_status"){ courseStatus = value; }
 
//Check to see if value is already cached
var cached_value = cmiCache(parameter, value);
 
//Only send value to LMS if it hasn't already been sent;
//If value is cached and matches what is about to be sent
//to the LMS, prevent value from being sent a second time.
if(!cached_value || cached_value !== value){
console.log(parameter +"(" +value +") is not cached. Sending to LMS.");
strErr = SCORM_API.SetValue(parameter, value);
setValueWasSuccessful = (strErr === "true");
} else {
console.log(parameter +"(" +value +") has already been sent. Preventing redundant LMS communication.");
//Fakin' it for Captivate's sake.
setValueWasSuccessful = true;
}
 
} else if(command === "Terminate"){
 
strErr = SCORM_API.Terminate("");
isTerminated = (strErr === "true");
 
} else if(command === "Commit"){
 
strErr = SCORM_API.Commit("");
 
} else if(command === "GetLastError"){
 
if(lastCommand === "SetValue" && setValueWasSuccessful){
strErr = "";
console.log("Last Get/Set was successful. Preventing pointless GetLastError invocation.");
} else {
strErr = SCORM_API.GetLastError();
}
 
} else if(value && value.length > 0){
 
strErr = SCORM_API[command](parameter);
 
}
 
CaptivateSWF.SetScormVariable(variable, strErr);
 
lastCommand = command;
 
return strErr;
 
};
 
 
var initializeSCORM = function (){
 
isInitialized = SCORM_API.Initialize("");
 
if(isInitialized){
 
console.log("SCORM initialized. Ready to go!");
courseStatus = SCORM_API.GetValue("cmi.completion_status");
 
if(courseStatus === "not attempted"){
SCORM_API.SetValue("cmi.completion_status", "incomplete");
}
 
}
 
};
 
//Used by SWFObject
var callbackFn = function (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();
 
//Initialze the SCORM API, don't wait for the SWF to do it.
initializeSCORM();
}
};
 
var unloadHandler = function (){
if(!unloaded && isInitialized && !isTerminated){
var exit_status = (courseStatus === "incomplete") ? "suspend" : "normal";
SCORM_API.SetValue("cmi.exit", exit_status); //Set exit to whatever is needed
SCORM_API.Commit(""); //Ensure that LMS saves all data
isTerminated = (SCORM_API.Terminate("") === "true"); //close the SCORM API connection properly
unloaded = true; //Ensure we don't invoke unloadHandler more than once.
}
};
 
window.onbeforeunload = unloadHandler;
window.onunload = unloadHandler;
 
//Initialize SCORM API
SCORM_API = getAPI();
 
//Only embed SWF if SCORM API is found
if(SCORM_API){
 
swfobject.embedSWF(CONFIG.FILEPATH + "?SCORM_API=1.0&SCORM_TYPE=0", CONFIG.TARGET, CONFIG.WIDTH, CONFIG.HEIGHT, CONFIG.FPVERSION, false, flashvars, params, attributes, callbackFn);
 
} else {
 
//Provide a useful error message for the learner. Will only show up if SCORM API is not found!
document.getElementById(CONFIG.TARGET).innerHTML = CONFIG.NOSCORM;
 
}

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.