]> _ Git - fluidbook-html5.git/commitdiff
wip #2207 @4
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 4 Sep 2018 13:26:59 +0000 (15:26 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 4 Sep 2018 13:26:59 +0000 (15:26 +0200)
js/libs/scorm/apiwrapper.js
js/libs/scorm/scorm.js

index 7ad6a797c1fcd96c931ab316629da801ee34c8f7..a0cbd76b22999d6d8544589877e170b15c2b4f2a 100644 (file)
@@ -24,7 +24,6 @@ further modified by Philip Hutchison
 \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
@@ -74,7 +73,6 @@ pipwerks.SCORM.isAvailable = function () {
 ---------------------------------------------------------------------------- */\r
 \r
 pipwerks.SCORM.API.find = function (win) {\r
-\r
     var API = null,\r
         findAttempts = 0,\r
         findAttemptLimit = 500,\r
@@ -82,80 +80,52 @@ pipwerks.SCORM.API.find = function (win) {
         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
@@ -170,7 +140,6 @@ pipwerks.SCORM.API.find = function (win) {
 ---------------------------------------------------------------------------- */\r
 \r
 pipwerks.SCORM.API.get = function () {\r
-\r
     var API = null,\r
         win = window,\r
         scorm = pipwerks.SCORM,\r
@@ -200,7 +169,6 @@ pipwerks.SCORM.API.get = function () {
     }\r
 \r
     return API;\r
-\r
 };\r
 \r
 \r
@@ -213,17 +181,12 @@ pipwerks.SCORM.API.get = function () {
 ---------------------------------------------------------------------------- */\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
@@ -241,7 +204,6 @@ pipwerks.SCORM.API.getHandle = function () {
 ---------------------------------------------------------------------------- */\r
 \r
 pipwerks.SCORM.connection.initialize = function () {\r
-\r
     var success = false,\r
         scorm = pipwerks.SCORM,\r
         completionStatus = scorm.data.completionStatus,\r
@@ -253,12 +215,10 @@ pipwerks.SCORM.connection.initialize = function () {
     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
@@ -269,85 +229,56 @@ pipwerks.SCORM.connection.initialize = function () {
             }\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
@@ -374,14 +305,11 @@ pipwerks.SCORM.connection.terminate = function () {
 \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
@@ -391,26 +319,22 @@ pipwerks.SCORM.connection.terminate = function () {
                             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
@@ -421,32 +345,19 @@ pipwerks.SCORM.connection.terminate = function () {
                 }\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
@@ -464,7 +375,6 @@ pipwerks.SCORM.connection.terminate = function () {
 ---------------------------------------------------------------------------- */\r
 \r
 pipwerks.SCORM.data.get = function (parameter) {\r
-\r
     var value = null,\r
         scorm = pipwerks.SCORM,\r
         trace = pipwerks.UTILS.trace,\r
@@ -472,12 +382,10 @@ pipwerks.SCORM.data.get = function (parameter) {
         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
@@ -486,52 +394,35 @@ pipwerks.SCORM.data.get = function (parameter) {
                     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
@@ -548,7 +439,6 @@ pipwerks.SCORM.data.get = function (parameter) {
 ---------------------------------------------------------------------------- */\r
 \r
 pipwerks.SCORM.data.set = function (parameter, value) {\r
-\r
     var success = false,\r
         scorm = pipwerks.SCORM,\r
         trace = pipwerks.UTILS.trace,\r
@@ -558,12 +448,10 @@ pipwerks.SCORM.data.set = function (parameter, value) {
 \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
@@ -574,37 +462,23 @@ pipwerks.SCORM.data.set = function (parameter, value) {
             }\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
@@ -626,11 +500,8 @@ pipwerks.SCORM.data.save = function () {
 \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
@@ -639,17 +510,11 @@ pipwerks.SCORM.data.save = function () {
                     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
@@ -658,7 +523,6 @@ pipwerks.SCORM.data.save = function () {
 \r
 \r
 pipwerks.SCORM.status = function (action, status) {\r
-\r
     var success = false,\r
         scorm = pipwerks.SCORM,\r
         trace = pipwerks.UTILS.trace,\r
@@ -666,7 +530,6 @@ pipwerks.SCORM.status = function (action, status) {
         cmi = "";\r
 \r
     if (action !== null) {\r
-\r
         switch (scorm.version) {\r
             case "1.2" :\r
                 cmi = "cmi.core.lesson_status";\r
@@ -677,35 +540,23 @@ pipwerks.SCORM.status = function (action, status) {
         }\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
@@ -734,7 +585,6 @@ pipwerks.SCORM.debug.getCode = function () {
         code = 0;\r
 \r
     if (API) {\r
-\r
         switch (scorm.version) {\r
             case "1.2" :\r
                 code = parseInt(API.LMSGetLastError(), 10);\r
@@ -743,15 +593,11 @@ pipwerks.SCORM.debug.getCode = function () {
                 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
@@ -765,15 +611,12 @@ pipwerks.SCORM.debug.getCode = function () {
 ----------------------------------------------------------------------------- */\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
@@ -782,15 +625,10 @@ pipwerks.SCORM.debug.getInfo = function (errorCode) {
                 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
@@ -804,14 +642,12 @@ pipwerks.SCORM.debug.getInfo = function (errorCode) {
 ---------------------------------------------------------------------------- */\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
@@ -820,15 +656,11 @@ pipwerks.SCORM.debug.getDiagnosticInfo = function (errorCode) {
                 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
@@ -889,14 +721,11 @@ pipwerks.UTILS.StringToBoolean = function (value) {
 ---------------------------------------------------------------------------- */\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
index 36c333b259daf39e1b813008722593584f54d656..d7574567e340351fbba36113cc48a2045270d5f2 100644 (file)
@@ -79,12 +79,12 @@ function initScormEvents() {
             }
         } else if (currentLocation.indexOf('{') === 0) {
             var location = JSON.parse(currentLocation);
-            if (location.page) {
-                fluidbook.setCurrentPage(location.page);
-            }
             if (location.maxPage) {
                 fluidbook.setMaxPage(location.maxPage, true);
             }
+            if (location.page) {
+                fluidbook.setCurrentPage(location.page);
+            }
         }
     } catch (err) {
         console.log(err);
@@ -125,9 +125,17 @@ function startScormTimer() {
 }
 
 function scormComplete() {
+    setScormValue('exit', 'suspend');
     setScormValue('status', "completed");
+    if (fluidbook.scorm.manageScore) {
+        setScormValue('success_status', 'passed');
+    }
     finishScorm();
-    window.close();
+    setTimeout(function(){
+        parent.close();
+        top.close();
+        window.close();
+    },1500);
 }
 
 function getScormValue(elementName) {
@@ -279,7 +287,7 @@ function updateInteractionsScore() {
             status = 'failed';
         }
     }
-    setScormValue('cmi.success_status', status);
+    setScormValue('success_status', status);
 }
 
 function setSessionTime() {
@@ -331,6 +339,7 @@ function getScormTimeInterval(start, end) {
 }
 
 function scormSecondsToTimeInterval(diff) {
+    var diff = Math.round(diff);
     var h = Math.floor(diff / 3600);
     diff = diff % 3600;
     var m = Math.floor(diff / 60);