|
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 if (isset($userdata->status)) { 00018 if ($userdata->status == '') { 00019 $userdata->entry = 'ab-initio'; 00020 } else { 00021 if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) { 00022 $userdata->entry = 'resume'; 00023 } else { 00024 $userdata->entry = ''; 00025 } 00026 } 00027 } 00028 if (!isset($currentorg)) { 00029 $currentorg = ''; 00030 } 00031 ?> 00032 // 00033 // SCORM 1.2 API Implementation 00034 // 00035 function AICCapi() { 00036 // Standard Data Type Definition 00037 CMIString256 = '^.{0,255}$'; 00038 CMIString4096 = '^.{0,4096}$'; 00039 CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$'; 00040 CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$'; 00041 CMIInteger = '^\\d+$'; 00042 CMISInteger = '^-?([0-9]+)$'; 00043 CMIDecimal = '^-?([0-9]{0,3})(\.[0-9]{1,2})?$'; 00044 CMIIdentifier = '^\\w{1,255}$'; 00045 CMIFeedback = CMIString256; // This must be redefined 00046 CMIIndex = '[._](\\d+).'; 00047 00048 // Vocabulary Data Type Definition 00049 CMIStatus = '^passed$|^completed$|^failed$|^incomplete$|^browsed$'; 00050 CMIStatus2 = '^passed$|^completed$|^failed$|^incomplete$|^browsed$|^not attempted$'; 00051 CMIExit = '^time-out$|^suspend$|^logout$|^$'; 00052 CMIType = '^true-false$|^choice$|^fill-in$|^matching$|^performance$|^sequencing$|^likert$|^numeric$'; 00053 CMIResult = '^correct$|^wrong$|^unanticipated$|^neutral$|^([0-9]{0,3})?(\.[0-9]{1,2})?$'; 00054 NAVEvent = '^previous$|^continue$'; 00055 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 student_data_children = 'attempt_number, tries, mastery_score, max_time_allowed, time_limit_action'; 00063 student_preference_children = 'audio, language, speed, text'; 00064 interactions_children = 'id, objectives, time, type, correct_responses, weighting, student_response, result, latency'; 00065 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 00073 // The AICC data model 00074 var datamodel = { 00075 'cmi._children':{'defaultvalue':cmi_children, 'mod':'r', 'writeerror':'402'}, 00076 'cmi._version':{'defaultvalue':'3.4', 'mod':'r', 'writeerror':'402'}, 00077 'cmi.core._children':{'defaultvalue':core_children, 'mod':'r', 'writeerror':'402'}, 00078 'cmi.core.student_id':{'defaultvalue':'<?php echo $userdata->student_id ?>', 'mod':'r', 'writeerror':'403'}, 00079 'cmi.core.student_name':{'defaultvalue':'<?php echo $userdata->student_name ?>', 'mod':'r', 'writeerror':'403'}, 00080 'cmi.core.lesson_location':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_location'})?$userdata->{'cmi.core.lesson_location'}:'' ?>', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00081 'cmi.core.credit':{'defaultvalue':'<?php echo $userdata->credit ?>', 'mod':'r', 'writeerror':'403'}, 00082 'cmi.core.lesson_status':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_status'})?$userdata->{'cmi.core.lesson_status'}:'' ?>', 'format':CMIStatus, 'mod':'rw', 'writeerror':'405'}, 00083 'cmi.core.exit':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.exit'})?$userdata->{'cmi.core.exit'}:'' ?>', 'format':CMIExit, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00084 'cmi.core.entry':{'defaultvalue':'<?php echo $userdata->entry ?>', 'mod':'r', 'writeerror':'403'}, 00085 'cmi.core.score._children':{'defaultvalue':score_children, 'mod':'r', 'writeerror':'402'}, 00086 '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'}, 00087 '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'}, 00088 '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'}, 00089 'cmi.core.session_time':{'format':CMITimespan, 'mod':'w', 'defaultvalue':'00:00:00', 'readerror':'404', 'writeerror':'405'}, 00090 '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'}, 00091 'cmi.core.lesson_mode':{'defaultvalue':'<?php echo $userdata->mode ?>', 'mod':'r', 'writeerror':'403'}, 00092 'cmi.suspend_data':{'defaultvalue':'<?php echo isset($userdata->{'cmi.suspend_data'})?$userdata->{'cmi.suspend_data'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'}, 00093 'cmi.launch_data':{'defaultvalue':'<?php echo isset($userdata->datafromlms)?$userdata->datafromlms:'' ?>', 'mod':'r', 'writeerror':'403'}, 00094 'cmi.comments':{'defaultvalue':'<?php echo isset($userdata->{'cmi.comments'})?$userdata->{'cmi.comments'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'}, 00095 // deprecated evaluation attributes 00096 'cmi.evaluation.comments._count':{'defaultvalue':'0', 'mod':'r', 'writeerror':'402'}, 00097 'cmi.evaluation.comments._children':{'defaultvalue':comments_children, 'mod':'r', 'writeerror':'402'}, 00098 'cmi.evaluation.comments.n.content':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00099 'cmi.evaluation.comments.n.location':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00100 'cmi.evaluation.comments.n.time':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'}, 00101 'cmi.comments_from_lms':{'mod':'r', 'writeerror':'403'}, 00102 'cmi.objectives._children':{'defaultvalue':objectives_children, 'mod':'r', 'writeerror':'402'}, 00103 'cmi.objectives._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00104 'cmi.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'rw', 'writeerror':'405'}, 00105 'cmi.objectives.n.score._children':{'pattern':CMIIndex, 'mod':'r', 'writeerror':'402'}, 00106 'cmi.objectives.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00107 'cmi.objectives.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00108 'cmi.objectives.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00109 'cmi.objectives.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'}, 00110 'cmi.student_data._children':{'defaultvalue':student_data_children, 'mod':'r', 'writeerror':'402'}, 00111 'cmi.student_data.attempt_number':{'defaultvalue':'<?php echo isset($userdata->{'cmi.student_data.attempt_number'})?$userdata->{'cmi.student_data.attempt_number'}:'' ?>', 'mod':'r', 'writeerror':'402'}, 00112 'cmi.student_data.tries.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00113 'cmi.student_data.tries.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00114 'cmi.student_data.tries.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'}, 00115 'cmi.student_data.tries.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'}, 00116 'cmi.student_data.tries.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'}, 00117 'cmi.student_data.mastery_score':{'defaultvalue':'<?php echo isset($userdata->mastery_score)?$userdata->mastery_score:'' ?>', 'mod':'r', 'writeerror':'403'}, 00118 'cmi.student_data.max_time_allowed':{'defaultvalue':'<?php echo isset($userdata->max_time_allowed)?$userdata->max_time_allowed:'' ?>', 'mod':'r', 'writeerror':'403'}, 00119 'cmi.student_data.time_limit_action':{'defaultvalue':'<?php echo isset($userdata->time_limit_action)?$userdata->time_limit_action:'' ?>', 'mod':'r', 'writeerror':'403'}, 00120 'cmi.student_data.tries_during_lesson':{'defaultvalue':'<?php echo isset($userdata->{'cmi.student_data.tries_during_lesson'})?$userdata->{'cmi.student_data.tries_during_lesson'}:'' ?>', 'mod':'r', 'writeerror':'402'}, 00121 'cmi.student_preference._children':{'defaultvalue':student_preference_children, 'mod':'r', 'writeerror':'402'}, 00122 'cmi.student_preference.audio':{'defaultvalue':'0', 'format':CMISInteger, 'range':audio_range, 'mod':'rw', 'writeerror':'405'}, 00123 'cmi.student_preference.language':{'defaultvalue':'', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'}, 00124 'cmi.student_preference.speed':{'defaultvalue':'0', 'format':CMISInteger, 'range':speed_range, 'mod':'rw', 'writeerror':'405'}, 00125 'cmi.student_preference.text':{'defaultvalue':'0', 'format':CMISInteger, 'range':text_range, 'mod':'rw', 'writeerror':'405'}, 00126 'cmi.interactions._children':{'defaultvalue':interactions_children, 'mod':'r', 'writeerror':'402'}, 00127 'cmi.interactions._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00128 'cmi.interactions.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00129 'cmi.interactions.n.objectives._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00130 'cmi.interactions.n.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00131 'cmi.interactions.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00132 'cmi.interactions.n.type':{'pattern':CMIIndex, 'format':CMIType, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00133 'cmi.interactions.n.correct_responses._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'}, 00134 'cmi.interactions.n.correct_responses.n.pattern':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00135 'cmi.interactions.n.weighting':{'pattern':CMIIndex, 'format':CMIDecimal, 'range':weighting_range, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00136 'cmi.interactions.n.student_response':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00137 'cmi.interactions.n.result':{'pattern':CMIIndex, 'format':CMIResult, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00138 'cmi.interactions.n.latency':{'pattern':CMIIndex, 'format':CMITimespan, 'mod':'w', 'readerror':'404', 'writeerror':'405'}, 00139 'nav.event':{'defaultvalue':'', 'format':NAVEvent, 'mod':'w', 'readerror':'404', 'writeerror':'405'} 00140 }; 00141 00142 // 00143 // Datamodel inizialization 00144 // 00145 var cmi = new Object(); 00146 cmi.core = new Object(); 00147 cmi.core.score = new Object(); 00148 cmi.objectives = new Object(); 00149 cmi.student_data = new Object(); 00150 cmi.student_preference = new Object(); 00151 cmi.interactions = new Object(); 00152 // deprecated evaluation attributes 00153 cmi.evaluation = new Object(); 00154 cmi.evaluation.comments = new Object(); 00155 00156 // Navigation Object 00157 var nav = new Object(); 00158 00159 for (element in datamodel) { 00160 if (element.match(/\.n\./) == null) { 00161 if ((typeof eval('datamodel["'+element+'"].defaultvalue')) != 'undefined') { 00162 eval(element+' = datamodel["'+element+'"].defaultvalue;'); 00163 } else { 00164 eval(element+' = "";'); 00165 } 00166 } 00167 } 00168 00169 <?php 00170 $current_objective = ''; 00171 $count = 0; 00172 $objectives = ''; 00173 foreach ($userdata as $element => $value) { 00174 if (substr($element, 0, 14) == 'cmi.objectives') { 00175 $element = preg_replace('/\.(\d+)\./', "_\$1.", $element); 00176 preg_match('/\_(\d+)\./', $element, $matches); 00177 if (count($matches) > 0 && $current_objective != $matches[1]) { 00178 $current_objective = $matches[1]; 00179 $count++; 00180 $end = strpos($element, $matches[1])+strlen($matches[1]); 00181 $subelement = substr($element, 0, $end); 00182 echo ' '.$subelement." = new Object();\n"; 00183 echo ' '.$subelement.".score = new Object();\n"; 00184 echo ' '.$subelement.".score._children = score_children;\n"; 00185 echo ' '.$subelement.".score.raw = '';\n"; 00186 echo ' '.$subelement.".score.min = '';\n"; 00187 echo ' '.$subelement.".score.max = '';\n"; 00188 } 00189 echo ' '.$element.' = \''.$value."';\n"; 00190 } 00191 } 00192 if ($count > 0) { 00193 echo ' cmi.objectives._count = '.$count.";\n"; 00194 } 00195 ?> 00196 00197 if (cmi.core.lesson_status == '') { 00198 cmi.core.lesson_status = 'not attempted'; 00199 } 00200 00201 // 00202 // API Methods definition 00203 // 00204 var Initialized = false; 00205 00206 function LMSInitialize (param) { 00207 errorCode = "0"; 00208 if (param == "") { 00209 if (!Initialized) { 00210 Initialized = true; 00211 errorCode = "0"; 00212 return "true"; 00213 } else { 00214 errorCode = "101"; 00215 } 00216 } else { 00217 errorCode = "201"; 00218 } 00219 return "false"; 00220 } 00221 00222 00223 <?php 00224 // pull in the TOC callback 00225 require_once($CFG->dirroot.'/mod/scorm/datamodels/callback.js.php'); 00226 ?> 00227 00228 00229 function LMSFinish (param) { 00230 errorCode = "0"; 00231 if (param == "") { 00232 if (Initialized) { 00233 Initialized = false; 00234 result = StoreData(cmi,true); 00235 if (nav.event != '') { 00236 if (nav.event == 'continue') { 00237 setTimeout('scorm_get_next();',500); 00238 } else { 00239 setTimeout('scorm_get_prev();',500); 00240 } 00241 } else { 00242 if (<?php echo $scorm->auto ?> == 1) { 00243 setTimeout('scorm_get_next();',500); 00244 } 00245 } 00246 // trigger TOC update 00247 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(); ?>"; 00248 YAHOO.util.Connect.asyncRequest('GET', sURL, this.connectPrereqCallback, null); 00249 return "true"; 00250 } else { 00251 errorCode = "301"; 00252 } 00253 } else { 00254 errorCode = "201"; 00255 } 00256 return "false"; 00257 } 00258 00259 function LMSGetValue (element) { 00260 errorCode = "0"; 00261 if (Initialized) { 00262 if (element !="") { 00263 expression = new RegExp(CMIIndex,'g'); 00264 elementmodel = String(element).replace(expression,'.n.'); 00265 if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") { 00266 if (eval('datamodel["'+elementmodel+'"].mod') != 'w') { 00267 element = String(element).replace(expression, "_$1."); 00268 elementIndexes = element.split('.'); 00269 subelement = 'cmi'; 00270 i = 1; 00271 while ((i < elementIndexes.length) && (typeof eval(subelement) != "undefined")) { 00272 subelement += '.'+elementIndexes[i++]; 00273 } 00274 if (subelement == element) { 00275 errorCode = "0"; 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 return ""; 00311 } 00312 00313 function LMSSetValue (element,value) { 00314 errorCode = "0"; 00315 if (Initialized) { 00316 if (element != "") { 00317 expression = new RegExp(CMIIndex,'g'); 00318 elementmodel = String(element).replace(expression,'.n.'); 00319 if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") { 00320 if (eval('datamodel["'+elementmodel+'"].mod') != 'r') { 00321 expression = new RegExp(eval('datamodel["'+elementmodel+'"].format')); 00322 value = value+''; 00323 matches = value.match(expression); 00324 if (matches != null) { 00325 //Create dynamic data model element 00326 if (element != elementmodel) { 00327 elementIndexes = element.split('.'); 00328 subelement = 'cmi'; 00329 for (i=1;i < elementIndexes.length-1;i++) { 00330 elementIndex = elementIndexes[i]; 00331 if (elementIndexes[i+1].match(/^\d+$/)) { 00332 if ((typeof eval(subelement+'.'+elementIndex)) == "undefined") { 00333 eval(subelement+'.'+elementIndex+' = new Object();'); 00334 eval(subelement+'.'+elementIndex+'._count = 0;'); 00335 } 00336 if (elementIndexes[i+1] == eval(subelement+'.'+elementIndex+'._count')) { 00337 eval(subelement+'.'+elementIndex+'._count++;'); 00338 } 00339 if (elementIndexes[i+1] > eval(subelement+'.'+elementIndex+'._count')) { 00340 errorCode = "201"; 00341 } 00342 subelement = subelement.concat('.'+elementIndex+'_'+elementIndexes[i+1]); 00343 i++; 00344 } else { 00345 subelement = subelement.concat('.'+elementIndex); 00346 } 00347 if ((typeof eval(subelement)) == "undefined") { 00348 eval(subelement+' = new Object();'); 00349 if (subelement.substr(0,14) == 'cmi.objectives') { 00350 eval(subelement+'.score = new Object();'); 00351 eval(subelement+'.score._children = score_children;'); 00352 eval(subelement+'.score.raw = "";'); 00353 eval(subelement+'.score.min = "";'); 00354 eval(subelement+'.score.max = "";'); 00355 } 00356 if (subelement.substr(0,16) == 'cmi.interactions') { 00357 eval(subelement+'.objectives = new Object();'); 00358 eval(subelement+'.objectives._count = 0;'); 00359 eval(subelement+'.correct_responses = new Object();'); 00360 eval(subelement+'.correct_responses._count = 0;'); 00361 } 00362 } 00363 } 00364 element = subelement.concat('.'+elementIndexes[elementIndexes.length-1]); 00365 } 00366 //Store data 00367 if (errorCode == "0") { 00368 if ((typeof eval('datamodel["'+elementmodel+'"].range')) != "undefined") { 00369 range = eval('datamodel["'+elementmodel+'"].range'); 00370 ranges = range.split('#'); 00371 value = value*1.0; 00372 if ((value >= ranges[0]) && (value <= ranges[1])) { 00373 eval(element+'="'+value+'";'); 00374 errorCode = "0"; 00375 return "true"; 00376 } else { 00377 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00378 } 00379 } else { 00380 if (element == 'cmi.comments') { 00381 eval(element+'+="'+value+'";'); 00382 } else { 00383 eval(element+'="'+value+'";'); 00384 } 00385 errorCode = "0"; 00386 return "true"; 00387 } 00388 } 00389 } else { 00390 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00391 } 00392 } else { 00393 errorCode = eval('datamodel["'+elementmodel+'"].writeerror'); 00394 } 00395 } else { 00396 errorCode = "201" 00397 } 00398 } else { 00399 errorCode = "201"; 00400 } 00401 } else { 00402 errorCode = "301"; 00403 } 00404 return "false"; 00405 } 00406 00407 function LMSCommit (param) { 00408 errorCode = "0"; 00409 if (param == "") { 00410 if (Initialized) { 00411 result = StoreData(cmi,false); 00412 return "true"; 00413 } else { 00414 errorCode = "301"; 00415 } 00416 } else { 00417 errorCode = "201"; 00418 } 00419 return "false"; 00420 } 00421 00422 function LMSGetLastError () { 00423 return errorCode; 00424 } 00425 00426 function LMSGetErrorString (param) { 00427 if (param != "") { 00428 var errorString = new Array(); 00429 errorString["0"] = "No error"; 00430 errorString["101"] = "General exception"; 00431 errorString["201"] = "Invalid argument error"; 00432 errorString["202"] = "Element cannot have children"; 00433 errorString["203"] = "Element not an array - cannot have count"; 00434 errorString["301"] = "Not initialized"; 00435 errorString["401"] = "Not implemented error"; 00436 errorString["402"] = "Invalid set value, element is a keyword"; 00437 errorString["403"] = "Element is read only"; 00438 errorString["404"] = "Element is write only"; 00439 errorString["405"] = "Incorrect data type"; 00440 return errorString[param]; 00441 } else { 00442 return ""; 00443 } 00444 } 00445 00446 function LMSGetDiagnostic (param) { 00447 if (param == "") { 00448 param = errorCode; 00449 } 00450 return param; 00451 } 00452 00453 function AddTime (first, second) { 00454 var sFirst = first.split(":"); 00455 var sSecond = second.split(":"); 00456 var cFirst = sFirst[2].split("."); 00457 var cSecond = sSecond[2].split("."); 00458 var change = 0; 00459 00460 FirstCents = 0; //Cents 00461 if (cFirst.length > 1) { 00462 FirstCents = parseInt(cFirst[1],10); 00463 } 00464 SecondCents = 0; 00465 if (cSecond.length > 1) { 00466 SecondCents = parseInt(cSecond[1],10); 00467 } 00468 var cents = FirstCents + SecondCents; 00469 change = Math.floor(cents / 100); 00470 cents = cents - (change * 100); 00471 if (Math.floor(cents) < 10) { 00472 cents = "0" + cents.toString(); 00473 } 00474 00475 var secs = parseInt(cFirst[0],10)+parseInt(cSecond[0],10)+change; //Seconds 00476 change = Math.floor(secs / 60); 00477 secs = secs - (change * 60); 00478 if (Math.floor(secs) < 10) { 00479 secs = "0" + secs.toString(); 00480 } 00481 00482 mins = parseInt(sFirst[1],10)+parseInt(sSecond[1],10)+change; //Minutes 00483 change = Math.floor(mins / 60); 00484 mins = mins - (change * 60); 00485 if (mins < 10) { 00486 mins = "0" + mins.toString(); 00487 } 00488 00489 hours = parseInt(sFirst[0],10)+parseInt(sSecond[0],10)+change; //Hours 00490 if (hours < 10) { 00491 hours = "0" + hours.toString(); 00492 } 00493 00494 if (cents != '0') { 00495 return hours + ":" + mins + ":" + secs + '.' + cents; 00496 } else { 00497 return hours + ":" + mins + ":" + secs; 00498 } 00499 } 00500 00501 function TotalTime() { 00502 total_time = AddTime(cmi.core.total_time, cmi.core.session_time); 00503 return '&'+underscore('cmi.core.total_time')+'='+escape(total_time); 00504 } 00505 00506 function CollectData(data,parent) { 00507 var datastring = ''; 00508 for (property in data) { 00509 if (typeof data[property] == 'object') { 00510 datastring += CollectData(data[property],parent+'.'+property); 00511 } else { 00512 element = parent+'.'+property; 00513 expression = new RegExp(CMIIndex,'g'); 00514 elementmodel = String(element).replace(expression,'.n.'); 00515 if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") { 00516 if (eval('datamodel["'+elementmodel+'"].mod') != 'r') { 00517 elementstring = '&'+underscore(element)+'='+escape(data[property]); 00518 if ((typeof eval('datamodel["'+elementmodel+'"].defaultvalue')) != "undefined") { 00519 if (eval('datamodel["'+elementmodel+'"].defaultvalue') != data[property]) { 00520 datastring += elementstring; 00521 } 00522 } else { 00523 datastring += elementstring; 00524 } 00525 } 00526 } 00527 } 00528 } 00529 return datastring; 00530 } 00531 00532 function StoreData(data,storetotaltime) { 00533 if (storetotaltime) { 00534 if (cmi.core.lesson_mode == 'normal') { 00535 if (cmi.core.credit == 'credit') { 00536 if (cmi.student_data.mastery_score != '' && cmi.core.score.raw != '') { 00537 if (cmi.core.score.raw >= cmi.student_data.mastery_score) { 00538 cmi.core.lesson_status = 'passed'; 00539 } else { 00540 cmi.core.lesson_status = 'failed'; 00541 } 00542 } 00543 } 00544 } 00545 if (cmi.core.lesson_mode == 'browse') { 00546 if (datamodel['cmi.core.lesson_status'].defaultvalue == '' && cmi.core.lesson_status == 'not attempted') { 00547 cmi.core.lesson_status = 'browsed'; 00548 } 00549 } 00550 datastring = CollectData(data,'cmi'); 00551 datastring += TotalTime(); 00552 } else { 00553 datastring = CollectData(data,'cmi'); 00554 } 00555 datastring += '&attempt=<?php echo $attempt ?>'; 00556 datastring += '&scoid=<?php echo $scoid ?>'; 00557 00558 //popupwin(datastring); 00559 var myRequest = NewHttpReq(); 00560 result = DoRequest(myRequest,"<?php p($CFG->wwwroot) ?>/mod/scorm/datamodel.php","id=<?php p($id) ?>&sesskey=<?php echo sesskey() ?>"+datastring); 00561 results = String(result).split('\n'); 00562 errorCode = results[1]; 00563 return results[0]; 00564 } 00565 00566 this.LMSInitialize = LMSInitialize; 00567 this.LMSFinish = LMSFinish; 00568 this.LMSGetValue = LMSGetValue; 00569 this.LMSSetValue = LMSSetValue; 00570 this.LMSCommit = LMSCommit; 00571 this.LMSGetLastError = LMSGetLastError; 00572 this.LMSGetErrorString = LMSGetErrorString; 00573 this.LMSGetDiagnostic = LMSGetDiagnostic; 00574 } 00575 00576 var API = new AICCapi();