|
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; |