Created
January 13, 2012 23:46
-
-
Save pipwerks/1609395 to your computer and use it in GitHub Desktop.
Captivate SCORM 2004 Output, replaced unload handler
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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."; | |
}); | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var SCORM_API = null, | |
unloaded = false, | |
isTerminated = false, | |
courseStatus; | |
/* ------------------------------------------------------------------------- | |
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 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("")); | |
courseStatus = SCORM_API.GetValue("cmi.completion_status"); | |
if(courseStatus === "not attempted"){ | |
SCORM_API.SetValue("cmi.completion_status", "incomplete"); | |
} | |
} else if(command === "SetValue"){ | |
strErr = SCORM_API.SetValue(parameter, value); | |
CaptivateSWF.SetScormVariable(variable, strErr); | |
if(parameter === "completion_status"){ | |
courseStatus = value; | |
} | |
} else if(command === "Terminate"){ | |
strErr = SCORM_API.Terminate(""); | |
CaptivateSWF.SetScormVariable(variable, strErr); | |
isTerminated = (strErr === "true"); | |
} 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; | |
} | |
function unloadHandler(){ | |
if(!unloaded && SCORM_API_Available() && !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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment