document.addEventListener("unit_content_loaded", (e)=>{
(function(){
this._VERSION="2.2.20130225";
this.skipManifestCheck=false;
this.launchFile='default.htm';
this.cookieName='WplmsSimpleAPI_Data_'+_VERSION;
this.useParentFolderAsCookieName=true;
this.closeOnFinish=true;
this.wWidth=1024;
this.wHeight=768;
this.wToolbar=false;
this.wTitlebar=false;
this.wLocation=true;
this.wStatus=true;
this.wScrollbars=true;
this.wResizable=true;
this.wMenubar=false;
this.WPLMSLastSaved=new Date().getTime();
this.defaultSearchString='?embedded=true';
this.defaultCustomApiKey='SomeCustomKey';
this.defaultCustomApiValue='SomeCustomValue';
this.initialState={
'cmi.core._children':'student_id,student_name,lesson_status,lesson_location,lesson_mode,score,credit,entry,exit,session_time,total_time',
'cmi.core.score._children':'raw',
'cmi.core.student_id':(!isEmpty(window.scorm_wplms_data))?scorm_wplms_data.user_email:'SAMPLE0001',
'cmi.core.student_name':(!isEmpty(window.scorm_wplms_data))?scorm_wplms_data.user_name:'SAMPLE0001',
'cmi.core.lesson_status':'not attempted',
'cmi.core.score.raw':'',
'cmi.core.lesson_location':'',
'cmi.suspend_data':'',
'cmi.core.session_time':'0000:00:00.00',
'cmi.core.credit':'credit', /* "credit" or "no-credit" */
'cmi.core.entry':'ab-initio', /* "resume" or "ab-initio" */
'cmi.core.lesson_mode':'normal', /* "browse",  "normal" or "review" */
'cmi.core.exit':'' /* "time-out", "suspend" or "logout" */
};
this.scoWin;
this.API;
this.hasTerminated=false;
this.hasInitialized=false;
this.optionsOpen=true;
this.initTimeoutMax=20000;
this.initTimeout=0;
this.fullPath=document.location.href.substr(0,document.location.href.lastIndexOf('/'))
this.parentFolder=fullPath.substr(fullPath.lastIndexOf('/')+1,fullPath.length);
this.timeoutErrorDisplayed=false;
this.launchWithEmbeddedParam=false;
this.launchWithCustomApiProperty=false;
this.storageObject;
this.WplmsSimpleAPI=function(cookiename,api,initData){
this.api=api;
this.initData=initData;
this.__data=null;
this.cookiename=cookiename;
this.initialized=false;
this.terminated=false;
this.lastError="0";
this.lastCmd='';
this.logCommand=function(){
Utils.log(this.lastCmd,'entry');
var lasterr=this.api.LMSGetLastError();
if(lasterr!='0'){
var errorstr=this.api.LMSGetErrorString(lasterr);
var diag=this.api.LMSGetDiagnostic(lasterr);
var msg="Error Calling: " + this.lastCmd + "<br>";
msg +="LMSGetLastError()=" + lasterr + "<br>";
msg +="LMSGetErrorString('" + lasterr + "')=" + errorstr + "<br>";
msg +="LMSGetDiagnostic('" + lasterr + "')=" + diag;
Utils.log(msg,'error');
}};
this.LMSInitialize=function(arg){
var success=this.api.LMSInitialize(arg);
this.lastCmd="LMSInitialize('" + arg + "')=" + success;
this.logCommand ();
this.initialized=(success==='true') ? true:false;
if(this.initialized){
this.terminated=false;
hasInitialized=true;
for(var o in this.api){
if(typeof this.api[o]!='function'){
this[o]=this.api[o];
}}
this.__data=Utils.getInitAPIData(this.initData);
for(var el in this.__data){
loadDataIntoModel(el,this.__data[el]);
}}
return success;
};
this.Initialize=this.LMSInitialize;
this.LMSFinish=function(arg){
var success=this.api.LMSFinish(arg);
this.lastCmd="LMSFinish('" + arg + "')=" + success;
this.logCommand ();
if(success==='true'){
this.initialized=false;
this.terminated=true;
hasTerminated=true;
if(this.__data['cmi.core.session_time']&&(this.__data['cmi.core.session_time'].length > 0)){
if(this.__data['cmi.core.total_time']==null||this.__data['cmi.core.total_time']==''){
this.__data['cmi.core.total_time']='0000:00:00.00';
}
var totalTime=Utils.addTime(this.__data['cmi.core.total_time'], this.__data['cmi.core.session_time']);
this.__data['cmi.core.total_time']=totalTime;
var cdata=JSON.stringify(this.__data);
storageObject.persist(this.cookiename,cdata,365);
Utils.log('Total Time (cmi.core.total_time): '+totalTime,'info');
}
if(closeOnFinish){
if(scoWin&&!scoWin.closed){
Utils.closeSCO();
}}
if(!isEmpty(window.scorm_wplms_data)){
switch(window.scorm_wplms_data.type){
case 'unit':
if(document.getElementById('mark-complete')){
document.getElementById('mark-complete').click();
}
if(!isEmpty(this.__data['cmi.core.score.raw'])&&!isEmpty(this.__data['cmi.core.score.max'])){
document.dispatchEvent(new Event('custom_unit_action',{"detail":
{
id:window.scorm_wplms_data.module_id,
unit_id:window.scorm_wplms_data.module_id,
course_id:window.scorm_wplms_data.course_id,
action:'unitfinished'
}}));
}
break;
case 'quiz':
if(!isEmpty(this.__data['cmi.core.score.raw'])&&!isEmpty(this.__data['cmi.core.score.max'])){
var nonce=window.scorm_wplms_data.security_nonce,
xhr=new XMLHttpRequest();
xhr.open('POST', window.wplms_course_data.api_url+'/scorm/finish?nocache');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload=function(){
if(xhr.status===200&&xhr.responseText!==nonce){
let data=JSON.parse(xhr.responseText);
if(data&&data.status){
if(data.hasOwnProperty('continue')&&data.continue){
document.dispatchEvent(new Event('scormquizsubmitted',{"detail":
{
data:data,
quiz_id:window.scorm_wplms_data.module_id,
course_id:window.scorm_wplms_data.course_id,
}}));
}}
}
else if(xhr.status!==200){
console.log('Something went wrong.Request failed.' + xhr.status);
}};
xhr.send(encodeURI('token='+window.scorm_wplms_data.token+'&is_take_course='+window.is_take_course+'&key='+this.cookiename+'&data='+this.__data+'&module_id='+window.scorm_wplms_data.module_id+'&course_id='+window.scorm_wplms_data.course_id+'&type='+window.scorm_wplms_data.type+'&total_marks='+this.__data['cmi.core.score.max']+'&user_marks='+this.__data['cmi.core.score.raw']));
}
break;
case 'course':
if(!isEmpty(this.__data['cmi.core.score.raw'])&&!isEmpty(this.__data['cmi.core.score.max'])){
var nonce=window.scorm_wplms_data.security_nonce,
xhr=new XMLHttpRequest();
xhr.open('POST', window.wplms_course_data.api_url+'/scorm/finish?nocache');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader('Authorization', window.scorm_wplms_data.token);
xhr.onload=function(){
if(xhr.status===200&&xhr.responseText!==nonce){
let data=JSON.parse(xhr.responseText);
if(document.querySelector('input[name="submit_course"]')&&data&&data.status){
document.querySelector('input[name="submit_course"]').click();
}}
else if(xhr.status!==200){
console.log('Something went wrong.Request failed.' + xhr.status);
}};
xhr.send(encodeURI('token='+window.scorm_wplms_data.token+'&key='+this.cookiename+'&data='+this.__data+'&course_id='+window.scorm_wplms_data.course_id+'&type='+window.scorm_wplms_data.type+'&total_marks='+this.__data['cmi.core.score.max']+'&user_marks='+this.__data['cmi.core.score.raw']));
}
break;
default:
var postevent=new CustomEvent('socrmfinishtrigger', { "detail":{scorm_wplms_data:window.scorm_wplms_data,data:this.__data}});
document.dispatchEvent(postevent);
break;
}}
}
return success;
};
this.Finish=this.LMSFinish;
this.LMSGetValue=function(name){
var value=unescape(this.api.LMSGetValue(name));
this.lastCmd="LMSGetValue('" + name + "')=" + value;
this.logCommand ();
return value;
};
this.GetValue=this.LMSGetValue;
this.LMSSetValue=function(name, value){
var success=this.api.LMSSetValue(name, escape(value));
this.lastCmd="LMSSetValue('" + name + "','" + value + "')=" + success;
this.logCommand ();
if(success==='true'){
this.__data[name]=value;
if(!isEmpty(window.scorm_wplms_data)&&name=='cmi.suspend_data'&&!isEmpty(value)){
var nonce=window.scorm_wplms_data.security_nonce,
xhr=new XMLHttpRequest();
xhr.open('POST', window.wplms_course_data.api_url+'/scorm/scormdata/update?nocache');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload=function(){
if(xhr.status===200&&xhr.responseText!==nonce){
let data=JSON.parse(xhr.responseText);
if(data&&data.status){
if(window.scorm_wplms_data.type=='quiz'&&data.hasOwnProperty('continue')&&data.continue){
document.dispatchEvent(new Event('scormquizsubmitted',{"detail":
{
data:data,
quiz_id:window.scorm_wplms_data.module_id,
course_id:window.scorm_wplms_data.course_id,
}}));
}}
}
else if(xhr.status!==200){
console.log('Something went wrong.Request failed.' + xhr.status);
}};
xhr.send(encodeURI('token='+window.scorm_wplms_data.token+'&action=save_scorm_data&security='+nonce+'&key='+this.cookiename+'&data='+value+'&module_id='+window.scorm_wplms_data.module_id+'&course_id='+window.scorm_wplms_data.course_id+'&type='+window.scorm_wplms_data.type+'&type='+window.scorm_wplms_data.type+'&total_marks='+this.__data['cmi.core.score.max']+'&user_marks='+(typeof this.__data['cmi.core.score.raw']!=='undefined'&&this.__data['cmi.core.score.raw']?this.__data['cmi.core.score.raw']:0)));
this.WPLMSLastSaved=new Date().getTime();
}}
return success;
};
this.SetValue=this.LMSSetValue;
this.LMSCommit=function(arg){
var success=this.api.LMSCommit(arg);
this.lastCmd="LMSCommit('" + arg + "')=" + success;
this.logCommand ();
if(success==='true'){
var cdata=JSON.stringify(this.__data);
storageObject.persist(this.cookiename,cdata,365);
}
return success;
};
this.Commit=this.LMSCommit;
this.LMSGetErrorString=function(arg){
var errorstr=this.api.LMSGetErrorString(arg);
Utils.log("LMSGetErrorString('" + arg + "')=" + errorstr,'entry');
return errorstr;
};
this.GetErrorString=this.LMSGetErrorString;
this.LMSGetLastError=function(){
var lasterr=this.api.LMSGetLastError();
Utils.log("LMSGetLastError()=" + lasterr,'entry');
return lasterr;
};
this.GetLastError=this.LMSGetLastError;
this.LMSGetDiagnostic=function(arg){
var diag=this.api.LMSGetDiagnostic(arg);
Utils.log("LMSGetDiagnostic('" + arg + "')=" + diag,'entry');
return diag;
};
this.GetDiagnostic=this.LMSGetDiagnostic;
};
this.Utils={
getInitAPIData:function(initData){
if(storageObject.retrieve(API.cookiename)!==null&&storageObject.retrieve(API.cookiename)!==undefined){
return JSON.parse(storageObject.retrieve(API.cookiename));
}else{
return initData;
}},
dumpAPI:function(){
if(API.__data){
Utils.log('<b>Dumping API object:</b> <blockquote> ' + this.formatAPIData(JSON.stringify(API.__data)) + '</blockquote>','info');
}else{
Utils.log('ERROR: API object contains no data.','error');
}},
dumpExistingAPIData:function(){
if(storageObject.retrieve(cookieName)!==undefined&&storageObject.retrieve(cookieName)!==null){
var existingData=storageObject.retrieve(cookieName);
Utils.log('<b>Existing API Data (from '+storageObject.toString()+' &quot;'+cookieName+'&quot; - To be used in API during initialization):</b> <blockquote> ' + this.formatAPIData(existingData) + '</blockquote>','info');
}else{
Utils.log('No Existing API data found in &quot;'+cookieName+'&quot;. Will use default init data.','info');
}},
formatAPIData:function(str){
var html;
html=this.replaceAll(str, '{"', '{<br>"');
html=this.replaceAll(html, '"}', '"<br>}');
html=this.replaceAll(html, '","', '",<br>"');
return html;
},
replaceAll:function(text, strA, strB){
return text.replace(new RegExp(strA,"g"), strB);
},
addTime:function(first, second){
var sFirst=first.split(":");
var sSecond=second.split(":");
var cFirst=sFirst[2].split(".");
var cSecond=sSecond[2].split(".");
var change=0;
FirstCents=0;
if(cFirst.length > 1){
FirstCents=parseInt(cFirst[1],10);
}
SecondCents=0;
if(cSecond.length > 1){
SecondCents=parseInt(cSecond[1],10);
}
var cents=FirstCents + SecondCents;
change=Math.floor(cents / 100);
cents=cents - (change * 100);
if(Math.floor(cents) < 10){
cents="0" + cents.toString();
}
var secs=parseInt(cFirst[0],10)+parseInt(cSecond[0],10)+change;
change=Math.floor(secs / 60);
secs=secs - (change * 60);
if(Math.floor(secs) < 10){
secs="0" + secs.toString();
}
mins=parseInt(sFirst[1],10)+parseInt(sSecond[1],10)+change;
change=Math.floor(mins / 60);
mins=mins - (change * 60);
if(mins < 10){
mins="0" + mins.toString();
}
hours=parseInt(sFirst[0],10)+parseInt(sSecond[0],10)+change;
if(hours < 10){
hours="0" + hours.toString();
}
if(cents!='0'){
return hours + ":" + mins + ":" + secs + '.' + cents;
}else{
return hours + ":" + mins + ":" + secs;
}},
openWindow:function(winURL,winName,winW,winH,winOpts){
winOptions=winOpts+",width=" + winW + ",height=" + winH;
newWin=window.open(winURL,winName,winOptions);
newWin.moveTo(0,0);
newWin.focus();
return newWin;
},
log:function(status,style){
var timeFix=function(time){
return (time<10) ? '0'+time:time;
};
var d=new Date();
var hrs=timeFix(d.getHours());
var min=timeFix(d.getMinutes());
var sec=timeFix(d.getSeconds());
var tmp=(style) ? '<div class="'+style+'">':'<div class="entry">';
tmp +='&gt; '+hrs+':'+min+':'+sec+' ';
tmp +=status;
tmp +='</div>';
},
clearCookieData:function(){
if(storageObject.retrieve(cookieName)){
storageObject.remove(cookieName);
Utils.log(storageObject.toString()+'"'+cookieName+'" Cleared','info');
}else{
Utils.log(storageObject.toString()+'"'+cookieName+'" Not Found','error');
}},
genNewSessionName:function(){
var d=new Date();
var hrs=d.getHours();
var min=d.getMinutes();
var sec=d.getSeconds();
if(useParentFolderAsCookieName){
var tmp=parentFolder+'_';
}else{
var tmp='WplmsSimpleAPI_Data_';
}
tmp +=hrs+'.'+min+'.'+sec;
$('cookieNameAlt').value=tmp;
},
watchWin:function(){
if(scoWin&&!scoWin.closed){
initTimeout +=1000;
if(initTimeout >=initTimeoutMax){
if(!API.initialized&&!timeoutErrorDisplayed){
this.log('ERROR: LMSInitialize not called within 20 seconds from launching.', 'error');
timeoutErrorDisplayed=true;
}}
setTimeout(function(){Utils.watchWin()},1000);
}else{
this.log('SCO Closed','info');
if(!hasInitialized){
this.log('ERROR: LMSInitialize was never called.', 'error');
}
if(!hasTerminated){
this.log('ERROR: LMSFinish was never called.', 'error');
}}
},
launchSCO:function(){
hasTerminated=false;
hasInitialized=false;
API.terminated=false;
API.initialized=false;
initTimeout=0;
timeoutErrorDisplayed=false;
if(launchWithCustomApiProperty){
try
{
var key=$('customApiKey').value;
var val=$('customApiValue').value;
if(key&&val){
API[key]=val;
}
Utils.log('Injected custom key/value into API object: '+key+'='+val,'info');
}
catch(e){
Utils.log('ERROR: Cannot inject custom key/value into API object: '+key+'='+val+ '('+e+')','error');
}}
try
{
var w=(($('winW').value!="")&&($('winW').value > 0)) ? $('winW').value:wWidth;
var h=(($('winH').value!="")&&($('winH').value > 0)) ? $('winH').value:wHeight;
var embedParam='';
if(launchWithEmbeddedParam){
try
{
embedParam=$('searchString').value;
Utils.log('Appending search string to launch file: '+$('searchString').value,'info');
}
catch(e){
embedParam='';
}}else{
embedParam='';
}
var opts='';
opts +=(wToolbar) ? 'toolbar=yes,':'';
opts +=(wTitlebar) ? 'titlebar=yes,':'';
opts +=(wLocation) ? 'location=yes,':'';
opts +=(wStatus) ? 'status=yes,':'';
opts +=(wScrollbars) ? 'scrollbars=yes,':'';
opts +=(wResizable) ? 'resizable=yes,':'';
opts +=(wMenubar) ? 'menubar=yes,':'';
opts=opts.substring(0, opts.length-1)
Utils.log("Launching SCO win with options: "+opts)
scoWin=document.getElementsByTagName("iframe")[0].contentWindow;
}
catch (e){
Utils.log('ERROR: '+e.description, 'error');
}
if(scoWin!==null){
try
{
Utils.log('SCO Launched','info');
scoWin.focus();
this.watchWin();
}
catch (e){
Utils.log('ERROR: '+err.description,'error');
}}else{
Utils.log('ERROR: SCO windows unable to open.  Please disable any popup blockers you might have enabled and ensure the launch file path is correct.', 'error');
}},
closeSCO:function(){
try
{
if(scoWin&&!scoWin.closed){
Utils.log('Attempting to close SCO window...','info');
scoWin.close();
}}
catch(e){
Utils.log('ERROR: Unable to close SCO window ('+e.description+')','error');
}},
toggleCloseOnFinishOption:function(chkd){
closeOnFinish=chkd;
},
toggleEmbeddedParam:function(chkd){
launchWithEmbeddedParam=chkd;
$('searchString').disabled = !chkd;
},
toggleCustomKeyValueOption:function(chkd){
launchWithCustomApiProperty=chkd;
$('customApiKey').disabled = !chkd;
$('customApiValue').disabled = !chkd;
},
toggleWindowOption:function(prop,el){
window[prop]=el.checked;
},
enableAllWindowOptions:function(){
wToolbar=true;
wTitlebar=true;
wLocation=true;
wStatus=true;
wScrollbars=true;
wResizable=true;
wMenubar=true;
$('wToolbarOption').checked=true;
$('wTitlebarOption').checked=true;
$('wLocationOption').checked=true;
$('wStatusOption').checked=true;
$('wScrollbarsOption').checked=true;
$('wResizableOption').checked=true;
$('wMenubarOption').checked=true;
},
disableAllWindowOptions:function(){
wToolbar=false;
wTitlebar=false;
wLocation=false;
wStatus=false;
wScrollbars=false;
wResizable=false;
wMenubar=false;
$('wToolbarOption').checked=false;
$('wTitlebarOption').checked=false;
$('wLocationOption').checked=false;
$('wStatusOption').checked=false;
$('wScrollbarsOption').checked=false;
$('wResizableOption').checked=false;
$('wMenubarOption').checked=false;
},
loadManifest:function(){
var xmlDoc=null;
var file=fullPath+"/imsmanifest.xml";
var useManifest=function(){
try
{
var m=xmlDoc.getElementsByTagName("manifest")[0];
var orgs=xmlDoc.getElementsByTagName("organizations")[0];
var org=orgs.getElementsByTagName("organization")[0];
var orgTitle=org.getElementsByTagName("title")[0].firstChild.nodeValue;
var items=org.getElementsByTagName("item");
var item=items[0];
var itemTitle=item.getElementsByTagName("title")[0].firstChild.nodeValue;
var itemMasteryScore=item.getElementsByTagName("adlcp:masteryscore")[0].firstChild.nodeValue;
var itemIdentifier=item.getAttribute("identifier");
var itemIdentifierRef=item.getAttribute("identifierref");
var resources=xmlDoc.getElementsByTagName("resources")[0];
var resource=resources.getElementsByTagName("resource");
var itemResource=null;
for(var i=0;i<resource.length;i++){
var id=resource[i].getAttribute("identifier");
var scormtype=resource[i].getAttribute("adlcp:scormtype");
if(id==itemIdentifierRef&&scormtype.toLowerCase()=="sco"){
itemResource=resource[i];
}}
var itemResourceHref=itemResource.getAttribute("href");
Utils.log('IMS Manifest: Organization Title=&quot;'+orgTitle+'&quot;','entry');
if(items.length > 1){
Utils.log('IMS Manifest: WplmsSimpleAPI detected multiple SCO references - Only the first will be launched.','entry');
}
Utils.log('IMS Manifest: First SCO Item=&quot;'+itemTitle+'&quot; (Mastery Score: '+itemMasteryScore+' / Identifier: &quot;'+itemIdentifier+'&quot;)','entry');
Utils.log('IMS Manifest: Resource &quot;'+itemIdentifierRef+'&quot; HREF for Item &quot;'+itemIdentifier+'&quot;=&quot;'+itemResourceHref+'&quot;');
var obj={};
obj.id=m.getAttribute("identifier");
obj.orgTitle=orgTitle;
obj.itemTitle=itemTitle;
obj.itemMasteryScore=itemMasteryScore;
obj.itemResourceHref=itemResourceHref;
$('launchFileAlt').value=itemResourceHref;
return obj;
}
catch(e){
error=e.message;
Utils.log('IMS Manifest: Cannot locate or parse manifest - '+error,'error');
return false;
}};
try
{
xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.onreadystatechange=function(){
if(xmlDoc.readyState==4){
useManifest();
}}
var success=xmlDoc.load(file);
}
catch(e){
try
{
xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async=false;
xmlDoc.onload=function(){
useManifest();
};
var success=xmlDoc.load(file);
}
catch(e){
try
{
var xmlhttp=new window.XMLHttpRequest();
xmlhttp.open("GET",file,false);
xmlhttp.send(null);
xmlDoc=xmlhttp.responseXML.documentElement;
}
catch(e){
error=e.message;
Utils.log('IMS Manifest: Cannot locate or parse manifest - '+error,'error');
return false;
}}
}}
};
this.init=function(){
let src=document.getElementsByTagName("iframe")[0].getAttribute('data-src');
fullPath=src.substr(0,src.lastIndexOf('/'));
parentFolder=fullPath.substr(fullPath.lastIndexOf('/')+1,fullPath.length);
scoWin=null;
var manifestObj=null;
if(!skipManifestCheck){
var manifestObj=Utils.loadManifest();
}
if(!manifestObj){
if(useParentFolderAsCookieName){
cookieName=src;
}}else{
if(manifestObj.id){
cookieName=manifestObj.id;
}
if(manifestObj.itemResourceHref){
$('launchFileAlt').value=manifestObj.itemResourceHref;
}}
var api=new GenericAPIAdaptor();
API=new WplmsSimpleAPI(cookieName,api,initialState);
if(typeof(Storage)!=="undefined"){
try {
if(('localStorage' in window)&&window['localStorage']&&window.localStorage!==null){
storageObject=localStorageObject;
}else{
storageObject=cookieStorageObject;
}} catch(e){
storageObject=cookieStorageObject;
}}else{
storageObject=cookieStorageObject;
}
launchWithEmbeddedParam=true;
launchWithCustomApiProperty=false;
Utils.log('Storage type will be: '+storageObject.toString(),'info');
Utils.dumpExistingAPIData();
};
this.sendSimApi=function(simAPI,title,totalToInclude,totalIncorrect,incStepNumberList){
Utils.log('Sim API Object: '+simAPI,'info');
Utils.log('Sim Title: '+title,'info');
};
/* this.$=function(id){
var el=document.getElementById(id);
return el;
};*/
this.cookieStorageObject={
persist:function(name,data,lifetime){
saveCookie(name,data,lifetime)
},
retrieve:function(name){
return readCookie(name);
},
remove:function(name){
deleteCookie(name);
},
toString:function(){
return "Cookie";
}};
this.localStorageObject={
persist: function(name,data,lifetime){
localStorage[name]=data;
},
retrieve:function(name){
return localStorage[name];
},
remove:function(name){
delete localStorage[name];
},
toString:function(){
return "LocalStorage";
}};
window.onload=function(){
this.init();
};
setTimeout(function (){
this.init();
},500);
})();
function saveCookie(name,value,days){
if(days){
var date=new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires="; expires="+date.toGMTString();
}else{
expires="";
}
document.cookie=name+"="+value+expires+"; path=/";
}
function readCookie(name){
var nameEQ=name + "=";
var ca=document.cookie.split(';');
for(var i=0;i<ca.length;i++){
var c=ca[i];
while (c.charAt(0)==' ') c=c.substring(1,c.length);
if(c.indexOf(nameEQ)==0) return c.substring(nameEQ.length,c.length);
}
return null;
}
function deleteCookie(name){
saveCookie(name,"",-1);
}
var looseChecking="false";
function loadDataIntoModel(element, value){
if(element!="cmi.interactions._count"&&element!="cmi.interactions._count"){
if(element.indexOf("cmi.objectives")!=-1){
dealWithSettingObjectives(element, value);
}
else if(element.indexOf("cmi.interactions")!=-1){
dealWithSettingInteractions(element, value);
}else{
var result=eval ("API."+element);
if(result!=null){
result.cmivalue=value;
}}
}}
function ServerScoSettings(){
this.isInitialized="false";
this.lastError="0";
this.checkDataTypeAndVocab=scoCheckDataTypeAndVocab;
}
function CMIComponent(thename, thevalue, readstatus, datatype){
this.cminame=thename;
this.cmivalue=thevalue;
this.cmireadStatus=readstatus;
this.cmidatatype=datatype;
}
function GenericAPIAdaptor(){
this.cmi=new CMIModel;
this.LMSInitialize=LMSInitializeMethod;
this.LMSGetValue=LMSGetValueMethod;
this.LMSSetValue=LMSSetValueMethod;
this.LMSCommit=LMSCommitMethod;
this.LMSFinish=LMSFinishMethod;
this.LMSGetLastError=LMSGetLastErrorMethod;
this.LMSGetErrorString=LMSGetErrorStringMethod;
this.LMSGetDiagnostic=LMSGetDiagnosticMethod;
this.ServerSco=new ServerScoSettings;
}
function LMSInitializeMethod(parameter){
if(parameter!=""){
this.ServerSco.lastError="201"
return "false";
}
if(this.ServerSco.isInitialized=="false"){
this.ServerSco.isInitialized="true";
this.ServerSco.lastError="0"
return "true";
}else{
this.ServerSco.lastError="101"
return "false";
}}
function LMSFinishMethod(parameter){
if(parameter!=""){
this.ServerSco.lastError="201";
return "false";
}
if(this.ServerSco.isInitialized=="true"){
this.ServerSco.isInitialized="false";
this.ServerSco.lastError="0";
return "true";
}else{
this.ServerSco.lastError="301";
return "false";
}}
function LMSCommitMethod(parameter){
if(parameter!=""){
this.ServerSco.lastError="201"
return "false";
}
if(this.ServerSco.isInitialized=="true"){
this.ServerSco.lastError="0";
return "true";
}else{
this.ServerSco.lastError="301";
return "false";
}}
function dealWithGettingObjectives(element){
if(element=="cmi.objectives._children"){
API.ServerSco.lastError="0";
return API.cmi.objectives._children.cmivalue;
}
if(element=="cmi.objectives._count"){
API.ServerSco.lastError="0";
return API.cmi.objectives._count.cmivalue;
}
var cmiArray=element.split(".");
if(cmiArray.length < 3){
API.ServerSco.lastError="201";
return "";
}
var theCount=API.cmi.objectives._count.cmivalue;
if(isNaN(cmiArray[2])){
API.ServerSco.lastError="401";
return "";
}
if(cmiArray[2] >=theCount){
API.ServerSco.lastError="201";
return "";
}else{
var mystr="API."+cmiArray[0] + "." + cmiArray[1] + ".objArray(" + cmiArray[2] + ");";
ans=eval(mystr);
if(ans==null){
API.ServerSco.lastError="201";
return "";
}else{
subelementstr="ans";
for (i=3;i<cmiArray.length;i++){
subelementstr=subelementstr + "." + cmiArray[i];
}
var objTest=eval(subelementstr);
if(objTest==null){
API.ServerSco.lastError="201";
return "false";
}
subelementstr=subelementstr + ".cmivalue;";
res=eval(subelementstr);
if(res==null){
API.ServerSco.lastError="201";
return "";
}else{
API.ServerSco.lastError="0";
return res;
}}
}}
function dealWithGettingInteractions(element){
if(element=="cmi.interactions._children"){
API.ServerSco.lastError="0";
return API.cmi.interactions._children.cmivalue;
}
if(element=="cmi.interactions._count"){
API.ServerSco.lastError="0";
return API.cmi.interactions._count.cmivalue;
}
var cmiArray=element.split(".");
if(cmiArray.length < 3||cmiArray.length > 6){
API.ServerSco.lastError="201";
return "";
}
var theCount=API.cmi.interactions._count.cmivalue;
if(isNaN(cmiArray[2])){
API.ServerSco.lastError="401";
return "";
}
if(cmiArray[2] >=theCount){
API.ServerSco.lastError="201";
return "";
}else{
var mystr="API."+cmiArray[0] + "." + cmiArray[1] + ".intArray(" + cmiArray[2] + ")";
ans=eval(mystr);
if(ans==null){
API.ServerSco.lastError="201";
return "";
}else{
if(cmiArray.length==4){
strleaf="ans."+ cmiArray[3] + ";";
var doesLeafExist=eval (strleaf);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "";
}else{
strleafstatus=mystr + "."+ cmiArray[3] + ".cmireadStatus;";
var leafstatus=eval(strleafstatus);
if(leafstatus=="writeonly"){
API.ServerSco.lastError="404";
return "";
}
var strleafval=mystr + "."+ cmiArray[3] + ".cmivalue;";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "";
}else{
API.ServerSco.lastError="0";
return leafVal;
}}
}
if(cmiArray.length==5){
strbranch="ans."+ cmiArray[3] + ";";
var doesLeafExist=eval (strbranch);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "";
}
nextstrbranch="ans."+ cmiArray[3] + "." + cmiArray[4] + ";";
var doesLeafExist=eval (nextstrbranch);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "";
}
strread="ans."+ cmiArray[3] + "." + cmiArray[4] + ".cmireadStatus;";
var isWriteOnly=eval (strread);
if(isWriteOnly=="writeonly"){
API.ServerSco.lastError="404";
return "";
}
strleaf="ans."+ cmiArray[3] + "." + cmiArray[4] + ".cmivalue;";
var doesLeafExist=eval (strleaf);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "";
}else{
API.ServerSco.lastError="0";
return doesLeafExist;
}}
if(cmiArray.length==6){
strbranch="ans."+ cmiArray[3];
var doesBranchExist=eval (strbranch);
if(doesBranchExist==null){
API.ServerSco.lastError="201";
return "";
}
if(isNaN(cmiArray[4])){
API.ServerSco.lastError="401";
return "";
}
var theCount="ans." + cmiArray[3] + "._count.cmivalue;";
var hasCount=eval(theCount);
if(hasCount==null){
API.ServerSco.lastError="201";
return "";
}
if(cmiArray[4] >=hasCount||cmiArray[4] < 0){
API.ServerSco.lastError="201";
return "";
}
if(cmiArray[3]=="objectives"){
var arrayIndex2Check=eval("ans." + cmiArray[3] + ".objectivesInteractionArray(" + cmiArray[4] + ")");
if(arrayIndex2Check==null){
API.ServerSco.lastError="201";
return "";
}else{
finalObjectCheck=eval ("arrayIndex2Check." + cmiArray[5]);
if(finalObjectCheck==null){
API.ServerSco.lastError="201";
return "";
}else{
isWriteonly=eval ("finalObjectCheck.cmireadStatus");
if(isWriteonly=="writeonly"){
API.ServerSco.lastError="404";
return "";
}else{
API.ServerSco.lastError="0";
return eval ("finalObjectCheck.cmivalue");
}}
}}
else if(cmiArray[3]=="correct_responses"){
var arrayIndex2Check=eval("ans." + cmiArray[3] + ".correctResponsesInteractionArray(" + cmiArray[4] + ")");
if(arrayIndex2Check==null){
API.ServerSco.lastError="201";
return "";
}else{
finalObjectCheck=eval ("arrayIndex2Check." + cmiArray[5]);
if(finalObjectCheck==null){
API.ServerSco.lastError="201";
return "";
}else{
isWriteonly=eval ("finalObjectCheck.cmireadStatus");
if(isWriteonly=="writeonly"){
API.ServerSco.lastError="404";
return "";
}else{
API.ServerSco.lastError="0";
return eval ("finalObjectCheck.cmivalue");
}}
}}else{
API.ServerSco.lastError="201";
return "";
}}
}}
}
function dealWithSettingObjectives(element, value){
if(element=="cmi.objectives._children"){
API.ServerSco.lastError="402";
return "false";
}
if(element=="cmi.objectives._count"){
API.ServerSco.lastError="402";
return "false";
}
var cmiArray=element.split(".");
if(cmiArray.length < 3){
API.ServerSco.lastError="201";
return "false";
}
if(isNaN(cmiArray[2])){
API.ServerSco.lastError="401";
return "false";
}
var theCount=API.cmi.objectives._count.cmivalue;
if(cmiArray[2] > theCount||cmiArray[2] < 0){
API.ServerSco.lastError="201";
return "false";
}
else if(cmiArray[2]==theCount||cmiArray[2]  < theCount){
var existingObjectiveHandle=API.cmi.objectives.objArray(cmiArray[2]);
if(existingObjectiveHandle==null){
API.ServerSco.lastError="101";
return "false";
}else{
subelementstr="existingObjectiveHandle";
for (i=3;i<cmiArray.length;i++){
subelementstr=subelementstr + "." + cmiArray[i];
}
var objTest=eval(subelementstr);
if(objTest==null){
API.ServerSco.lastError="201";
return "false";
}
var subelementstrWithoutLeaf=subelementstr;
subelementstr=subelementstr + ".cmireadStatus;";
res=eval(subelementstr);
if(res==null){
API.ServerSco.lastError="101";
return "false";
}else{
if(res=="readonly"){
API.ServerSco.lastError="403";
return "false";
}else{
var datatype=objTest.cmidatatype;
res=API.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
var strleafval="objTest.cmivalue=\"" + value + "\";";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "false";
}else{
API.ServerSco.lastError="0";
return "true";
}}else{
API.ServerSco.lastError="405";
return "false";
}}
}}
}}
function dealWithSettingInteractions(element, value){
if(element=="cmi.interactions._children"){
API.ServerSco.lastError="402";
return "false";
}
if(element=="cmi.interactions._count"){
API.ServerSco.lastError="402";
return "false";
}
var cmiArray=element.split(".");
if(cmiArray.length < 3||cmiArray.length > 6){
API.ServerSco.lastError="201";
return "false";
}
var theCount=API.cmi.interactions._count.cmivalue;
if(isNaN(cmiArray[2])){
API.ServerSco.lastError="401";
return "false";
}
var theCount=API.cmi.interactions._count.cmivalue;
if(cmiArray[2] > theCount||cmiArray[2] < 0){
API.ServerSco.lastError="201";
return "false";
}
else if(cmiArray[2] <=theCount){
var existingObjectiveHandle=API.cmi.interactions.intArray(cmiArray[2]);
if(existingObjectiveHandle==null){
API.ServerSco.lastError="101";
return "false";
}else{
if(cmiArray.length==4){
strleaf="existingObjectiveHandle." + cmiArray[3];
var doesLeafExist=eval (strleaf);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "false";
}else{
strleafstatus="doesLeafExist.cmireadStatus";
var leafstatus=eval(strleafstatus);
if(leafstatus=="readonly"){
API.ServerSco.lastError="403";
return "false";
}
var datatype=doesLeafExist.cmidatatype;
res=API.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
var strleafval="doesLeafExist.cmivalue=\"" + value + "\";";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "false";
}else{
API.ServerSco.lastError="0";
return "true";
}}else{
API.ServerSco.lastError="405";
return "false";
}}
}
if(cmiArray.length==5){
strbranch="existingObjectiveHandle."+ cmiArray[3] + ";";
var doesLeafExist=eval (strbranch);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "false";
}
nextstrbranch="existingObjectiveHandle."+ cmiArray[3] + "." + cmiArray[4] + ";";
var doesLeafExist=eval (nextstrbranch);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "false";
}
strread="existingObjectiveHandle."+ cmiArray[3] + "." + cmiArray[4] + ".cmireadStatus;";
var isWriteOnly=eval (strread);
if(isWriteOnly=="readonly"){
API.ServerSco.lastError="403";
return "false";
}
strleaf="existingObjectiveHandle."+ cmiArray[3] + "." + cmiArray[4] + ".cmivalue;";
var doesLeafExist=eval (strleaf);
if(doesLeafExist==null){
API.ServerSco.lastError="201";
return "false";
}else{
var datatype=doesLeafExist.cmidatatype;
res=API.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
var strleafval="doesLeafExist.cmivalue=\"" + value + "\";";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "false";
}else{
API.ServerSco.lastError="0";
return "true";
}}else{
API.ServerSco.lastError="405";
return "false";
}}
}
if(cmiArray.length==6){
strbranch="existingObjectiveHandle."+ cmiArray[3];
var doesBranchExist=eval (strbranch);
if(doesBranchExist==null){
API.ServerSco.lastError="201";
return "false";
}
if(isNaN(cmiArray[4])){
API.ServerSco.lastError="401";
return "false";
}
var theCount="existingObjectiveHandle." + cmiArray[3] + "._count.cmivalue;";
var hasCount=eval(theCount);
if(hasCount==null){
API.ServerSco.lastError="201";
return "false";
}
if(cmiArray[4] > hasCount||cmiArray[4] < 0){
API.ServerSco.lastError="201";
return "false";
}
if(cmiArray[3]=="objectives"){
var arrayIndex2Check=eval("existingObjectiveHandle." + cmiArray[3] + ".objectivesInteractionArray(" + cmiArray[4] + ")");
if(arrayIndex2Check==null){
API.ServerSco.lastError="201";
return "false";
}else{
finalObjectCheck=eval ("arrayIndex2Check." + cmiArray[5]);
if(finalObjectCheck==null){
API.ServerSco.lastError="201";
return "false";
}else{
isWriteonly=eval ("finalObjectCheck.cmireadStatus");
if(isWriteonly=="readonly"){
API.ServerSco.lastError="403";
return "false";
}else{
var datatype=finalObjectCheck.cmidatatype;
res=API.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
var strleafval="finalObjectCheck.cmivalue=\"" + value + "\";";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "false";
}else{
API.ServerSco.lastError="0";
return "true";
}}else{
API.ServerSco.lastError="405";
return "false";
}}
}}
}
else if(cmiArray[3]=="correct_responses"){
var arrayIndex2Check=eval("existingObjectiveHandle." + cmiArray[3] + ".correctResponsesInteractionArray(" + cmiArray[4] + ")");
if(arrayIndex2Check==null){
API.ServerSco.lastError="201";
return "false";
}else{
finalObjectCheck=eval ("arrayIndex2Check." + cmiArray[5]);
if(finalObjectCheck==null){
API.ServerSco.lastError="201";
return "false";
}else{
isWriteonly=eval ("finalObjectCheck.cmireadStatus");
if(isWriteonly=="readonly"){
API.ServerSco.lastError="403";
return "false";
}else{
var datatype=finalObjectCheck.cmidatatype;
res=API.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
var strleafval="finalObjectCheck.cmivalue=\"" + value + "\";";
var leafVal=eval(strleafval);
if(leafVal==null){
API.ServerSco.lastError="201";
return "false";
}else{
API.ServerSco.lastError="0";
return "true";
}}else{
API.ServerSco.lastError="405";
return "false";
}}
}}
}else{
API.ServerSco.lastError="201";
return "false";
}}
}}
}
function LMSGetValueMethod(element){
if(this.ServerSco.isInitialized=="true"){
var invalid="false";
var cannotHaveChildren="false";
var isNotAnArray="false";
if(element.indexOf(".")==-1){
invalid="true";
}
if(invalid!="true"){
var cmiArray=element.split(".");
var teststring="this";
for(i=0;i<cmiArray.length;i++){
doesExist=eval(teststring + "." + cmiArray[i]+ ";");
if(doesExist==null){
invalid="true";
if(cmiArray[i]=="_children"){
cannotHaveChildren="true";
}
if(cmiArray[i]=="_count"){
isNotAnArray="true";
}
break;
}else{
teststring=teststring + "." + cmiArray[i];
if(teststring=="this.cmi.objectives"){
return dealWithGettingObjectives(element);
}
if(teststring=="this.cmi.interactions"){
return dealWithGettingInteractions(element);
}}
}}
if(isNotAnArray=="true"){
this.ServerSco.lastError="203";
return "";
}
if(cannotHaveChildren=="true"){
this.ServerSco.lastError="202";
return "";
}
if(invalid=="true"){
this.ServerSco.lastError="401";
return "";
}else{
elementObj=eval ("this."+element);
}
if(elementObj.cmireadStatus=="writeonly"){
this.ServerSco.lastError="404";
return "";
}else{
this.ServerSco.lastError="0";
return elementObj.cmivalue;
}}else{
this.ServerSco.lastError="301";
return "";
}}
function LMSSetValueMethod(element, value){
value=unescape(value)  ;
if(this.ServerSco.isInitialized=="true"){
var invalid="false";
var cannotHaveChildren="false";
var isNotAnArray="false";
if(element.indexOf("._children")!=-1||element.indexOf("._count")!=-1){
this.ServerSco.lastError="402";
return "false";
}
if(element.indexOf(".")==-1){
invalid="true";
}
if(invalid!="true"){
var cmiArray=element.split(".");
var teststring="this";
for(i=0;i<cmiArray.length;i++){
doesExist=eval(teststring + "." + cmiArray[i]+ ";");
if(doesExist==null){
invalid="true";
if(cmiArray[i]=="_children"){
cannotHaveChildren="true";
}
if(cmiArray[i]=="_count"){
isNotAnArray="true";
}
break;
}else{
teststring=teststring + "." + cmiArray[i];
if(teststring=="this.cmi.objectives"){
return dealWithSettingObjectives(element, value);
}
if(teststring=="this.cmi.interactions"){
return dealWithSettingInteractions(element, value);
}}
}}
if(isNotAnArray=="true"){
this.ServerSco.lastError="203";
return "false";
}
if(cannotHaveChildren=="true"){
this.ServerSco.lastError="202";
return "false";
}
if(invalid=="true"){
this.ServerSco.lastError="401";
return "false";
}else{
elementObj=eval ("this."+element);
}
if(elementObj.cmireadStatus=="readonly"){
this.ServerSco.lastError="403";
return "false";
}else{
var datatype=elementObj.cmidatatype;
res=this.ServerSco.checkDataTypeAndVocab(element, value, datatype);
if(res=="true"){
if(element=="cmi.comments"){
pre=this.LMSGetValue("cmi.comments");
pre=pre.replace(/"/g,'\'');
value=value.replace(/"/g,'\'');
setString="this." + element + ".cmivalue=\"" + pre + value + "\";";
}else{
value=value.replace(/"/g,'\'');
setString="this." + element + ".cmivalue=\"" + value + "\";";
}
var result=eval(setString);
this.ServerSco.lastError="0";
return "true";
}else{
this.ServerSco.lastError="405";
return "false";
}}
}else{
this.ServerSco.lastError="301";
return "false";
}}
function LMSGetErrorStringMethod(errorCode){
switch (errorCode){
case "0":   { return "No error"; break }
case "101": { return "General exception"; break  }
case "201": { return "Invalid argument error"; break }
case "202": { return "Element cannot have children"; break  }
case "203": { return "Element not an array - Cannot have count"; break  }
case "301": { return "Not initialized"; break  }
case "401": { return "Not implemented error"; break  }
case "402": { return "Invalid set value, element is a keyword"; break  }
case "403": { return "Element is read only"; break  }
case "404": { return "Element is write only"; break  }
case "405": { return "Incorrect Data Type"; break  }
default:    { return ""; break }}
return;
}
function LMSGetLastErrorMethod(){
return this.ServerSco.lastError;
}
function LMSGetDiagnosticMethod(errorCode){
if(errorCode==""){
errorCode=this.ServerSco.lastError;
}
switch (errorCode){
case "0":   { return "No error. No errors were encountered. Successful API call."; break }
case "101": { return "General exception. An unexpected error was encountered."; break  }
case "201": { return "Invalid argument error. A call was made to a DataModel element that does not exist."; break }
case "202": { return "Element cannot have children. A call was made to an Element that does not support _children"; break  }
case "203": { return "Element is not an array.  Cannot have count. A call was made to an Element that does not support _count."; break  }
case "301": { return "Not initialized. The SCO has not yet been initialized.  It needs to call LMSInitialize() first."; break  }
case "401": { return "Not implemented error.  A call was made to a DataModel element that is not supported."; break  }
case "402": { return "Invalid set value, element is a keyword.  Keyword values cannot be changed"; break  }
case "403": { return "Element is read only.  A call was made to set the value of a read-only element."; break  }
case "404": { return "Element is write only.  A call was made to get the value of a write-only element."; break  }
case "405": { return "Incorrect Data Type.  The syntax of a call to change an element was incorrect."; break  }
default:    { return ""; break }}
}
function scoCheckDataTypeAndVocab (element, value, datatype){
switch (datatype){
case "CMIBlank":   { return checkCMIBlank(value); break }
case "CMIBoolean": { return checkCMIBoolean(value); break  }
case "CMIDecimal": { return checkCMIDecimal(value); break }
case "CMIFeedback": { return  checkCMIFeedback(element, value); break  }
case "CMIIdentifier": { return  checkCMIIdentifier(value); break  }
case "CMIInteger": { return checkCMIInteger(value); break  }
case "CMISInteger": { return checkCMISInteger(element, value); break  }
case "CMIString255": { return checkCMIString255(value); break  }
case "CMIString4096": { return checkCMIString4096(value); break  }
case "CMITime": { return checkCMITime(value); break  }
case "CMITimespan": { return checkCMITimespan(value); break  }
case "CMIVocabularyCredit": { return checkCMIVocabularyCredit(value); break  }
case "CMIVocabularyStatus": { return checkCMIVocabularyStatus(element, value); break  }
case "CMIVocabularyEntry": { return checkCMIVocabularyEntry(value); break  }
case "CMIVocabularyMode": { return checkCMIVocabularyMode(value); break  }
case "CMIVocabularyExit": { return checkCMIVocabularyExit(value); break  }
case "CMIVocabularyTimeLimitAction": { return checkCMIVocabularyTimeLimitAction(value); break  }
case "CMIVocabularyInteraction": { return checkCMIVocabularyInteraction(value); break  }
case "CMIVocabularyResult": { return checkCMIVocabularyResult(value); break  }
case "CMIDecimalOrCMIBlank": { return checkCMIDecimalOrCMIBlank(value); break  }
default:    { return "true"; break }}
}
function checkCMIDecimalOrCMIBlank(value){
var isBlank=checkCMIBlank(value);
var isCMIDecimal=checkCMIDecimal(value);
if(isBlank=="true"||isCMIDecimal=="true"){
if(value > 100||value < 0){
return "false";
}else{
return "true";
}}else{
return "false";
}}
function checkCMIVocabularyResult(value){
var ans=checkCMIDecimal(value);
if(ans=="true"){
return "true";
}
if(value=="correct"||value=="wrong" ||
value=="unanticipated"||value=="neutral"){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyInteraction(value){
if(value=="true-false"||value=="choice" ||
value=="fill-in"||value=="matching" ||
value=="performance"||value=="likert" ||
value=="sequencing"||value=="numeric"){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyTimeLimitAction(value){
if(value=="exit,message"||value=="exit,no message" ||
value=="continue,message"||value=="continue,no message"){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyExit(value){
if(value=="time-out"||value=="suspend" ||
value=="logout"||value==""){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyMode(value){
if(value=="normal"||value=="review"||value=="browse"){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyEntry(value){
if(value=="ab-initio"||value=="resume"||value==""){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyStatus(element, value){
if(element=="cmi.core.lesson_status"&&value=="not attempted"){
return false;
}
if(value=="passed"||value=="completed" ||
value=="failed"||value=="incomplete" ||
value=="browsed"||value=="not attempted"){
return "true";
}else{
return "false";
}}
function checkCMIVocabularyCredit(value){
if(value=="credit"||value=="no-credit"){
return "true";
}else{
return "false";
}}
function checkCMITimespan(value){
if(value.indexOf(":")==-1){
return "false";
}
var cmiArray=value.split(":");
if(cmiArray.length < 3){
return "false";
}
if(cmiArray[0].length < 2||cmiArray[0].length > 4){
return "false";
}
if(cmiArray[1].length!=2){
return "false";
}
if(isNaN(cmiArray[0])||isNaN(cmiArray[1])||isNaN(cmiArray[2])){
return "false";
}
if(parseInt(cmiArray[0]) < 0){
return "false";
}
if(parseInt(cmiArray[1]) < 0){
return "false";
}
if(cmiArray[2].indexOf(".")!=-1){
var cmiDecArray=cmiArray[2].split(".");
if(cmiDecArray.length!=2){
return "false";
}
if(isNaN(cmiDecArray[0])||isNaN(cmiDecArray[1])){
return "false";
}
if(cmiDecArray[0].length!=2){
return "false";
}
if(parseInt(cmiDecArray[0]) > 59){
return "false";
}
if(cmiDecArray[1].length > 2){
return "false";
}}else{
if(cmiArray[2].length!=2){
return "false";
}
if(parseInt(cmiArray[2]) > 59){
return "false";
}}
return "true";
}
function checkCMITime(value){
if(value.indexOf(":")==-1){
return "false";
}
var cmiArray=value.split(":");
if(cmiArray.length < 3){
return "false";
}
if(cmiArray[0].length!=2||cmiArray[1].length!=2){
return "false";
}
if(isNaN(cmiArray[0])||isNaN(cmiArray[1])||isNaN(cmiArray[2])){
return "false";
}
if(parseInt(cmiArray[0]) < 0||parseInt(cmiArray[0]) > 23){
return "false";
}
if(parseInt(cmiArray[1]) < 0||parseInt(cmiArray[1]) > 59){
return "false";
}
if(cmiArray[2].indexOf(".")!=-1){
var cmiDecArray=cmiArray[2].split(".");
if(cmiDecArray.length!=2){
return "false";
}
if(isNaN(cmiDecArray[0])||isNaN(cmiDecArray[1])){
return "false";
}
if(cmiDecArray[0].length!=2){
return "false";
}
if(parseInt(cmiDecArray[0]) > 59){
return "false";
}
if(cmiDecArray[1].length > 2){
return "false";
}}else{
if(cmiArray[2].length!=2){
return "false";
}
if(parseInt(cmiArray[2]) > 59){
return "false";
}}
return "true";
}
function checkCMIString4096(value){
if(value.length <=4096){
return "true";
}else{
return "false";
}}
function checkCMIString255(value){
if(value.length <=255){
return "true";
}else{
return "false";
}}
function checkCMISInteger(element, value){
if(isNaN(value)){
return "false";
}else{
var num=parseInt(value);
if(num >=-32768&&num <=32768){
if(element=="cmi.student_preference.audio"){
if(num < -1||num > 100){
return "false";
}else{
return "true";
}}
else if(element=="cmi.student_preference.speed"){
if(num < -100||num > 100){
return "false";
}else{
return "true";
}}
else if(element=="cmi.student_preference.text"){
if(num < -1||num > 1){
return "false";
}else{
return "true";
}}else{
return "true";
}}else{
return "false";
}}
}
function checkCMIInteger(value){
if(isNaN(value)){
return "false";
}else{
var num=parseInt(value);
if(num >=0&&num <=65536){
return "true";
}else{
return "false";
}}
}
function checkCMIIdentifier(value){
var SPACE=' ';
var TAB='\t';
var CRETURN='\r';
var LINEFEED='\n';
if(value.indexOf(SPACE)==-1&&value.indexOf(TAB)==-1
&& value.indexOf(CRETURN)==-1&&value.indexOf(LINEFEED)==-1){
if(value.length > 0&&value.length < 256){
return "true";
}else{
return "false";
}}else{
return "false";
}}
function checkCMIFeedback(element, value){
if(looseChecking=="false"){
var cmiArray=element.split(".");
if(isNaN(cmiArray[2])){
return "false";
}
var res=API.LMSGetValue("cmi.interactions._count");
if(parseInt(cmiArray[2]) >=parseInt(res)){
return "false";
}
var theType="cmi.interactions.intArray("+cmiArray[2]+").type";
elementObj=eval("API."+theType+";");
if(elementObj==null){
return "false";
}
datatype=elementObj.cmivalue;
if(datatype==null){
return "false";
}
switch (datatype){
case "true-false":   { return checkTrueFalse(value); break }
case "choice":   { return checkChoice(value); break }
case "fill-in":   { return checkFillIn(value); break }
case "numeric":   { return checkCMIDecimal(value); break }
case "likert":   { return checkLikert(value); break }
case "matching":   { return checkMatching(value); break }
case "performance":   { return checkCMIString255(value); break }
case "sequencing":   { return checkSequencing(value); break }
default:   { return "false"; break }}
}else{
return "true";
}}
function checkMatching(value){
var TEST_VAL=/^[a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1}$/;
var TEST_VAL2=/^[a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1},{1}([a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1},{1})*[a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1}$/;
var TEST_VAL3=/^[a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1},{1}([a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1},{1})*[a-z,A-Z,0-9]{1}.{1}[a-z,A-Z,0-9]{1}$/;
if(TEST_VAL.test(value)){
return "true";
}
else if(TEST_VAL2.test(value)){
return "true";
}
else if(TEST_VAL3.test(value)){
return "true";
}else{
return "false";
}}
function checkSequencing(value){
var TEST_VAL=/^[a-z,A-Z,0-9]{1}$/;
var TEST_VAL2=/^[a-z,A-Z,0-9]{1},{1}([a-z,A-Z,0-9],)*[a-z,A-Z,0-9]{1}$/;
if(TEST_VAL.test(value)){
return "true";
}
else if(TEST_VAL2.test(value)){
return "true";
}else{
return "false";
}}
function checkChoice(value){
var TEST_VAL=/^[a-z,A-Z,0-9]{1}$/;
var TEST_VAL2=/^[a-z,A-Z,0-9]{1},{1}([a-z,A-Z,0-9],)*[a-z,A-Z,0-9]{1}$/;
var TEST_VAL3=/^[a-z,A-Z,0-9]{1},{1}([a-z,A-Z,0-9],)*[a-z,A-Z,0-9]{1}$/;
if(TEST_VAL.test(value)){
return "true";
}
else if(TEST_VAL2.test(value)){
return "true";
}
else if(TEST_VAL3.test(value)){
return "true";
}else{
return "false";
}}
function checkFillIn(value){
return checkCMIString255(value);
}
function checkTrueFalse(value){
if(value=="0"||value=="1"||value=="t"||value=="f"||value=="T"||value=="F"){
return "true";
}else{
return "false";
}}
function checkLikert(value){
if(value.length==0){
return "true";
}
if(value.length > 1){
return "false";
}
var TEST_VAL=/^[a-z,A-Z,0-9]{1}$/;
if(TEST_VAL.test(value)){
return "true";
}else{
return "false";
}}
function checkCMIDecimal(value){
if(isNaN(value)){
return "false";
}else{
return "true";
}}
function checkCMIBoolean(value){
if(value=="true"||value=="false"){
return "true";
}else{
return "false";
}}
function checkCMIBlank(value){
if(value!=""){
return "false";
}else{
return "true";
}}
function CMIModel (){
this._version=new CMIComponent("_version", "3.4", "readonly", "");
this.core=new CMICoreModel;
this.suspend_data=new CMIComponent("suspend_data", "", "both", "CMIString4096");
this.launch_data=new CMIComponent("launch_data","","readonly", "CMIString4096");
this.comments=new CMIComponent("comments","","both", "CMIString4096");
this.comments_from_lms=new CMIComponent("comments_from_lms","","readonly", "CMIString4096");
this.objectives=new ObjectivesModel;
this.student_data=new StudentDataModel;
this.student_preference=new StudentPreferenceModel;
this.interactions=new InteractionsModel;
}
function CMICoreModel(){
this._children=new CMIComponent("_children", "student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time", "readonly", "CMIString255");
this.student_id=new CMIComponent("student_id", "", "readonly", "CMIIdentifier");
this.student_name=new CMIComponent("student_name", "", "readonly", "CMIString255");
this.lesson_location=new CMIComponent("lesson_location", "", "both", "CMIString255");
this.credit=new CMIComponent("credit", "", "readonly", "CMIVocabularyCredit");
this.lesson_status=new CMIComponent("lesson_status", "", "both", "CMIVocabularyStatus");
this.entry=new CMIComponent("entry","","readonly", "CMIVocabularyEntry");
this.score=new CMIScore;
this.total_time=new CMIComponent("total_time", "", "readonly", "CMITimespan");
this.lesson_mode=new CMIComponent("lesson_mode", "", "readonly", "CMIVocabularyMode");
this.exit=new CMIComponent("exit", "", "writeonly", "CMIVocabularyExit");
this.session_time=new CMIComponent("session_time", "", "writeonly", "CMITimespan");
}
function CMIScore(){
this._children=new  CMIComponent("_children", "raw,min,max", "readonly", "CMIString255");
this.raw=new CMIComponent("raw", "", "both", "CMIDecimalOrCMIBlank");
this.max=new CMIComponent("max", "", "both", "CMIDecimalOrCMIBlank");
this.min=new CMIComponent("min", "", "both", "CMIDecimalOrCMIBlank");
}
function StudentPreferenceModel(){
this._children=new CMIComponent("_children", "audio,language,speed,text", "readonly", "CMIString255");
this.audio=new CMIComponent("audio", "0", "both", "CMISInteger");
this.language=new CMIComponent("language", "", "both", "CMIString255");
this.speed=new CMIComponent("speed", "0", "both", "CMISInteger");
this.text=new CMIComponent("text", "0", "both", "CMISInteger");
}
function StudentDataModel(){
this._children=new CMIComponent("_count", "mastery_score,max_time_allowed,time_limit_action", "readonly", "CMIString255");
this.mastery_score=new CMIComponent("mastery_score", "", "readonly", "CMIDecimal");
this.max_time_allowed=new CMIComponent("max_time_allowed", "", "readonly", "CMITimespan");
this.time_limit_action=new CMIComponent("time_limit_action", "", "readonly", "CMIVocabularyTimeLimitAction");
}
function ObjectivesModel(){
this._children=new CMIComponent("_children", "id,score,status", "readonly", "CMIString255");
this._count=new CMIComponent("_count", 0, "readonly", "CMIInteger");
this.objArray=ObjectiveArrayModel;
this.objArr=new Array();
}
function ObjectiveArrayModel(index){
if(index>this._count.cmivalue-1){
if(index==this._count.cmivalue){
this.objArr[index]=new singleObjectiveModel();
this._count.cmivalue=this._count.cmivalue + 1;
return this.objArr[index];
}else{
return "false";
}}else{
return this.objArr[index];
}}
function singleObjectiveModel(){
this.id=new CMIComponent("id", "", "both", "CMIIdentifier");
this.score=new objectiveScoreModel;
this.status=new CMIComponent("status", "", "both", "CMIVocabularyStatus");
}
function objectiveScoreModel(){
this._children=new CMIComponent("_children", "raw,min,max", "readonly", "CMIString255");
this.raw=new CMIComponent("raw", "", "both", "CMIDecimalOrCMIBlank");
this.min=new CMIComponent("min", "", "both", "CMIDecimalOrCMIBlank");
this.max=new CMIComponent("max", "", "both", "CMIDecimalOrCMIBlank");
}
function InteractionsModel(){
this._children=new CMIComponent("_children", "id,objectives,time,type,correct_responses,weighting,student_response,result,latency", "readonly", "CMIString255");
this._count=new CMIComponent("_count", 0, "readonly", "CMIInteger");
this.intArray=InteractionsArrayModel;
this.intArr=new Array();
}
function InteractionsArrayModel(index){
if(index>this._count.cmivalue-1){
if(index==this._count.cmivalue){
this.intArr[index]=new singleInteractionModel();
this._count.cmivalue=this._count.cmivalue + 1;
return this.intArr[index];
}else{
return "false";
}}else{
return this.intArr[index];
}}
function singleInteractionModel(){
this.id=new CMIComponent("id", "", "writeonly", "CMIIdentifier");
this.objectives=new ObjectivesInteractionModel;
this.time=new CMIComponent("time", "", "writeonly", "CMITime");
this.type=new CMIComponent("type", "", "writeonly", "CMIVocabularyInteraction");
this.correct_responses=new CorrectResponsesInteractionModel;
this.weighting=new CMIComponent("weighting", "", "writeonly", "CMIDecimal");
this.student_response=new CMIComponent("student_response", "", "writeonly", "CMIFeedback");
this.result=new CMIComponent("result", "", "writeonly", "CMIVocabularyResult");
this.latency=new CMIComponent("latency", "", "writeonly", "CMITimespan");
}
function ObjectivesInteractionModel(){
this._count=new CMIComponent("_count", 0, "readonly", "CMIInteger");
this.objectivesInteractionArray=SingleObjectivesInteractionModel;
this.objectivesInteractionArr=new Array();
}
function SingleObjectivesInteractionModel(index){
if(index>this._count.cmivalue-1){
if(index==this._count.cmivalue){
this.objectivesInteractionArr[index]=new SingleItemObjectivesInteractionModel();
this._count.cmivalue=this._count.cmivalue + 1;
return this.objectivesInteractionArr[index];
}else{
return "false";
}}else{
return this.objectivesInteractionArr[index];
}}
function SingleItemObjectivesInteractionModel(){
this.id=new CMIComponent("id", "", "writeonly", "CMIIdentifier");
}
function CorrectResponsesInteractionModel(){
this._count=new CMIComponent("_count", 0, "readonly", "CMIInteger");
this.correctResponsesInteractionArray=SingleCorrectResponsesInteractionModel;
this.correctResponsesInteractionArr=new Array();
}
function SingleCorrectResponsesInteractionModel(index){
if(index>this._count.cmivalue-1){
if(index==this._count.cmivalue){
this.correctResponsesInteractionArr[index]=new SingleItemCorrectResponsesInteractionModel();
this._count.cmivalue=this._count.cmivalue + 1;
return this.correctResponsesInteractionArr[index];
}else{
return "false";
}}else{
return this.correctResponsesInteractionArr[index];
}}
function SingleItemCorrectResponsesInteractionModel(){
this.pattern=new CMIComponent("pattern", "", "writeonly", "CMIFeedback");
}
function showCurrentModelState(infoOrForm){
var divider="";
var titles="";
if(infoOrForm=="info"){
divider="\n";
equals="=";
titles="Current client CMI Datamodel\n\n";
}else{
equals="~r@l@ad~";
divider="^r@l@ad^";
titles="";
}
a="cmi.core.student_id" + equals + API.cmi.core.student_id.cmivalue + divider;
b="cmi.core.student_name" + equals + API.cmi.core.student_name.cmivalue + divider;
c="cmi.core.lesson_location" + equals + API.cmi.core.lesson_location.cmivalue + divider;
d="cmi.core.credit" + equals + API.cmi.core.credit.cmivalue + divider;
e="cmi.core.lesson_status" + equals + API.cmi.core.lesson_status.cmivalue + divider;
f="cmi.core.entry" + equals + API.cmi.core.entry.cmivalue + divider;
g="cmi.core.score.raw" + equals + API.cmi.core.score.raw.cmivalue + divider;
h="cmi.core.score.max" + equals + API.cmi.core.score.max.cmivalue + divider;
i="cmi.core.score.min" + equals + API.cmi.core.score.min.cmivalue + divider;
j="cmi.core.total_time" + equals + API.cmi.core.total_time.cmivalue + divider;
k="cmi.core.lesson_mode" + equals + API.cmi.core.lesson_mode.cmivalue + divider;
l="cmi.core.exit" + equals + API.cmi.core.exit.cmivalue + divider;
m="cmi.core.session_time" + equals + API.cmi.core.session_time.cmivalue + divider;
n="cmi.suspend_data" + equals + API.cmi.suspend_data.cmivalue + divider;
o="cmi.launch_data" + equals + API.cmi.launch_data.cmivalue + divider;
p="cmi.comments" + equals + API.cmi.comments.cmivalue + divider;
q="cmi.comments_from_lms" + equals + API.cmi.comments_from_lms.cmivalue + divider;
r="cmi.objectives._count" + equals + API.cmi.objectives._count.cmivalue + divider;
var s="";
var objectivesCount=API.cmi.objectives._count.cmivalue;
for (count=0; count < objectivesCount; count++){
objHandle=API.cmi.objectives.objArray(count);
idval=objHandle.id.cmivalue;
scoreRaw=objHandle.score.raw.cmivalue;
scoreMax=objHandle.score.max.cmivalue;
scoreMin=objHandle.score.min.cmivalue;
statval=objHandle.status.cmivalue;
s=s + "cmi.objectives." + count + ".id" + equals + idval + divider;
s=s + "cmi.objectives." + count + ".score.raw" + equals + scoreRaw + divider;
s=s + "cmi.objectives." + count + ".score.max" + equals + scoreMax + divider;
s=s + "cmi.objectives." + count + ".score.min" + equals + scoreMin + divider;
s=s + "cmi.objectives." + count + ".status" + equals + statval + divider;
}
v="cmi.student_data.mastery_score" + equals + API.cmi.student_data.mastery_score.cmivalue + divider;
w="cmi.student_data.max_time_allowed" + equals + API.cmi.student_data.max_time_allowed.cmivalue + divider;
x="cmi.student_data.time_limit_action" + equals + API.cmi.student_data.time_limit_action.cmivalue + divider;
y="cmi.student_preference.audio" + equals + API.cmi.student_preference.audio.cmivalue + divider;
z="cmi.student_preference.language" + equals + API.cmi.student_preference.language.cmivalue + divider;
zz="cmi.student_preference.speed" + equals + API.cmi.student_preference.speed.cmivalue + divider;
zzz="cmi.student_preference.text" + equals + API.cmi.student_preference.text.cmivalue + divider;
t="cmi.interactions._count" + equals + API.cmi.interactions._count.cmivalue + divider;
var u="";
var interactionsCount=API.cmi.interactions._count.cmivalue
for (intcount=0; intcount < interactionsCount; intcount++){
intHandle=API.cmi.interactions.intArray(intcount);
idval=intHandle.id.cmivalue;
u=u + "cmi.interactions." + intcount + ".id" + equals + idval + divider;
interObjCount=intHandle.objectives._count.cmivalue;
u=u + "cmi.interactions." + intcount + ".objectives._count" + equals + interObjCount + divider;
for (objcount=0; objcount < interObjCount; objcount++){
interactionObjectiveHandle=intHandle.objectives.objectivesInteractionArray(objcount);
objid=interactionObjectiveHandle.id.cmivalue;
u=u + "cmi.interactions." + intcount + ".objectives." + objcount + ".id" + equals + objid + divider;
}
srCount=intHandle.correct_responses._count.cmivalue;
u=u + "cmi.interactions." + intcount + ".correct_responses._count" + equals + srCount + divider;
for (objcount=0; objcount < srCount; objcount++){
interactionSRHandle=intHandle.correct_responses.correctResponsesInteractionArray(objcount);
patternid=interactionSRHandle.pattern.cmivalue;
u=u + "cmi.interactions." + intcount + ".correct_responses." + objcount + ".pattern" + equals + patternid + divider;
}
timeval=intHandle.time.cmivalue;
u=u + "cmi.interactions." + intcount + ".time" + equals + timeval + divider;
typeval=intHandle.type.cmivalue;
u=u + "cmi.interactions." + intcount + ".type" + equals + typeval + divider;
weightingval=intHandle.weighting.cmivalue;
u=u + "cmi.interactions." + intcount + ".weighting" + equals + weightingval + divider;
student_responseval=intHandle.student_response.cmivalue;
u=u + "cmi.interactions." + intcount + ".student_response" + equals + student_responseval + divider;
resultval=intHandle.result.cmivalue;
u=u + "cmi.interactions." + intcount + ".result" + equals + resultval + divider;
latencyval=intHandle.latency.cmivalue;
u=u + "cmi.interactions." + intcount + ".latency" + equals + latencyval + divider;
}
var alertString=titles+a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+r+s+v+w+x+y+z+zz+zzz+t+u;
return alertString;
}
function viewModel(){
return showCurrentModelState("info");
}
function load_scorm_lms_api(){
let src=document.getElementsByTagName("iframe")[0].getAttribute('data-src');
var skey=src;
if(!isEmpty(window.scorm_wplms_data)){
document.getElementsByTagName("iframe")[0].setAttribute('src',src);
Utils.launchSCO();
}else{
document.getElementsByTagName("iframe")[0].setAttribute('src',src);
Utils.launchSCO();
}}
function fetchWPLMSSCORMData(){
return new Promise(function(resolve){
let src=document.getElementsByTagName("iframe")[0].getAttribute('data-src');
var skey=src;
var value=localStorage.getItem(skey);
if(!value){
value={
"cmi.core._children": "student_id,student_name,lesson_status,lesson_location,lesson_mode,score,credit,entry,exit,session_time,total_time",
"cmi.core.score._children": "raw",
"cmi.core.student_id": (!isEmpty(window.scorm_wplms_data))?scorm_wplms_data.user_email:'SAMPLE0001',
"cmi.core.student_name": (!isEmpty(window.scorm_wplms_data))?scorm_wplms_data.user_name:'SAMPLE0001',
"cmi.core.lesson_status": "incomplete",
"cmi.core.score.raw": "",
"cmi.core.lesson_location": "",
"cmi.suspend_data": "",
"cmi.core.session_time": "0000:00:00.00",
"cmi.core.credit": "credit",
"cmi.core.entry": "ab-initio",
"cmi.core.lesson_mode": "normal",
"cmi.core.exit": "suspend",
"cmi.core.total_time": "00:00:00.00",
}}else{
if(isJSONString(value)){
value=JSON.parse(value);
}}
if(!isEmpty(value)&&!isEmpty(window.scorm_wplms_data)){
var nonce=window.scorm_wplms_data.security_nonce,
xhr=new XMLHttpRequest();
xhr.open('POST', window.wplms_course_data.api_url+'/scorm/scormdata/get?force');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.onload=function(){
if(xhr.status===200&&xhr.responseText!==nonce){
let data=JSON.parse(xhr.responseText);
if(data&&data.status&&data.data){
value['cmi.suspend_data']=data.data;
localStorage.setItem(skey,JSON.stringify(value));
resolve();
}else{
localStorage.removeItem(skey);
resolve();
}}
else if(xhr.status!==200){
console.log('Something went wrong.Request failed.' + xhr.status);
resolve();
}};
xhr.send(encodeURI('action=save_scorm_data&token='+window.scorm_wplms_data.token+'&security=' + nonce+'&key='+skey+'&data='+value+'&module_id='+window.scorm_wplms_data.module_id+'&course_id='+window.scorm_wplms_data.course_id+'&type='+window.scorm_wplms_data.type));
}else{
resolve();
}});
};
fetchWPLMSSCORMData().then(function(){
setTimeout(function(){
load_scorm_lms_api();
},500);
window.addEventListener("load",function(event){
load_scorm_lms_api();
});
});
function isJSONString(str){
if(typeof str!=="string") return false;
try {
const parsed=JSON.parse(str);
return typeof parsed==="object"&&parsed!==null;
} catch (e){
return false;
}}
function deepParseJSON(obj){
if(typeof obj==="string"){
try {
const parsed=JSON.parse(obj);
return deepParseJSON(parsed);
} catch (e){
return obj;
}}else if(Array.isArray(obj)){
return obj.map(item=> deepParseJSON(item));
}else if(typeof obj==="object"&&obj!==null){
const result={};
for (const key in obj){
result[key]=deepParseJSON(obj[key]);
}
return result;
}
return obj;
}
function isEmpty(obj){
if(obj==null) return true;
if(typeof obj=='number'&&obj!=0) return false;
if(Array.isArray(obj)||typeof obj==='string'||obj instanceof String) return obj.length===0;
for (var key in obj) if(obj.hasOwnProperty(key)) return false;
return true;
}
function wplms_send_xhr(type,headers,data,url){
return new Promise(function(resolve, reject){
if(!isEmpty(window.scorm_wplms_data)){
var nonce=window.scorm_wplms_data.security_nonce,
xhr=new XMLHttpRequest();
xhr.open(type+'?nocache', url);
if(headers){
for (var key in headers){
if(headers.hasOwnProperty(key)){
xhr.setRequestHeader(key, headers[key]);
}}
}
xhr.onload=function(){
if(xhr.status===200&&xhr.responseText!==nonce){
let resp=JSON.parse(xhr.responseText);
resolve(resp);
}
else if(xhr.status!==200){
console.log('Something went wrong.Request failed.' + xhr.status);
resolve();
}};
xhr.send(encodeURI(data));
}else{
resolve();
}});
}});