/*
Software Copyright (c) 1985-2013 The Acteon Consultancy LLP
Seminar 7.5.9.1027 DIAMOND
sendDataSource: 0 = User-Finish, 1 = User-Suspend, 2 = Auto-Interim
restartSendData: 0 = Never, 1 = Always, 2 = If better score
*/
var scoCredit = "no-credit";
var scoMasteryScore = 0;
var scoStartupStatus = "";
var scoIsResume = false;
var scoIsRestart = false;
var startedRunComplete = false;
var scormStartupTime = 0;
var sd_Progress = "";
var sd_Random = "";
var sd_Page = "";
var sd_Timer = "";
var sd_SavedDigest = "";
var sd_PageHistory = "";
var sd_QuestionCount = "";
var sd_SWIVariables = "";
var saveRandom = "";
var scormRunning = false;
var maxPeriod = 5;
var maxPageCount = 5;
var commitTimeElapsedStart = 0;
var commitTimeElapsed = 0;
var commitPageCount = 0;
function scormStudentName()
{
return LMSGetValue("cmi.core.student_name");
}
function scormStudentId()
{
return LMSGetValue("cmi.core.student_id");
}
function scormCheckCommit(aPage)
{
var endTime = new Date().getTime();
commitTimeElapsed = Math.round((endTime - commitTimeElapsedStart)/60000);
commitPageCount++;
if(commitTimeElapsed >= maxPeriod || commitPageCount >= maxPageCount)
{
scormSendData(2);
scormResetCommitCounters();
return true;
}
else return false;
}
function scormResetCommitCounters()
{
commitTimeElapsedStart = new Date().getTime();
commitPageCount = 0;
}
function scormLoadCommitMaxima()
{
var launchData = LMSGetValue("cmi.launch_data");
if(launchData)
{
maxPeriod = scormParseArg(launchData,"commitPeriod",5);
maxPageCount = scormParseArg(launchData,"commitPageCount",5);
}
}
function _scormIsResumePure()
{
var scoCoreEntry = LMSGetValue("cmi.core.entry");
if(scoCoreEntry == "resume") return true;
else
{
if(scoCoreEntry == "ab-initio") return false;
else
{
if(scormOldStyleResume) return false
else return _scormIsResumeBookmark();
}
}
}
// CLIX bug(?) work-around version
function _scormIsResumeCLIX()
{
var scoCoreEntry = LMSGetValue("cmi.core.entry");
var scoStatus = LMSGetValue("cmi.core.lesson_status");
if(scoCoreEntry == "ab-initio") return false;
if(scoStatus == "incomplete") return true;
else return false;
}
function _scormIsResumeBookmark()
{
var bm = LMSGetValue("cmi.core.lesson_location");
if(bm) return true
else return false;
}
function scormIsResume()
{
if(scormBookmarkResume) return _scormIsResumeBookmark()
else
{
if(scormCLIXbug) return _scormIsResumeCLIX();
else return _scormIsResumePure();
}
}
function scormIsRestart()
{
if(scoStartupStatus == "completed" || scoStartupStatus == "passed" || scoStartupStatus == "failed") return true;
else return false;
}
function scormCalculatePassmark()
{
scoMasteryScore = LMSGetValue("cmi.student_data.mastery_score"); // global
var lmsError = parseInt(LMSGetLastError(),10);
if(lmsError) return controlWindow.modulePassmark;
scoMasteryScore = parseInt(scoMasteryScore,10);
if(scoMasteryScore >= 0 && scoMasteryScore <= 100) return scoMasteryScore;
return controlWindow.modulePassmark;
}
function scormStartup()
{
deliveryTarget = 1;
if(LMSInitialize())
{
scormRunning = true; // global
scormStartupTime = new Date().getTime(); // global
user.firstName = scormStudentName();
user.additional1 = scormStudentId();
user.signedOn = true;
scormLoadCommitMaxima();
scoCredit = LMSGetValue("cmi.core.credit");
scoStartupStatus = LMSGetValue("cmi.core.lesson_status");
controlWindow.modulePassmark = scormCalculatePassmark();
scoIsRestart = scormIsRestart();
scoIsResume = !scoIsRestart && scormIsResume();
if(scoIsResume) scoIsResume = scormGetSuspendData();
if(scoIsResume)
{
var oldBookmark = LMSGetValue("cmi.core.lesson_location");
if(oldBookmark)
{
startPage = scormReloadBookmark(oldBookmark);
if(startPage) startPage.noHistory = true;
else
{
scormRunning = confirm("Bookmark is not valid\nRun anyway?");
scoIsResume = false;
}
}
};
if(scoIsRestart && scormGetRestartMode(0) == 0) {controlSetModuleComplete();} // free-ride
scormResetCommitCounters();
}
else scormRunning = false;
return scormRunning;
}
function scormShowLog()
{
var log = window.open();
if(log)
{
log.document.write("
");
log.document.write("SCORM comms log
");
log.document.write("This log is produced because the module author chose to
");
log.document.write("to check \"Diagnostic SCORM log\" when exporting ...
");
log.document.write("
This is NOT an LMS or content error.
");
for(var i = 0; i < scormCommLog.length; i++)
{
log.document.write(scormCommLog[i] + "
");
}
log.document.write("");
}
}
function scormCloseDown()
{
if(!scormRunning) return;
if(controlEjecting) scormSendData(1);
else scormSendData(0);
LMSFinish();
if(scormCommLog) scormShowLog();
scormRunning = false;
}
function scormScoreIsBetter()
{
var thisScore = controlGetModuleScore();
var prevScore = parseInt(LMSGetValue("cmi.core.score.raw"));
if(thisScore > prevScore) return true;
else return false;
}
function scormGetRestartMode(sendDataSource)
{
if(moduleAssessment)
{
if(scoStartupStatus == "passed") return scormRestartPass;
else return scormRestartFail;
if(sendDataSource == 2 && restartMode == 2) return 0;
}
else return scormRestartLearning;
}
function scormCheckRestartSendData(sendDataSource)
{
var restartMode = scormGetRestartMode(sendDataSource);
switch(restartMode)
{
case 0: return false;
case 1: return true;
case 2: return scormScoreIsBetter();
}
}
function scormReloadBookmark(oldBookmark)
{
controlWindow.refStack.length = 0;
var oldRefs = oldBookmark.split(";");
var aPage = null;
var ref = "";
var lastRef = "";
for(var i = oldRefs.length - 1; i >= 0; i--)
{
ref = oldRefs[i];
if(ref != lastRef)
{
lastRef = ref;
aPage = controlGetPageByFilename(ref);
if(aPage)
{
controlWindow.refStack.unshift(aPage);
if(!controlWindow.controlPageIsRef(aPage)) break;
}
}
}
aPage = controlWindow.refStack.pop();
return aPage;
}
function scormSetBookmark()
{
var needBookmark = controlGetModuleStatus() == "I";
if(needBookmark)
{
var bookmark = "";
for(var i = 0; i < controlWindow.refStack.length; i++) bookmark += controlWindow.refStack[i].filename + ";";
if(controlEjectedPage) bookmark = bookmark + controlEjectedPage.filename;
else if(currentPage) bookmark = bookmark + currentPage.filename;
LMSSetValue("cmi.core.exit", "suspend");
LMSSetValue("cmi.core.lesson_location",bookmark);
}
else
{
LMSSetValue("cmi.core.lesson_location","");
LMSSetValue("cmi.core.exit", "");
}
}
function scormSendDataAssessment(sendDataSource)
{
var totalScore = controlGetModuleScore();
var moduleStatus = controlGetModuleStatus();
if(moduleStatus == "F" && scormDiscardFail) moduleStatus = "I";
if(moduleStatus == "F" || moduleStatus == "P")
{
LMSSetValue("cmi.core.score.raw", totalScore + "");
LMSSetValue("cmi.core.score.max", "100");
}
LMSSetValue("cmi.core.session_time", scormGetSessionTime());
LMSSetValue("cmi.core.lesson_status", controlExpandModuleStatus(moduleStatus));
}
function scormSendDataLearning(sendDataSource)
{
moduleStatus = controlGetModuleStatus();
LMSSetValue("cmi.core.session_time", scormGetSessionTime());
LMSSetValue("cmi.core.lesson_status", controlExpandModuleStatus(moduleStatus));
}
function scormSendData(sendDataSource)
{
var doSend = true;
if(scormIsRestart()) doSend = scormCheckRestartSendData(sendDataSource);
if(doSend)
{
if(moduleAssessment) scormSendDataAssessment(sendDataSource);
else scormSendDataLearning(sendDataSource);
scormSetBookmark();
scormSeminarSetProgressDetails();
scormSetSuspendData();
LMSCommit("");
}
}
function scormGetAPIHandleEx()
{
if(scormVariant == "seminar") return getAPIHandle();
else return null;
}
function scormSeminarSetProgressDetails()
{
var oAPI = scormGetAPIHandleEx();
if(oAPI)
{
if(oAPI.SeminarSetProgressDetails)
{
var scoreData = controlAssembleScoreData();
oAPI.SeminarSetProgressDetails(scoreData);
}
}
}
function scormPageAfterLoaded(aPage)
{
var oAPI = scormGetAPIHandleEx();
if(oAPI)
{
if(oAPI.SeminarPageAfterLoaded)
{
oAPI.SeminarPageAfterLoaded(aPage.pageID,aPage.filename,aPage.title);
}
}
}
function scormCurrentPageBeforeUnload()
{
if(currentPage) scormPageBeforeUnload(currentPage);
}
function scormPageBeforeUnload(aPage)
{
var oAPI = scormGetAPIHandleEx();
if(oAPI)
{
if(oAPI.SeminarPageBeforeUnload)
{
oAPI.SeminarPageBeforeUnload(aPage.pageID,aPage.filename,aPage.title);
}
}
}
function scormQueryPageChange()
{
var oAPI = scormGetAPIHandleEx();
var rr = "true";
if(oAPI)
{
if(oAPI.SeminarQueryPageChange)
{
rr = oAPI.SeminarQueryPageChange();
}
}
return rr;
}
function scormFormatSessionTime(elapsedSeconds)
{
var sep = "";
var s = "";
var t = elapsedSeconds;
for (var i = 0; i < 3; i++)
{
var t1 = t%60;
s = (t1<10? '0':'') + t1 + sep + s;
sep = ":";
t = Math.floor(t/60);
}
return "00" + s + ".00";
}
function scormGetSessionTime()
{
var endTime = new Date().getTime();
var elapsedSeconds = Math.round((endTime - scormStartupTime)/1000);
return scormFormatSessionTime(elapsedSeconds);
}
function scormGetSuspendData()
{
var suspendDataStr = unescape(LMSGetValue("cmi.suspend_data"));
if(suspendDataStr)
{
var data = suspendDataStr.split("\f");
if(data.length > 0) sd_Progress = data[0];
else sd_Progress = "";
if(data.length > 1) sd_Random = data[1];
else sd_Random = "";
if(data.length > 2) sd_Page = data[2];
else sd_Page = "";
if(data.length > 3) sd_Timer = data[3];
else sd_Timer = "";
if(data.length > 4) sd_SavedDigest = data[4];
else sd_SavedDigest = "";
if(data.length > 5) sd_PageHistory = data[5];
else sd_PageHistory = "";
if(data.length > 6) sd_QuestionCount = data[6];
else sd_QuestionCount = "0";
if(data.length > 7) sd_SWIVariables = data[7];
else sd_SWIVariables = "";
if(!sd_SavedDigest || sd_SavedDigest == controlWindow.moduleStructureDigest)
{
saveRandom = sd_Random;
scormLoadPageSuspendData();
scormLoadTimer();
scormLoadPageHistory();
controlWindow.controlQuestionNumber = parseInt(sd_QuestionCount,10);
SWI.setAllVariables(sd_SWIVariables,true);
return true;
}
else return false;
}
else return false;
}
function scormGetProgress()
{
var a = 0;
var b = 0;
for(var i = 0; i < sections.length; i++)
{
var aSection = sections[i];
if(aSection.runMode == 1 || aSection.runMode == 2)
{
for(var p = 0; p < aSection.pages.length; p++)
{
var aPage = aSection.pages[p];
if(aPage.isQuestionCount)
{
a++;
if(aPage.attempted) b++;
}
}
}
else
{
for(var p = 0; p < aSection.pages.length; p++)
{
var aPage = aSection.pages[p];
if(!aPage.conditionType)
{
a++;
if(aPage.loaded) b++;
}
}
}
}
if(a) return Math.round((b/a) * 100);
else return 0;
}
function scormCalcSetProgress()
{
var percent = scormGetProgress();
sd_Progress = "seminarProgress=" + percent;
}
function scormSetSuspendData()
{
var data = new Array();
scormCalcSetProgress();
scormSavePageSuspendData();
scormSaveTimer();
scormSavePageHistory();
sd_QuestionCount = controlWindow.controlQuestionNumber + "";
sd_SWIVariables = SWI.getAllVariables();
data.push(sd_Random,sd_Page,sd_Timer,controlWindow.moduleStructureDigest,sd_PageHistory,sd_QuestionCount,sd_SWIVariables);
var dataStr = escape(data.join("\f"));
dataStr = sd_Progress + escape("\f") + dataStr;
LMSSetValue("cmi.suspend_data", dataStr);
}
function scormD2B(d)
{
if(d == 1) return true;
else return false;
}
function scormB2D(b)
{
if(b) return 1;
else return 0;
}
function scormReloadFinishingPosts()
{
controlWindow.controlSCORMreloading = true;
for(var sectionIndex = 0; sectionIndex < controlWindow.sections.length; sectionIndex++)
{
var section = controlWindow.sections[sectionIndex];
for(var pageIndex = 0; pageIndex < section.pages.length; pageIndex++)
{
var page = section.pages[pageIndex];
if(page.loaded) controlDoFinishingPost(page);
}
}
controlWindow.controlSCORMreloading = false;
}
function unprotectStr(r)
{
r = r.replace("[tb]","\t");
r = r.replace("[nl]","\n");
r = r.replace("[ff]","\f");
return r;
};
function protectStr(r)
{
r = r.replace("\t","[tb]");
r = r.replace("\n","[nl]");
r = r.replace("\f","[ff]");
return r;
};
function scormLoadPageSuspendData()
{
controlWindow.controlSCORMreloading = true;
var data = sd_Page.split("\t");
for(var sectionIndex = 0; sectionIndex < controlWindow.sections.length; sectionIndex++)
{
var section = controlWindow.sections[sectionIndex];
for(var pageIndex = 0; pageIndex < section.pages.length; pageIndex++)
{
var page = section.pages[pageIndex];
page.loaded = scormD2B(data.shift());
if(page.loaded)
{
page.duration = parseInt(data.shift());
if(page.isQuestion)
{
page.percent = parseInt(data.shift());
page.student = data.shift();
if(page.student.length > 0)
{
page.attempted = true;
if(page.questionType == 10 && page.student == "(-(-()-)-)") page.student = "";
var hph = page.student.slice(-1,2) != "#+#";
if(hph != "#+#" && hph != "# #")
{
var recalcScore = controlGetPagePoints(page);
if(recalcScore > page.percent) page.percent = recalcScore;
}
if(page.student == "#+#eject" || page.student == "# #eject")
{
page.attempted = false;
}
}
else
{
var bookmarkStr = LMSGetValue("cmi.core.lesson_location");
var fileNames = bookmarkStr.split(";");
if(page.filename != fileNames[0])
{
page.student = "#+#";
page.attempted = true;
}
}
}
var isCmi = data.shift();
if(isCmi == "[spa]")
{
if(!page.cmi) page.cmi = {};
var d = saveStr.split("\n");
page.cmi["cmi.suspend_data"] = unprotectStr(d[0]);
page.cmi["cmi.core.exit"] = unprotectStr(d[1]);
page.cmi["cmi.core.lesson_location"] = unprotectStr(d[2]);
page.cmi["cmi.core.lesson_status"] = unprotectStr(d[3]);
data.shift(); // remove the [/spa]
}
else
{
data.unshift(isCmi);
}
}
}
}
controlWindow.controlSCORMreloading = false;
}
function noStudentStr()
{
var result = "#+#";
if(detectedIE) result = result + "1";
if(detectedOpera) result = result + "2";
if(detectedFirefox) result = result + "3";
if(detectedSafari) result = result + "4";
if(scoIsResume) result = result + "R"; else result = result + "A";
if(controlEjectedPage) result = result + controlEjectedPage.filename;
else if(currentPage) result = result + currentPage.filename;
var p = result.indexOf(".",1);
if(p > 0)result = result.slice(-1,p);
}
function scormSavePageSuspendData()
{
var data = new Array();
for(var sectionIndex = 0; sectionIndex < controlWindow.sections.length; sectionIndex++)
{
var section = controlWindow.sections[sectionIndex];
for(var pageIndex = 0; pageIndex < section.pages.length; pageIndex++)
{
var page = section.pages[pageIndex];
data.push(scormB2D(page.loaded));
if(page.loaded)
{
data.push(page.duration);
if(page.isQuestion)
{
var ppc = controlGetPagePoints(page);
var ss = page.student;
if(ss == "" && page.attempted)
{
if(page.questionType == 10)
{
ss = "(-(-()-)-)";
}
else
{
ss = noStudentStr();
}
}
data.push(ppc);
data.push(ss);
}
if(page.cmi)
{
data.push("[spa]");
var r;
r = protectStr(page.cmi["cmi.suspend_data"]) + "\n";
r = r + page.cmi["cmi.core.exit"] + "\n";
r = r + page.cmi["cmi.core.lesson_location"] + "\n";
r = r + page.cmi["cmi.core.lesson_status"] + "\n";
data.push(r);
data.push("[/spa]");
}
}
}
}
sd_Page = data.join("\t");
}
function scormDumpPageSuspendData()
{
for(var sectionIndex = 0; sectionIndex < controlWindow.sections.length; sectionIndex++)
{
var section = controlWindow.sections[sectionIndex];
for(var pageIndex = 0; pageIndex < section.pages.length; pageIndex++)
{
var page = section.pages[pageIndex];
}
}
}
function scormSaveArray(arr)
{
var t = arr.join(",");
if(sd_Random == "") sd_Random = t;
else sd_Random = sd_Random + "\n" + t;
}
function scormLoadArray(arr,idx)
{
var d = sd_Random.split("\n");
var a = d[idx].split(",");
for(var i = 0; i < arr.length; i++) arr[i] = a[i];
}
function scormNewShufflePages(aSection,aFirst,aLast,aCount)
{
var arr = new Array((aLast-aFirst)+1);
controlShuffleArray(arr,aFirst);
scormSaveArray(arr);
controlApplyShuffleArray(arr,aSection,aFirst,aLast,aCount);
}
function scormNewBraidPages(aSection,aFirst,aLast,aCount)
{
// new code to fix #8766 start
var t = controlBraidPages(aSection,aFirst,aLast,aCount);
if(sd_Random == "") sd_Random = t;
else sd_Random = sd_Random + "\n" + t;
// end of fix #8766
}
function scormResumeShufflePages(aSection,aFirst,aLast,aCount,aShuffleIdx)
{
var arr = new Array((aLast-aFirst)+1);
scormLoadArray(arr,aShuffleIdx);
try {controlApplyShuffleArray(arr,aSection,aFirst,aLast,aCount);}catch(e){}
}
function scormParseArg(dataStr,argName,defRet)
{
var pairs = dataStr.split("&");
for(var i = 0; i < pairs.length; i++)
{
var arg = pairs[i].split("=");
if(arg[0] == argName) return unescape(arg[1]);
}
return defRet;
}
function scormSaveTimer()
{
if(controlWindow.moduleIsTimed) sd_Timer = controlWindow.moduleTimerLeft.toString();
}
function scormLoadTimer()
{
if(controlWindow.moduleIsTimed) controlWindow.moduleTimer = parseInt(sd_Timer);
}
function scormSavePageHistory()
{
sd_PageHistory = controlWindow.controlHistorySaveToString();
}
function scormLoadPageHistory()
{
if(sd_PageHistory) controlWindow.controlHistoryLoadFromString(sd_PageHistory);
}