|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 // This file is part of Moodle - http://moodle.org/ 00003 // 00004 // Moodle is free software: you can redistribute it and/or modify 00005 // it under the terms of the GNU General Public License as published by 00006 // the Free Software Foundation, either version 3 of the License, or 00007 // (at your option) any later version. 00008 // 00009 // Moodle is distributed in the hope that it will be useful, 00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00012 // GNU General Public License for more details. 00013 // 00014 // You should have received a copy of the GNU General Public License 00015 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00016 00017 require_once($CFG->dirroot.'/mod/scorm/locallib.php'); 00018 00019 if (isset($userdata->status)) { 00020 if ($userdata->status == '') { 00021 $userdata->entry = 'ab-initio'; 00022 } else { 00023 if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) { 00024 $userdata->entry = 'resume'; 00025 } else { 00026 $userdata->entry = ''; 00027 } 00028 } 00029 } 00030 if (!isset($currentorg)) { 00031 $currentorg = ''; 00032 } 00033 ?> 00034 // 00035 // SCORM 1.2 API Implementation 00036 // 00037 function SCORMapi1_2() { 00038 // Standard Data Type Definition 00039 CMIString256 = '^[\\u0000-\\uffff]{0,255}$'; 00040 CMIString4096 = '^[\\u0000-\\uffff]{0,4096}$'; 00041 CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$'; 00042 CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$'; 00043 CMIInteger = '^\\d+$'; 00044 CMISInteger = '^-?([0-9]+)$'; 00045 CMIDecimal = '^-?([0-9]{0,3})(\.[0-9]{1,2})?$'; 00046 CMIIdentifier = '^[\\u0021-\\u007E]{0,255}$'; 00047 CMIFeedback = CMIString256; // This must be redefined 00048 CMIIndex = '[._](\\d+).'; 00049 // Vocabulary Data Type Definition 00050 CMIStatus = '^passed$|^completed$|^failed$|^incomplete$|^browsed$'; 00051 CMIStatus2 = '^passed$|^completed$|^failed$|^incomplete$|^browsed$|^not attempted$'; 00052 CMIExit = '^time-out$|^suspend$|^logout$|^$'; 00053 CMIType = '^true-false$|^choice$|^fill-in$|^matching$|^performance$|^sequencing$|^likert$|^numeric$'; 00054 CMIResult = '^correct$|^wrong$|^unanticipated$|^neutral$|^([0-9]{0,3})?(\.[0-9]{1,2})?$'; 00055 NAVEvent = '^previous$|^continue$'; 00056 // Children lists 00057 cmi_children = 'core,suspend_data,launch_data,comments,objectives,student_data,student_preference,interactions'; 00058 core_children = 'student_id,student_name,lesson_location,credit,lesson_status,entry,score,total_time,lesson_mode,exit,session_time'; 00059 score_children = 'raw,min,max'; 00060 comments_children = 'content,location,time'; 00061 objectives_children = 'id,score,status'; 00062 correct_responses_children = 'pattern'; 00063 student_data_children = 'mastery_score,max_time_allowed,time_limit_action'; 00064 student_preference_children = 'audio,language,speed,text'; 00065 interactions_children = 'id,objectives,time,type,correct_responses,weighting,student_response,result,latency'; 00066 // Data ranges 00067 score_range = '0#100'; 00068 audio_range = '-1#100'; 00069 speed_range = '-100#100'; 00070 weighting_range = '-100#100'; 00071 text_range = '-1#1'; 00072 // The SCORM 1.2 data model 00073 var datamodel = { 00074 'cmi._children':{'defaultvalue':cmi_children, 'mod':'r', 'writeerror':'402'}, 00075 'cmi._version':{'defaultvalue':'3.4', 'mod':'r', 'writeerror':'402'}, 00076 'cmi.core._children':{'defaultvalue':core_children, 'mod':'r', 'writeerror':'402'}, 00077 'cmi.core.student_id':{'defaultvalue':'<?php echo $userdata->student_id ?>', 'mod':'r', 'writeerror':'403'}, 00078 'cmi.core.student_name':{'defaultvalue':'<?php echo $userdata->student_name ?>', 'mod':'r', 'writeerror':'403'}, 00079 'cmi.core.lesson_location':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_location'})?$userdata->{'cmi.core.lesson_location'}:'' ?>', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00080 'cmi.core.credit':{'defaultvalue':'<?php echo $userdata->credit ?>', 'mod':'r', 'writeerror':'403'}, 00081 'cmi.core.lesson_status':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_status'})?$userdata->{'cmi.core.lesson_status'}:'' ?>', 'format':CMIStatus, 'mod':'rw', 'writeerror':'405'}, 00082 'cmi.core.entry':{'defaultvalue':'<?php echo $userdata->entry ?>', 'mod':'r', 'writeerror':'403'}, 00083 'cmi.core.score._children':{'defaultvalue':score_children, 'mod':'r', 'writeerror':'402'}, 00084 'cmi.core.score.raw':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.score.raw'})?$userdata->{'cmi.core.score.raw'}:'' ?>', 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00085 'cmi.core.score.max':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.score.max'})?$userdata->{'cmi.core.score.max'}:'' ?>', 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00086 'cmi.core.score.min':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.score.min'})?$userdata->{'cmi.core.score.min'}:'' ?>', 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00087 'cmi.core.total_time':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.total_time'})?$userdata->{'cmi.core.total_time'}:'00:00:00' ?>', 'mod':'r', 'writeerror':'403'}, 00088 'cmi.core.lesson_mode':{'defaultvalue':'<?php echo $userdata->mode ?>', 'mod':'r', 'writeerror':'403'}, 00089 'cmi.core.exit':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.exit'})?$userdata->{'cmi.core.exit'}:'' ?>', 'format':CMIExit, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00090 'cmi.core.session_time':{'format':CMITimespan, 'mod':'w', 'defaultvalue':'00:00:00', 'readerror':'404', 'writeerror':'405'}, 00091 'cmi.suspend_data':{'defaultvalue':'<?php echo isset($userdata->{'cmi.suspend_data'})?$userdata->{'cmi.suspend_data'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'}, 00092 'cmi.launch_data':{'defaultvalue':'<?php echo isset($userdata->datafromlms)?$userdata->datafromlms:'' ?>', 'mod':'r', 'writeerror':'403'}, 00093 'cmi.comments':{'defaultvalue':'<?php echo isset($userdata->{'cmi.comments'})?$userdata->{'cmi.comments'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'}, 00094 // deprecated evaluation attributes 00095 'cmi.evaluation.comments._count':{'defaultvalue':'0', 'mod':'r', 'writeerror':'402'}, 00096 'cmi.evaluation.comments._children':{'defaultvalue':comments_children, 'mod':'r', 'writeerror':'402'}, 00097 'cmi.evaluation.comments.n.content':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00098 'cmi.evaluation.comments.n.location':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00099 'cmi.evaluation.comments.n.time':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'}, 00100 'cmi.comments_from_lms':{'mod':'r', 'writeerror':'403'}, 00101 'cmi.objectives._children':{'defaultvalue':objectives_children, 'mod':'r', 'writeerror':'402'}, 00102 'cmi.objectives._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00103 'cmi.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'rw', 'writeerror':'405'}, 00104 'cmi.objectives.n.score._children':{'pattern':CMIIndex, 'mod':'r', 'writeerror':'402'}, 00105 'cmi.objectives.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00106 'cmi.objectives.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00107 'cmi.objectives.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00108 'cmi.objectives.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'}, 00109 'cmi.student_data._children':{'defaultvalue':student_data_children, 'mod':'r', 'writeerror':'402'}, 00110 'cmi.student_data.mastery_score':{'defaultvalue':'<?php echo isset($userdata->masteryscore)?$userdata->masteryscore:'' ?>', 'mod':'r', 'writeerror':'403'}, 00111 'cmi.student_data.max_time_allowed':{'defaultvalue':'<?php echo isset($userdata->maxtimeallowed)?$userdata->maxtimeallowed:'' ?>', 'mod':'r', 'writeerror':'403'}, 00112 'cmi.student_data.time_limit_action':{'defaultvalue':'<?php echo isset($userdata->timelimitaction)?$userdata->timelimitaction:'' ?>', 'mod':'r', 'writeerror':'403'}, 00113 'cmi.student_preference._children':{'defaultvalue':student_preference_children, 'mod':'r', 'writeerror':'402'}, 00114 'cmi.student_preference.audio':{'defaultvalue':'0', 'format':CMISInteger, 'range':audio_range, 'mod':'rw', 'writeerror':'405'}, 00115 'cmi.student_preference.language':{'defaultvalue':'', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00116 'cmi.student_preference.speed':{'defaultvalue':'0', 'format':CMISInteger, 'range':speed_range, 'mod':'rw', 'writeerror':'405'}, 00117 'cmi.student_preference.text':{'defaultvalue':'0', 'format':CMISInteger, 'range':text_range, 'mod':'rw', 'writeerror':'405'}, 00118 'cmi.interactions._children':{'defaultvalue':interactions_children, 'mod':'r', 'writeerror':'402'}, 00119 'cmi.interactions._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00120 'cmi.interactions.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00121 'cmi.interactions.n.objectives._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00122 'cmi.interactions.n.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00123 'cmi.interactions.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00124 'cmi.interactions.n.type':{'pattern':CMIIndex, 'format':CMIType, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00125 'cmi.interactions.n.correct_responses._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00126 'cmi.interactions.n.correct_responses.n.pattern':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00127 'cmi.interactions.n.weighting':{'pattern':CMIIndex, 'format':CMIDecimal, 'range':weighting_range, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00128 'cmi.interactions.n.student_response':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00129 'cmi.interactions.n.result':{'pattern':CMIIndex, 'format':CMIResult, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00130 'cmi.interactions.n.latency':{'pattern':CMIIndex, 'format':CMITimespan, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00131 'nav.event':{'defaultvalue':'', 'format':NAVEvent, 'mod':'w', 'readerror':'404', 'writeerror':'405'} 00132 }; 00133 // 00134 // Datamodel inizialization 00135 // 00136 var cmi = new Object(); 00137 cmi.core = new Object(); 00138 cmi.core.score = new Object(); 00139 cmi.objectives = new Object(); 00140 cmi.student_data = new Object(); 00141 cmi.student_preference = new Object(); 00142 cmi.interactions = new Object(); 00143 // deprecated evaluation attributes 00144 cmi.evaluation = new Object(); 00145 cmi.evaluation.comments = new Object(); 00146 00147 // Navigation Object 00148 var nav = new Object(); 00149 00150 for (element in datamodel) { 00151 if (element.match(/\.n\./) == null) { 00152 if ((typeof eval('datamodel["'+element+'"].defaultvalue')) != 'undefined') { 00153 eval(element+' = datamodel["'+element+'"].defaultvalue;'); 00154 } else { 00155 eval(element+' = "";'); 00156 } 00157 } 00158 } 00159 00160 <?php 00161 // reconstitute objectives 00162 scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.objectives', array('score')); 00163 scorm_reconstitute_array_element($scorm->version, $userdata, 'cmi.interactions', array('objectives', 'correct_responses')); 00164 ?> 00165 00166 if (cmi.core.lesson_status == '') { 00167 cmi.core.lesson_status = 'not attempted'; 00168 } 00169 00170 // 00171 // API Methods definition 00172 // 00173 var Initialized = false; 00174 00175 function LMSInitialize (param) { 00176 errorCode = "0"; 00177 if (param == "") { 00178 if (!Initialized) { 00179 Initialized = true; 00180 errorCode = "0"; 00181 <?php 00182 if (scorm_debugging($scorm)) { 00183 echo 'LogAPICall("LMSInitialize", param, "", errorCode);'; 00184 } 00185 ?> 00186 return "true"; 00187 } else { 00188 errorCode = "101"; 00189 } 00190 } else { 00191 errorCode = "201"; 00192 } 00193 <?php 00194 if (scorm_debugging($scorm)) { 00195 echo 'LogAPICall("LMSInitialize", param, "", errorCode);'; 00196 } 00197 ?> 00198 return "false"; 00199 } 00200 00201 <?php 00202 // pull in the TOC callback 00203 require_once($CFG->dirroot.'/mod/scorm/datamodels/callback.js.php'); 00204 ?> 00205 00206 function LMSFinish (param) { 00207 errorCode = "0"; 00208 if (param == "") { 00209 if (Initialized) { 00210 Initialized = false; 00211 result = StoreData(cmi,true); 00212 if (nav.event != '') { 00213 if (nav.event == 'continue') { 00214 setTimeout('scorm_get_next();',500); 00215 } else { 00216 setTimeout('scorm_get_prev();',500); 00217 } 00218 } else { 00219 if (<?php echo $scorm->auto ?> == 1) { 00220 setTimeout('scorm_get_next();',500); 00221 } 00222 } 00223 <?php 00224 if (scorm_debugging($scorm)) { 00225 echo 'LogAPICall("LMSFinish", "AJAXResult", result, 0);'; 00226 } 00227 ?> 00228 result = ('true' == result) ? 'true' : 'false'; 00229 errorCode = (result == 'true')? '0' : '101'; 00230 <?php 00231 if (scorm_debugging($scorm)) { 00232 echo 'LogAPICall("LMSFinish", "result", result, 0);'; 00233 echo 'LogAPICall("LMSFinish", param, "", 0);'; 00234 } 00235 ?> 00236 // trigger TOC update 00237 var sURL = "<?php echo $CFG->wwwroot; ?>" + "/mod/scorm/prereqs.php?a=<?php echo $scorm->id ?>&scoid=<?php echo $scoid ?>&attempt=<?php echo $attempt ?>&mode=<?php echo $mode ?>¤torg=<?php echo $currentorg ?>&sesskey=<?php echo sesskey(); ?>"; 00238 YAHOO.util.Connect.asyncRequest('GET', sURL, this.connectPrereqCallback, null); 00239 return result; 00240 } else { 00241 errorCode = "301"; 00242 } 00243 } else { 00244 errorCode = "201"; 00245 } 00246 <?php 00247 if (scorm_debugging($scorm)) { 00248 echo 'LogAPICall("LMSFinish", param, "", errorCode);'; 00249 } 00250 ?> 00251 return "false"; 00252 } 00253 00254 function LMSGetValue (element) { 00255 errorCode = "0"; 00256 if (Initialized) { 00257 if (element !="") { 00258 expression = new RegExp(CMIIndex,'g'); 00259 elementmodel = String(element).replace(expression,'.n.'); 00260 if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") { 00261 if (eval('datamodel["'+elementmodel+'"].mod') != 'w') { 00262 element = String(element).replace(expression, "_$1."); 00263 elementIndexes = element.split('.'); 00264 subelement = 'cmi'; 00265 i = 1; 00266 while ((i < elementIndexes.length) && (typeof eval(subelement) != "undefined")) { 00267 subelement += '.'+elementIndexes[i++]; 00268 } 00269 if (subelement == element) { 00270 errorCode = "0"; 00271 <?php 00272 if (scorm_debugging($scorm)) { 00273 echo 'LogAPICall("LMSGetValue", element, eval(element), 0);'; 00274 } 00275 ?> 00276 return eval(element); 00277 } else { 00278 errorCode = "0"; // Need to check if it is the right errorCode 00279 } 00280 } else { 00281 errorCode = eval('datamodel["'+elementmodel+'"].readerror'); 00282 } 00283 } else { 00284 childrenstr = '._children'; 00285 countstr = '._count'; 00286 if (elementmodel.substr(elementmodel.length-childrenstr.length,elementmodel.length) == childrenstr) { 00287 parentmodel = elementmodel.substr(0,elementmodel.length-childrenstr.length); 00288 if ((typeof eval('datamodel["'+parentmodel+'"]')) != "undefined") { 00289 errorCode = "202"; 00290 } else { 00291 errorCode = "201"; 00292 } 00293 } else if (elementmodel.substr(elementmodel.length-countstr.length,elementmodel.length) == countstr) { 00294 parentmodel = elementmodel.substr(0,elementmodel.length-countstr.length); 00295 if ((typeof eval('datamodel["'+parentmodel+'"]')) != "undefined") { 00296 errorCode = "203"; 00297 } else { 00298 errorCode = "201"; 00299 } 00300 } else { 00301 errorCode = "201"; 00302 } 00303 } 00304 } else { 00305 errorCode = "201"; 00306 } 00307 } else { 00308 errorCode = "301"; 00309 } 00310 <?php 00311 if (scorm_debugging($scorm)) { 00312 echo 'LogAPICall("LMSGetValue", element, "", errorCode);'; 00313 } 00314 ?> 00315 return ""; 00316 } 00317 00318 function LMSSetValue (element,value) { 00319 errorCode = "0"; 00320 if (Initialized) { 00321 if (element != "") { 00322 expression = new RegExp(CMIIndex,'g'); 00323 elementmodel = String(element).replace(expression,'.n.'); 00324 if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") { 00325 if (eval('datamodel["'+elementmodel+'"].mod') != 'r') { 00326 expression = new RegExp(eval('datamodel["'+elementmodel+'"].format')); 00327 value = value+''; 00328 matches = value.match(expression); 00329 if (matches != null) { 00330 //Create dynamic data model element 00331 if (element != elementmodel) { 00332 elementIndexes = element.split('.'); 00333 subelement = 'cmi'; 00334 for (i=1;i < elementIndexes.length-1;i++) { 00335 elementIndex = elementIndexes[i]; 00336 if (elementIndexes[i+1].match(/^\d+$/)) { 00337 if ((typeof eval(subelement+'.'+elementIndex)) == "undefined") { 00338 eval(subelement+'.'+elementIndex+' = new Object();'); 00339 eval(subelement+'.'+elementIndex+'._count = 0;'); 00340 } 00341 if (elementIndexes[i+1] == eval(subelement+'.'+elementIndex+'._count')) { 00342 eval(subelement+'.'+elementIndex+'._count++;'); 00343 } 00344 if (elementIndexes[i+1] > eval(subelement+'.'+elementIndex+'._count')) { 00345 errorCode = "201"; 00346 } 00347 subelement = subelement.concat('.'+elementIndex+'_'+elementIndexes[i+1]); 00348 i++; 00349 } else { 00350 subelement = subelement.concat('.'+elementIndex); 00351 } 00352 if ((typeof eval(subelement)) == "undefined") { 00353 eval(subelement+' = new Object();'); 00354 if (subelement.substr(0,14) == 'cmi.objectives') { 00355 eval(subelement+'.score = new Object();'); 00356 eval(subelement+'.score._children = score_children;'); 00357 eval(subelement+'.score.raw = "";'); 00358 eval(subelement+'.score.min = "";'); 00359 eval(subelement+'.score.max = "";'); 00360 } 00361 if (subelement.substr(0,16) == 'cmi.interactions') { 00362 eval(subelement+'.objectives = new Object();'); 00363 eval(subelement+'.objectives._count = 0;'); 00364 eval(subelement+'.correct_responses = new Object();'); 00365 eval(subelement+'.correct_responses._count = 0;'); 00366 } 00367 } 00368 } 00369 element = subelement.concat('.'+elementIndexes[elementIndexes.length-1]); 00370 } 00371 //Store data 00372 if (errorCode == "0") { 00373 if ((typeof eval('datamodel["'+elementmodel+'"].range')) != "undefined") { 00374 range = eval('datamodel["'+elementmodel+'"].range'); 00375 ranges = range.split('#'); 00376 value = value*1.0; 00377 if ((value >= ranges[0]) && (value <= ranges[1])) { 00378 eval(element+'=value;'); 00379 errorCode = "0"; 00380 <?php 00381 if (scorm_debugging($scorm)) { 00382 echo 'LogAPICall("LMSSetValue", element, value, errorCode);'; 00383 } 00384 ?> 00385 return "true"; 00386 } else { 00387 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00388 } 00389 } else { 00390 if (element == 'cmi.comments') { 00391 cmi.comments = cmi.comments + value; 00392 } else { 00393 eval(element+'=value;'); 00394 } 00395 errorCode = "0"; 00396 <?php 00397 if (scorm_debugging($scorm)) { 00398 echo 'LogAPICall("LMSSetValue", element, value, errorCode);'; 00399 } 00400 ?> 00401 return "true"; 00402 } 00403 } 00404 } else { 00405 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00406 } 00407 } else { 00408 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00409 } 00410 } else { 00411 errorCode = "201" 00412 } 00413 } else { 00414 errorCode = "201"; 00415 } 00416 } else { 00417 errorCode = "301"; 00418 } 00419 <?php 00420 if (scorm_debugging($scorm)) { 00421 echo 'LogAPICall("LMSSetValue", element, value, errorCode);'; 00422 } 00423 ?> 00424 return "false"; 00425 } 00426 00427 function LMSCommit (param) { 00428 errorCode = "0"; 00429 if (param == "") { 00430 if (Initialized) { 00431 result = StoreData(cmi,false); 00432 <?php 00433 if (scorm_debugging($scorm)) { 00434 echo 'LogAPICall("Commit", param, "", 0);'; 00435 } 00436 ?> 00437 <?php 00438 if (scorm_debugging($scorm)) { 00439 echo 'LogAPICall("LMSCommit", "AJAXResult", result, 0);'; 00440 } 00441 ?> 00442 result = ('true' == result) ? 'true' : 'false'; 00443 errorCode = (result =='true')? '0' : '101'; 00444 <?php 00445 if (scorm_debugging($scorm)) { 00446 echo 'LogAPICall("LMSCommit", "result", result, 0);'; 00447 echo 'LogAPICall("LMSCommit", "errorCode", errorCode, 0);'; 00448 } 00449 ?> 00450 return result; 00451 } else { 00452 errorCode = "301"; 00453 } 00454 } else { 00455 errorCode = "201"; 00456 } 00457 <?php 00458 if (scorm_debugging($scorm)) { 00459 echo 'LogAPICall("LMSCommit", param, "", 0);'; 00460 } 00461 ?> 00462 return "false"; 00463 } 00464 00465 function LMSGetLastError () { 00466 <?php 00467 if (scorm_debugging($scorm)) { 00468 echo 'LogAPICall("LMSGetLastError", "", "", errorCode);'; 00469 } 00470 ?> 00471 return errorCode; 00472 } 00473 00474 function LMSGetErrorString (param) { 00475 if (param != "") { 00476 var errorString = new Array(); 00477 errorString["0"] = "No error"; 00478 errorString["101"] = "General exception"; 00479 errorString["201"] = "Invalid argument error"; 00480 errorString["202"] = "Element cannot have children"; 00481 errorString["203"] = "Element not an array - cannot have count"; 00482 errorString["301"] = "Not initialized"; 00483 errorString["401"] = "Not implemented error"; 00484 errorString["402"] = "Invalid set value, element is a keyword"; 00485 errorString["403"] = "Element is read only"; 00486 errorString["404"] = "Element is write only"; 00487 errorString["405"] = "Incorrect data type"; 00488 <?php 00489 if (scorm_debugging($scorm)) { 00490 echo 'LogAPICall("LMSGetErrorString", param, errorString[param], 0);'; 00491 } 00492 ?> 00493 return errorString[param]; 00494 } else { 00495 <?php 00496 if (scorm_debugging($scorm)) { 00497 echo 'LogAPICall("LMSGetErrorString", param, "No error string found!", 0);'; 00498 } 00499 ?> 00500 return ""; 00501 } 00502 } 00503 00504 function LMSGetDiagnostic (param) { 00505 if (param == "") { 00506 param = errorCode; 00507 } 00508 <?php 00509 if (scorm_debugging($scorm)) { 00510 echo 'LogAPICall("LMSGetDiagnostic", param, param, 0);'; 00511 } 00512 ?> 00513 return param; 00514 } 00515 00516 function AddTime (first, second) { 00517 var sFirst = first.split(":"); 00518 var sSecond = second.split(":"); 00519 var cFirst = sFirst[2].split("."); 00520 var cSecond = sSecond[2].split("."); 00521 var change = 0; 00522 00523 FirstCents = 0; //Cents 00524 if (cFirst.length > 1) { 00525 FirstCents = parseInt(cFirst[1],10); 00526 } 00527 SecondCents = 0; 00528 if (cSecond.length > 1) { 00529 SecondCents = parseInt(cSecond[1],10); 00530 } 00531 var cents = FirstCents + SecondCents; 00532 change = Math.floor(cents / 100); 00533 cents = cents - (change * 100); 00534 if (Math.floor(cents) < 10) { 00535 cents = "0" + cents.toString(); 00536 } 00537 00538 var secs = parseInt(cFirst[0],10)+parseInt(cSecond[0],10)+change; //Seconds 00539 change = Math.floor(secs / 60); 00540 secs = secs - (change * 60); 00541 if (Math.floor(secs) < 10) { 00542 secs = "0" + secs.toString(); 00543 } 00544 00545 mins = parseInt(sFirst[1],10)+parseInt(sSecond[1],10)+change; //Minutes 00546 change = Math.floor(mins / 60); 00547 mins = mins - (change * 60); 00548 if (mins < 10) { 00549 mins = "0" + mins.toString(); 00550 } 00551 00552 hours = parseInt(sFirst[0],10)+parseInt(sSecond[0],10)+change; //Hours 00553 if (hours < 10) { 00554 hours = "0" + hours.toString(); 00555 } 00556 00557 if (cents != '0') { 00558 return hours + ":" + mins + ":" + secs + '.' + cents; 00559 } else { 00560 return hours + ":" + mins + ":" + secs; 00561 } 00562 } 00563 00564 function TotalTime() { 00565 total_time = AddTime(cmi.core.total_time, cmi.core.session_time); 00566 return '&'+underscore('cmi.core.total_time')+'='+encodeURIComponent(total_time); 00567 } 00568 00569 function CollectData(data,parent) { 00570 var datastring = ''; 00571 for (property in data) { 00572 if (typeof data[property] == 'object') { 00573 datastring += CollectData(data[property],parent+'.'+property); 00574 } else { 00575 element = parent+'.'+property; 00576 expression = new RegExp(CMIIndex,'g'); 00577 00578 // get the generic name for this element (e.g. convert 'cmi.interactions.1.id' to 'cmi.interactions.n.id') 00579 elementmodel = String(element).replace(expression,'.n.'); 00580 00581 // ignore the session time element 00582 if (element != "cmi.core.session_time") { 00583 00584 // check if this specific element is not defined in the datamodel, 00585 // but the generic element name is 00586 if ((eval('typeof datamodel["'+element+'"]')) == "undefined" 00587 && (eval('typeof datamodel["'+elementmodel+'"]')) != "undefined") { 00588 00589 // add this specific element to the data model (by cloning 00590 // the generic element) so we can track changes to it 00591 eval('datamodel["'+element+'"]=CloneObj(datamodel["'+elementmodel+'"]);'); 00592 } 00593 00594 // check if the current element exists in the datamodel 00595 if ((typeof eval('datamodel["'+element+'"]')) != "undefined") { 00596 00597 // make sure this is not a read only element 00598 if (eval('datamodel["'+element+'"].mod') != 'r') { 00599 00600 elementstring = '&'+underscore(element)+'='+encodeURIComponent(data[property]); 00601 00602 // check if the element has a default value 00603 if ((typeof eval('datamodel["'+element+'"].defaultvalue')) != "undefined") { 00604 00605 // check if the default value is different from the current value 00606 if (eval('datamodel["'+element+'"].defaultvalue') != data[property] 00607 || eval('typeof(datamodel["'+element+'"].defaultvalue)') != typeof(data[property])) { 00608 00609 // append the URI fragment to the string we plan to commit 00610 datastring += elementstring; 00611 00612 // update the element default to reflect the current committed value 00613 eval('datamodel["'+element+'"].defaultvalue=data[property];'); 00614 } 00615 } else { 00616 // append the URI fragment to the string we plan to commit 00617 datastring += elementstring; 00618 // no default value for the element, so set it now 00619 eval('datamodel["'+element+'"].defaultvalue=data[property];'); 00620 } 00621 } 00622 } 00623 } 00624 } 00625 } 00626 return datastring; 00627 } 00628 00629 function CloneObj(obj){ 00630 if(obj == null || typeof(obj) != 'object') { 00631 return obj; 00632 } 00633 00634 var temp = new obj.constructor(); // changed (twice) 00635 for(var key in obj) { 00636 temp[key] = CloneObj(obj[key]); 00637 } 00638 00639 return temp; 00640 } 00641 00642 function StoreData(data,storetotaltime) { 00643 if (storetotaltime) { 00644 if (cmi.core.lesson_status == 'not attempted') { 00645 cmi.core.lesson_status = 'completed'; 00646 } 00647 if (cmi.core.lesson_mode == 'normal') { 00648 if (cmi.core.credit == 'credit') { 00649 if (cmi.student_data.mastery_score != '' && cmi.core.score.raw != '') { 00650 if (parseFloat(cmi.core.score.raw) >= parseFloat(cmi.student_data.mastery_score)) { 00651 cmi.core.lesson_status = 'passed'; 00652 } else { 00653 cmi.core.lesson_status = 'failed'; 00654 } 00655 } 00656 } 00657 } 00658 if (cmi.core.lesson_mode == 'browse') { 00659 if (datamodel['cmi.core.lesson_status'].defaultvalue == '' && cmi.core.lesson_status == 'not attempted') { 00660 cmi.core.lesson_status = 'browsed'; 00661 } 00662 } 00663 datastring = CollectData(data,'cmi'); 00664 datastring += TotalTime(); 00665 } else { 00666 datastring = CollectData(data,'cmi'); 00667 } 00668 datastring += '&attempt=<?php echo $attempt ?>'; 00669 datastring += '&scoid=<?php echo $scoid ?>'; 00670 00671 var myRequest = NewHttpReq(); 00672 //alert('going to:' + "<?php p($CFG->wwwroot) ?>/mod/scorm/datamodel.php" + "id=<?php p($id) ?>&a=<?php p($a) ?>&sesskey=<?php echo sesskey() ?>"+datastring); 00673 result = DoRequest(myRequest,"<?php p($CFG->wwwroot) ?>/mod/scorm/datamodel.php","id=<?php p($id) ?>&a=<?php p($a) ?>&sesskey=<?php echo sesskey() ?>"+datastring); 00674 results = String(result).split('\n'); 00675 errorCode = results[1]; 00676 return results[0]; 00677 } 00678 00679 this.LMSInitialize = LMSInitialize; 00680 this.LMSFinish = LMSFinish; 00681 this.LMSGetValue = LMSGetValue; 00682 this.LMSSetValue = LMSSetValue; 00683 this.LMSCommit = LMSCommit; 00684 this.LMSGetLastError = LMSGetLastError; 00685 this.LMSGetErrorString = LMSGetErrorString; 00686 this.LMSGetDiagnostic = LMSGetDiagnostic; 00687 } 00688 00689 var API = new SCORMapi1_2(); 00690 00691 <?php 00692 // pull in the debugging utilities 00693 if (scorm_debugging($scorm)) { 00694 include_once($CFG->dirroot.'/mod/scorm/datamodels/debug.js.php'); 00695 echo 'AppendToLog("Moodle SCORM 1.2 API Loaded, Activity: '.$scorm->name.', SCO: '.$sco->identifier.'", 0);'; 00696 } 00697