\r
=============================================================== */\r
\r
-\r
var pipwerks = {}; //pipwerks 'namespace' helps ensure no conflicts with possible other "SCORM" variables\r
pipwerks.UTILS = {}; //For holding UTILS functions\r
pipwerks.debug = {isActive: true}; //Enable (true) or disable (false) for debug mode\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.API.find = function (win) {\r
-\r
var API = null,\r
findAttempts = 0,\r
findAttemptLimit = 500,\r
trace = pipwerks.UTILS.trace,\r
scorm = pipwerks.SCORM;\r
\r
- while ((!win.API && !win.API_1484_11) &&\r
- (win.parent) &&\r
- (win.parent != win) &&\r
- (findAttempts <= findAttemptLimit)) {\r
-\r
+ while (\r
+ (!win.API && !win.API_1484_11) &&\r
+ (win.parent) &&\r
+ (win.parent != win) &&\r
+ (findAttempts <= findAttemptLimit)\r
+ ) {\r
findAttempts++;\r
win = win.parent;\r
-\r
}\r
\r
//If SCORM version is specified by user, look for specific API\r
if (scorm.version) {\r
-\r
switch (scorm.version) {\r
-\r
case "2004" :\r
-\r
if (win.API_1484_11) {\r
-\r
API = win.API_1484_11;\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": SCORM version 2004 was specified by user, but API_1484_11 cannot be found.");\r
-\r
}\r
-\r
break;\r
-\r
case "1.2" :\r
-\r
if (win.API) {\r
-\r
API = win.API;\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": SCORM version 1.2 was specified by user, but API cannot be found.");\r
-\r
}\r
-\r
break;\r
-\r
}\r
-\r
} else { //If SCORM version not specified by user, look for APIs\r
-\r
if (win.API_1484_11) { //SCORM 2004-specific API.\r
-\r
scorm.version = "2004"; //Set version\r
API = win.API_1484_11;\r
-\r
} else if (win.API) { //SCORM 1.2-specific API\r
-\r
scorm.version = "1.2"; //Set version\r
API = win.API;\r
-\r
}\r
-\r
}\r
\r
if (API) {\r
-\r
trace(traceMsgPrefix + ": API found. Version: " + scorm.version);\r
trace("API: " + API);\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": Error finding API. \nFind attempts: " + findAttempts + ". \nFind attempt limit: " + findAttemptLimit);\r
-\r
}\r
\r
return API;\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.API.get = function () {\r
-\r
var API = null,\r
win = window,\r
scorm = pipwerks.SCORM,\r
}\r
\r
return API;\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.API.getHandle = function () {\r
-\r
var API = pipwerks.SCORM.API;\r
\r
if (!API.handle && !API.isFound) {\r
-\r
API.handle = API.get();\r
-\r
}\r
-\r
return API.handle;\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.connection.initialize = function () {\r
-\r
var success = false,\r
scorm = pipwerks.SCORM,\r
completionStatus = scorm.data.completionStatus,\r
trace("connection.initialize called.");\r
\r
if (!scorm.connection.isActive) {\r
-\r
var API = scorm.API.getHandle(),\r
errorCode = 0;\r
\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
success = makeBoolean(API.LMSInitialize(""));\r
}\r
\r
if (success) {\r
-\r
//Double-check that connection is active and working before returning 'true' boolean\r
errorCode = debug.getCode();\r
-\r
if (errorCode !== null && errorCode === 0) {\r
-\r
scorm.connection.isActive = true;\r
-\r
if (scorm.handleCompletionStatus) {\r
-\r
//Automatically set new launches to incomplete\r
completionStatus = scorm.status("get");\r
-\r
if (completionStatus) {\r
-\r
switch (completionStatus) {\r
-\r
//Both SCORM 1.2 and 2004\r
case "not attempted":\r
scorm.status("set", "incomplete");\r
scorm.set('cmi.success_status', 'unknown');\r
break;\r
-\r
//SCORM 2004 only\r
case "unknown" :\r
scorm.status("set", "incomplete");\r
scorm.set('cmi.success_status', 'unknown');\r
break;\r
-\r
//Additional options, presented here in case you'd like to use them\r
//case "completed" : break;\r
//case "incomplete" : break;\r
//case "passed" : break; //SCORM 1.2 only\r
//case "failed" : break; //SCORM 1.2 only\r
//case "browsed" : break; //SCORM 1.2 only\r
-\r
}\r
-\r
//Commit changes\r
scorm.save();\r
-\r
}\r
-\r
}\r
-\r
} else {\r
-\r
success = false;\r
trace(traceMsgPrefix + "failed. \nError code: " + errorCode + " \nError info: " + debug.getInfo(errorCode));\r
-\r
}\r
-\r
} else {\r
-\r
errorCode = debug.getCode();\r
\r
if (errorCode !== null && errorCode !== 0) {\r
-\r
trace(traceMsgPrefix + "failed. \nError code: " + errorCode + " \nError info: " + debug.getInfo(errorCode));\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: No response from server.");\r
-\r
}\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API is null.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "aborted: Connection already active.");\r
\r
}\r
-\r
return success;\r
\r
};\r
\r
\r
if (scorm.connection.isActive) {\r
-\r
var API = scorm.API.getHandle(),\r
errorCode = 0;\r
\r
if (API) {\r
-\r
if (scorm.handleExitMode && !exitStatus) {\r
-\r
if (completionStatus !== "completed" && completionStatus !== "passed") {\r
switch (scorm.version) {\r
case "1.2" :\r
success = scorm.set("cmi.exit", "suspend");\r
break;\r
}\r
-\r
} else {\r
switch (scorm.version) {\r
case "1.2" :\r
- success = scorm.set("cmi.core.exit", "logout");\r
+ success = scorm.set("cmi.core.exit", "suspend");\r
break;\r
case "2004":\r
- success = scorm.set("cmi.exit", "normal");\r
+ success = scorm.set("cmi.exit", "suspend");\r
break;\r
}\r
-\r
}\r
-\r
}\r
\r
//Ensure we persist the data\r
success = scorm.save();\r
\r
if (success) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
success = makeBoolean(API.LMSFinish(""));\r
}\r
\r
if (success) {\r
-\r
scorm.connection.isActive = false;\r
-\r
} else {\r
-\r
errorCode = debug.getCode();\r
trace(traceMsgPrefix + "failed. \nError code: " + errorCode + " \nError info: " + debug.getInfo(errorCode));\r
-\r
}\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API is null.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "aborted: Connection already terminated.");\r
-\r
}\r
-\r
return success;\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.data.get = function (parameter) {\r
-\r
var value = null,\r
scorm = pipwerks.SCORM,\r
trace = pipwerks.UTILS.trace,\r
traceMsgPrefix = "SCORM.data.get('" + parameter + "') ";\r
\r
if (scorm.connection.isActive) {\r
-\r
var API = scorm.API.getHandle(),\r
errorCode = 0;\r
\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
value = API.LMSGetValue(parameter);\r
value = API.GetValue(parameter);\r
break;\r
}\r
-\r
errorCode = debug.getCode();\r
\r
//GetValue returns an empty string on errors\r
//If value is an empty string, check errorCode to make sure there are no errors\r
if (value !== "" || errorCode === 0) {\r
-\r
//GetValue is successful.\r
//If parameter is lesson_status/completion_status or exit status, let's\r
//grab the value and cache it so we can check it during connection.terminate()\r
switch (parameter) {\r
-\r
case "cmi.core.lesson_status":\r
case "cmi.completion_status" :\r
scorm.data.completionStatus = value;\r
break;\r
-\r
case "cmi.core.exit":\r
case "cmi.exit" :\r
scorm.data.exitStatus = value;\r
break;\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed. \nError code: " + errorCode + "\nError info: " + debug.getInfo(errorCode));\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API is null.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API connection is inactive.");\r
-\r
}\r
-\r
trace(traceMsgPrefix + " value: " + value);\r
-\r
return String(value);\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.data.set = function (parameter, value) {\r
-\r
var success = false,\r
scorm = pipwerks.SCORM,\r
trace = pipwerks.UTILS.trace,\r
\r
\r
if (scorm.connection.isActive) {\r
-\r
var API = scorm.API.getHandle(),\r
errorCode = 0;\r
\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
success = makeBoolean(API.LMSSetValue(parameter, value));\r
}\r
\r
if (success) {\r
-\r
if (parameter === "cmi.core.lesson_status" || parameter === "cmi.completion_status") {\r
-\r
scorm.data.completionStatus = value;\r
-\r
+ }else if(parameter=='cmi.core.exit' || parameter=='cmi.exit'){\r
+ scorm.data.exitStatus = value;\r
}\r
-\r
} else {\r
-\r
errorCode = debug.getCode();\r
-\r
trace(traceMsgPrefix + "failed. \nError code: " + errorCode + ". \nError info: " + debug.getInfo(errorCode));\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API is null.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + "failed: API connection is inactive.");\r
-\r
}\r
-\r
trace(traceMsgPrefix + " value: " + value);\r
-\r
return success;\r
-\r
};\r
\r
\r
\r
\r
if (scorm.connection.isActive) {\r
-\r
var API = scorm.API.getHandle();\r
-\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
success = makeBoolean(API.LMSCommit(""));\r
success = makeBoolean(API.Commit(""));\r
break;\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": API is null.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": API connection is inactive.");\r
-\r
}\r
\r
return success;\r
\r
\r
pipwerks.SCORM.status = function (action, status) {\r
-\r
var success = false,\r
scorm = pipwerks.SCORM,\r
trace = pipwerks.UTILS.trace,\r
cmi = "";\r
\r
if (action !== null) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
cmi = "cmi.core.lesson_status";\r
}\r
\r
switch (action) {\r
-\r
case "get":\r
success = scorm.data.get(cmi);\r
break;\r
-\r
case "set":\r
if (status !== null) {\r
-\r
success = scorm.data.set(cmi, status);\r
-\r
} else {\r
-\r
success = false;\r
trace(traceMsgPrefix + ": status was not specified.");\r
-\r
}\r
-\r
break;\r
-\r
default :\r
success = false;\r
trace(traceMsgPrefix + ": no valid action was specified.");\r
-\r
}\r
-\r
} else {\r
-\r
trace(traceMsgPrefix + ": action was not specified.");\r
-\r
}\r
\r
return success;\r
code = 0;\r
\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
code = parseInt(API.LMSGetLastError(), 10);\r
code = parseInt(API.GetLastError(), 10);\r
break;\r
}\r
-\r
} else {\r
-\r
trace("SCORM.debug.getCode failed: API is null.");\r
-\r
}\r
\r
return code;\r
-\r
};\r
\r
\r
----------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.debug.getInfo = function (errorCode) {\r
-\r
var scorm = pipwerks.SCORM,\r
API = scorm.API.getHandle(),\r
trace = pipwerks.UTILS.trace,\r
result = "";\r
\r
-\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
result = API.LMSGetErrorString(errorCode.toString());\r
result = API.GetErrorString(errorCode.toString());\r
break;\r
}\r
-\r
} else {\r
-\r
trace("SCORM.debug.getInfo failed: API is null.");\r
-\r
}\r
-\r
return String(result);\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.SCORM.debug.getDiagnosticInfo = function (errorCode) {\r
-\r
var scorm = pipwerks.SCORM,\r
API = scorm.API.getHandle(),\r
trace = pipwerks.UTILS.trace,\r
result = "";\r
\r
if (API) {\r
-\r
switch (scorm.version) {\r
case "1.2" :\r
result = API.LMSGetDiagnostic(errorCode);\r
result = API.GetDiagnostic(errorCode);\r
break;\r
}\r
-\r
} else {\r
-\r
trace("SCORM.debug.getDiagnosticInfo failed: API is null.");\r
-\r
}\r
\r
return String(result);\r
-\r
};\r
\r
\r
---------------------------------------------------------------------------- */\r
\r
pipwerks.UTILS.trace = function (msg) {\r
-\r
if (pipwerks.debug.isActive) {\r
-\r
if (window.console && window.console.log) {\r
window.console.log(msg);\r
} else {\r
//alert(msg);\r
}\r
-\r
}\r
};\r