--SCORM = true;\r
- SCORM_INITED = false;\r
- SCORM_START_TIME = null;\r
- SCORM_INTERACTION_TIMESTAMPS = [];\r
- SCORM_CORRECT_ANSWERS = [];\r
- SCORM_ID_TO_N = {};\r
- SCORM_WEIGHTING = 0;\r
- SCORM_QUESTIONS = [];\r
- SCORM_SUCCESS_STATUS = 'unknown';\r
- SCORM_SUCCESS_SCORE = 0;\r
- \r
- var _CMI12 = {\r
- 'location': 'cmi.core.lesson_location',\r
- 'status': "cmi.core.lesson_status",\r
- 'session_time': 'cmi.core.session_time',\r
- 'success_status': '',\r
- };\r
- \r
- var _CMI2004 = {\r
- 'location': 'cmi.location',\r
- 'status': 'cmi.completion_status',\r
- 'session_time': 'cmi.session_time',\r
- 'success_status': 'cmi.success_status',\r
- }\r
- \r
--$(function () {\r
-- if (fluidbook) {\r
- initScorm();\r
- initScormEvents();\r
-- } else {\r
-- $(document).on('fluidbookready', function () {\r
- initScorm();\r
- initScormEvents();\r
-- });\r
-- }\r
--});\r
- \r
- function initScorm() {\r
- if (SCORM_INITED) {\r
- return;\r
- }\r
- SCORM_INITED = true;\r
- pipwerks.SCORM.init();\r
- startScormTimer();\r
- initScormEvents();\r
- initScormInteractions();\r
- }\r
- \r
- function _cmi(key) {\r
- var res = null;\r
- switch (pipwerks.SCORM.version) {\r
- case "1.2" :\r
- res = _CMI12[key];\r
- break;\r
- case '2004':\r
- res = _CMI2004[key];\r
- break;\r
- }\r
- if (res == undefined || res == null) {\r
- res = key;\r
- }\r
- return res;\r
- }\r
--\r
--function initScormEvents() {\r
- initScorm();\r
- \r
- doLMSInitialize();\r
-- $(window).on('unload', function () {\r
- finishScorm();\r
- doLMSFinish();\r
-- });\r
--\r
- var currentPage = getScormValue('location');\r
- var currentStatus = getScormValue('cmi.core.lesson_status');\r
- if (currentStatus != 'passed' && currentStatus != 'completed') {\r
- setScormValue('cmi.core.lesson_status', 'incomplete');\r
- }\r
-\r
- var currentPage = getScormValue('cmi.core.lesson_location');\r
-- try {\r
-- if (currentPage != '') {\r
-- var e = currentPage.split('_');\r
-- if (e.length == 2 && e[0] == 'page') {\r
-- fluidbook.setCurrentPage(e[1]);\r
-- }\r
-- }\r
-- } catch (err) {\r
- console.log(err);\r
- fb(err);\r
-- }\r
--\r
-- $(fluidbook).on('changePage', function (e, page) {\r
- setScormValue('location', 'page_' + page);\r
- setScormValue('cmi.core.lesson_location', 'page_' + page);\r
- doLMSCommit();\r
-- });\r
- }\r
- \r
- function finishScorm() {\r
- setSessionTime();\r
- pipwerks.SCORM.quit();\r
- }\r
- \r
- function startScormTimer() {\r
- SCORM_START_TIME = new Date();\r
--}\r
--\r
--function scormComplete() {\r
- setScormValue('status', "completed");\r
- window.close();\r
- finishScorm();\r
- setScormValue("cmi.core.lesson_status", "completed");\r
- //window.open(location, '_self').close(); // IE 11 confirmation dialog bypass\r
- top.close(); // This should work better for IE and in contexts where window isn't available\r
- doLMSFinish();\r
--}\r
--\r
--function getScormValue(elementName) {\r
- var cmi = _cmi(elementName);\r
- if (cmi == '') {\r
- return null;\r
- }\r
- var result = pipwerks.SCORM.get(cmi);\r
- var result = String(doLMSGetValue(elementName));\r
-- return result;\r
--}\r
--\r
--function setScormValue(elementName, value) {\r
- var cmi = _cmi(elementName);\r
- if (cmi == '') {\r
- return false;\r
- }\r
- var result = pipwerks.SCORM.set(cmi, value);\r
- pipwerks.SCORM.save();\r
- var result = doLMSSetValue(elementName, value);\r
- doLMSCommit();\r
-- return result;\r
- }\r
- \r
- function initScormInteractions() {\r
- if (fluidbook.datas.scorm_quizdata === '') {\r
- return;\r
- }\r
- var n = 0;\r
- for (var sheet in fluidbook.datas.scorm_quizdata) {\r
- var s = fluidbook.datas.scorm_quizdata[sheet];\r
- for (var l in s) {\r
- if (l == 0) {\r
- continue;\r
- }\r
- var line = s[l];\r
- if (line[1] === null || line[1] === '') {\r
- continue;\r
- }\r
- defineScormInteraction(n, line[0], line[2], line[1], line[3], parseFloat(line[4]));\r
- n++;\r
- }\r
- }\r
- if (SCORM_WEIGHTING > 0) {\r
- pipwerks.SCORM.set('cmi.score.min', '0');\r
- pipwerks.SCORM.set('cmi.score.max', SCORM_WEIGHTING);\r
- SCORM_SUCCESS_SCORE = parseFloat(pipwerks.SCORM.get('cmi.scaled_passing_score'));\r
- \r
- updateInteractionsScore();\r
- }\r
- }\r
- \r
- function defineScormInteraction(number, id, type, question, correct_response, weighting) {\r
- \r
- if (weighting === undefined) {\r
- weighting = 1;\r
- }\r
- if (question === undefined) {\r
- question = '';\r
- }\r
- if (type === undefined) {\r
- type = 'other';\r
- }\r
- if (id === undefined) {\r
- id = 'Q' + number;\r
- }\r
- \r
- SCORM_QUESTIONS[number] = {\r
- id: id,\r
- question: question,\r
- type: type,\r
- correct_response: correct_response,\r
- weighting: weighting,\r
- timestamp: null,\r
- result: false\r
- };\r
- SCORM_ID_TO_N[id] = number;\r
- \r
- setScormValue('cmi.interactions.' + number + '.id', id);\r
- setScormValue('cmi.interactions.' + number + '.description', question);\r
- setScormValue('cmi.interactions.' + number + '.type', type);\r
- setScormValue('cmi.interactions.' + number + '.correct_responses.0.pattern', correct_response);\r
- setScormValue('cmi.interactions.' + number + '.weighting', weighting);\r
- \r
- SCORM_WEIGHTING += weighting;\r
- }\r
- \r
- function getLearnerResponseById(id) {\r
- return getScormValue('cmi.interactions.' + scormIdToN(id) + '.learner_response');\r
- }\r
- \r
- function scormIdToN(id) {\r
- return SCORM_ID_TO_N[id];\r
- }\r
- \r
- function displayScormInteraction(id) {\r
- var n = scormIdToN(id);\r
- var now = new Date();\r
- if (SCORM_QUESTIONS[n].timestamp !== null) {\r
- return;\r
- }\r
- SCORM_QUESTIONS[n].timestamp = now;\r
- setScormValue('cmi.interactions.' + n + '.timestamp', dateToScormTime(now));\r
- }\r
- \r
- function answerScormInteraction(id, learner_response, result, set_latency) {\r
- var n = scormIdToN(id);\r
- var currentTime = Math.round(new Date().getTime() / 1000);\r
- var latency = getScormTimeInterval(SCORM_QUESTIONS[n].timestamp, new Date());\r
- if (result === undefined) {\r
- result = (learner_response === SCORM_QUESTIONS[n].correct_response);\r
- }\r
- \r
- setScormValue('cmi.interactions.' + n + '.result', result ? 'correct' : 'incorrect');\r
- setScormValue('cmi.interactions.' + n + '.learner_response', learner_response);\r
- setScormValue('cmi.interactions.' + n + '.latency', latency);\r
- \r
- updateInteractionsScore();\r
- }\r
- \r
- function updateInteractionsScore() {\r
- var score = 0;\r
- var answered = 0;\r
- $.each(SCORM_QUESTIONS, function (n, q) {\r
- var r = getScormValue('cmi.interactions.' + n + '.result');\r
- if (r == '') {\r
- return;\r
- }\r
- answered++;\r
- if (r == 'correct') {\r
- score += q.weighting;\r
- }\r
- });\r
- \r
- var scaled = score / SCORM_WEIGHTING;\r
- \r
- setScormValue('cmi.score.raw', score);\r
- setScormValue('cmi.score.scaled', scaled);\r
- var status = 'unknown'\r
- if (answered > 0) {\r
- if (scaled >= SCORM_SUCCESS_SCORE) {\r
- status = 'passed';\r
- } else {\r
- status = 'failed';\r
- }\r
- }\r
- setScormValue('cmi.success_status', status);\r
- }\r
- \r
- function setSessionTime() {\r
- var currentTime = new Date();\r
- var sessionTime;\r
- \r
- var endTime = currentTime.getTime()\r
- var calculatedTime = endTime - SCORM_START_TIME;\r
- \r
- if (pipwerks.SCORM.version == '1.2') {\r
- var totalHours = Math.floor(calculatedTime / 1000 / 60 / 60);\r
- calculatedTime = calculatedTime - totalHours * 1000 * 60 * 60\r
- if (totalHours < 1000 && totalHours > 99) {\r
- totalHours = "0" + totalHours;\r
- } else if (totalHours < 100 && totalHours > 9) {\r
- totalHours = "00" + totalHours;\r
- } else if (totalHours < 10) {\r
- totalHours = "000" + totalHours;\r
- }\r
- \r
- var totalMinutes = Math.floor(calculatedTime / 1000 / 60);\r
- calculatedTime = calculatedTime - totalMinutes * 1000 * 60;\r
- if (totalMinutes < 10) {\r
- totalMinutes = "0" + totalMinutes;\r
- }\r
- \r
- var totalSeconds = Math.floor(calculatedTime / 1000);\r
- if (totalSeconds < 10) {\r
- totalSeconds = "0" + totalSeconds;\r
- }\r
- sessionTime = totalHours + ":" + totalMinutes + ":" + totalSeconds;\r
- } else {\r
- sessionTime = Math.round(calculatedTime / 1000);\r
- }\r
- setScormValue('session_time', sessionTime);\r
- }\r
- \r
- function dateToScormTime(date) {\r
- var res = date.toISOString();\r
- var e = res.split('.');\r
- e.pop();\r
- return res.join('.');\r
--}\r
- \r
- function getScormTimeInterval(start, end) {\r
- var diff = Math.round((end.getTime() - start.getTime()) / 1000);\r
- var h = Math.floor(diff / 3600);\r
- diff = diff % 3600;\r
- var m = Math.floor(diff / 60);\r
- var s = diff % 60;\r
- return 'PT' + h + 'H' + m + 'M' + s + 'S';\r
++SCORM = true;
++SCORM_INITED = false;
++SCORM_START_TIME = null;
++SCORM_INTERACTION_TIMESTAMPS = [];
++SCORM_CORRECT_ANSWERS = [];
++SCORM_ID_TO_N = {};
++SCORM_WEIGHTING = 0;
++SCORM_QUESTIONS = [];
++SCORM_SUCCESS_STATUS = 'unknown';
++SCORM_SUCCESS_SCORE = 0;
++
++var _CMI12 = {
++ 'location': 'cmi.core.lesson_location',
++ 'status': "cmi.core.lesson_status",
++ 'session_time': 'cmi.core.session_time',
++ 'success_status': '',
++};
++
++var _CMI2004 = {
++ 'location': 'cmi.location',
++ 'status': 'cmi.completion_status',
++ 'session_time': 'cmi.session_time',
++ 'success_status': 'cmi.success_status',
++}
++
++$(function () {
++ if (fluidbook) {
++ initScorm();
++ } else {
++ $(document).on('fluidbookready', function () {
++ initScorm();
++ });
++ }
++});
++
++function initScorm() {
++ if (SCORM_INITED) {
++ return;
++ }
++ SCORM_INITED = true;
++ pipwerks.SCORM.init();
++ startScormTimer();
++ initScormEvents();
++ initScormInteractions();
++}
++
++function _cmi(key) {
++ var res = null;
++ switch (pipwerks.SCORM.version) {
++ case "1.2" :
++ res = _CMI12[key];
++ break;
++ case '2004':
++ res = _CMI2004[key];
++ break;
++ }
++ if (res == undefined || res == null) {
++ res = key;
++ }
++ return res;
++}
++
++function initScormEvents() {
++ initScorm();
++
++ $(window).on('unload', function () {
++ finishScorm();
++ });
++
++ var currentPage = getScormValue('location');
++ try {
++ if (currentPage != '') {
++ var e = currentPage.split('_');
++ if (e.length == 2 && e[0] == 'page') {
++ fluidbook.setCurrentPage(e[1]);
++ }
++ }
++ } catch (err) {
++ console.log(err);
++ }
++
++ $(fluidbook).on('changePage', function (e, page) {
++ setScormValue('location', 'page_' + page);
++ });
++}
++
++function finishScorm() {
++ setSessionTime();
++ pipwerks.SCORM.quit();
++}
++
++function startScormTimer() {
++ SCORM_START_TIME = new Date();
++}
++
++function scormComplete() {
++ setScormValue('status', "completed");
++ window.close();
++ finishScorm();
++}
++
++function getScormValue(elementName) {
++ var cmi = _cmi(elementName);
++ if (cmi == '') {
++ return null;
++ }
++ var result = pipwerks.SCORM.get(cmi);
++ return result;
++}
++
++function setScormValue(elementName, value) {
++ var cmi = _cmi(elementName);
++ if (cmi == '') {
++ return false;
++ }
++ var result = pipwerks.SCORM.set(cmi, value);
++ pipwerks.SCORM.save();
++ return result;
++}
++
++function initScormInteractions() {
++ if (fluidbook.datas.scorm_quizdata === '') {
++ return;
++ }
++ var n = 0;
++ for (var sheet in fluidbook.datas.scorm_quizdata) {
++ var s = fluidbook.datas.scorm_quizdata[sheet];
++ for (var l in s) {
++ if (l == 0) {
++ continue;
++ }
++ var line = s[l];
++ if (line[1] === null || line[1] === '') {
++ continue;
++ }
++ defineScormInteraction(n, line[0], line[2], line[1], line[3], parseFloat(line[4]));
++ n++;
++ }
++ }
++ if (SCORM_WEIGHTING > 0) {
++ pipwerks.SCORM.set('cmi.score.min', '0');
++ pipwerks.SCORM.set('cmi.score.max', SCORM_WEIGHTING);
++ SCORM_SUCCESS_SCORE = parseFloat(pipwerks.SCORM.get('cmi.scaled_passing_score'));
++
++ updateInteractionsScore();
++ }
++}
++
++function defineScormInteraction(number, id, type, question, correct_response, weighting) {
++
++ if (weighting === undefined) {
++ weighting = 1;
++ }
++ if (question === undefined) {
++ question = '';
++ }
++ if (type === undefined) {
++ type = 'other';
++ }
++ if (id === undefined) {
++ id = 'Q' + number;
++ }
++
++ SCORM_QUESTIONS[number] = {
++ id: id,
++ question: question,
++ type: type,
++ correct_response: correct_response,
++ weighting: weighting,
++ timestamp: null,
++ result: false
++ };
++ SCORM_ID_TO_N[id] = number;
++
++ setScormValue('cmi.interactions.' + number + '.id', id);
++ setScormValue('cmi.interactions.' + number + '.description', question);
++ setScormValue('cmi.interactions.' + number + '.type', type);
++ setScormValue('cmi.interactions.' + number + '.correct_responses.0.pattern', correct_response);
++ setScormValue('cmi.interactions.' + number + '.weighting', weighting);
++
++ SCORM_WEIGHTING += weighting;
++}
++
++function getLearnerResponseById(id) {
++ return getScormValue('cmi.interactions.' + scormIdToN(id) + '.learner_response');
++}
++
++function scormIdToN(id) {
++ return SCORM_ID_TO_N[id];
++}
++
++function displayScormInteraction(id) {
++ var n = scormIdToN(id);
++ var now = new Date();
++ if (SCORM_QUESTIONS[n].timestamp !== null) {
++ return;
++ }
++ SCORM_QUESTIONS[n].timestamp = now;
++ setScormValue('cmi.interactions.' + n + '.timestamp', dateToScormTime(now));
++}
++
++function answerScormInteraction(id, learner_response, result, set_latency) {
++ var n = scormIdToN(id);
++ var currentTime = Math.round(new Date().getTime() / 1000);
++ var latency = getScormTimeInterval(SCORM_QUESTIONS[n].timestamp, new Date());
++ if (result === undefined) {
++ result = (learner_response === SCORM_QUESTIONS[n].correct_response);
++ }
++
++ setScormValue('cmi.interactions.' + n + '.result', result ? 'correct' : 'incorrect');
++ setScormValue('cmi.interactions.' + n + '.learner_response', learner_response);
++ setScormValue('cmi.interactions.' + n + '.latency', latency);
++
++ updateInteractionsScore();
++}
++
++function updateInteractionsScore() {
++ var score = 0;
++ var answered = 0;
++ $.each(SCORM_QUESTIONS, function (n, q) {
++ var r = getScormValue('cmi.interactions.' + n + '.result');
++ if (r == '') {
++ return;
++ }
++ answered++;
++ if (r == 'correct') {
++ score += q.weighting;
++ }
++ });
++
++ var scaled = score / SCORM_WEIGHTING;
++
++ setScormValue('cmi.score.raw', score);
++ setScormValue('cmi.score.scaled', scaled);
++ var status = 'unknown'
++ if (answered > 0) {
++ if (scaled >= SCORM_SUCCESS_SCORE) {
++ status = 'passed';
++ } else {
++ status = 'failed';
++ }
++ }
++ setScormValue('cmi.success_status', status);
++}
++
++function setSessionTime() {
++ var currentTime = new Date();
++ var sessionTime;
++
++ var endTime = currentTime.getTime()
++ var calculatedTime = endTime - SCORM_START_TIME;
++
++ if (pipwerks.SCORM.version == '1.2') {
++ var totalHours = Math.floor(calculatedTime / 1000 / 60 / 60);
++ calculatedTime = calculatedTime - totalHours * 1000 * 60 * 60
++ if (totalHours < 1000 && totalHours > 99) {
++ totalHours = "0" + totalHours;
++ } else if (totalHours < 100 && totalHours > 9) {
++ totalHours = "00" + totalHours;
++ } else if (totalHours < 10) {
++ totalHours = "000" + totalHours;
++ }
++
++ var totalMinutes = Math.floor(calculatedTime / 1000 / 60);
++ calculatedTime = calculatedTime - totalMinutes * 1000 * 60;
++ if (totalMinutes < 10) {
++ totalMinutes = "0" + totalMinutes;
++ }
++
++ var totalSeconds = Math.floor(calculatedTime / 1000);
++ if (totalSeconds < 10) {
++ totalSeconds = "0" + totalSeconds;
++ }
++ sessionTime = totalHours + ":" + totalMinutes + ":" + totalSeconds;
++ } else {
++ sessionTime = Math.round(calculatedTime / 1000);
++ }
++ setScormValue('session_time', sessionTime);
++}
++
++function dateToScormTime(date) {
++ var res = date.toISOString();
++ var e = res.split('.');
++ e.pop();
++ return res.join('.');
++}
++
++function getScormTimeInterval(start, end) {
++ var diff = Math.round((end.getTime() - start.getTime()) / 1000);
++ var h = Math.floor(diff / 3600);
++ diff = diff % 3600;
++ var m = Math.floor(diff / 60);
++ var s = diff % 60;
++ return 'PT' + h + 'H' + m + 'M' + s + 'S';
+}