]> _ Git - fluidbook-html5.git/commitdiff
Merge branch 'master' into scorm2004
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Fri, 25 May 2018 15:22:46 +0000 (17:22 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Fri, 25 May 2018 15:22:46 +0000 (17:22 +0200)
# Conflicts:
# js/libs/scorm/scorm.js

1  2 
js/libs/scorm/scorm.js

index c9ec652fe11b9c45bc56c06b44ae1e7aa5baaeac,29ce4c96184a9fa102fc16e0bf9b89d482c77024..635664c97c045a5018825d16dba7a36b1cf7b136
--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';
 +}