PageRenderTime 70ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 0ms

/moodle/mod/scorm/datamodels/aicc.js.php

https://bitbucket.org/geek745/moodle-db2
PHP | 538 lines | 507 code | 18 blank | 13 comment | 77 complexity | 427a694640edfd9af465c220b021215a MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, BSD-3-Clause, LGPL-2.0
  1. <?php
  2. if (isset($userdata->status)) {
  3. if ($userdata->status == '') {
  4. $userdata->entry = 'ab-initio';
  5. } else {
  6. if (isset($userdata->{'cmi.core.exit'}) && ($userdata->{'cmi.core.exit'} == 'suspend')) {
  7. $userdata->entry = 'resume';
  8. } else {
  9. $userdata->entry = '';
  10. }
  11. }
  12. }
  13. ?>
  14. //
  15. // SCORM 1.2 API Implementation
  16. //
  17. function AICCapi() {
  18. // Standard Data Type Definition
  19. CMIString256 = '^[\\u0000-\\uffff]{0,255}$';
  20. CMIString4096 = '^[\\u0000-\\uffff]{0,4096}$';
  21. CMITime = '^([0-2]{1}[0-9]{1}):([0-5]{1}[0-9]{1}):([0-5]{1}[0-9]{1})(\.[0-9]{1,2})?$';
  22. CMITimespan = '^([0-9]{2,4}):([0-9]{2}):([0-9]{2})(\.[0-9]{1,2})?$';
  23. CMIInteger = '^\\d+$';
  24. CMISInteger = '^-?([0-9]+)$';
  25. CMIDecimal = '^-?([0-9]{0,3})(\.[0-9]{1,2})?$';
  26. CMIIdentifier = '^\\w{1,255}$';
  27. CMIFeedback = CMIString256; // This must be redefined
  28. CMIIndex = '[._](\\d+).';
  29. // Vocabulary Data Type Definition
  30. CMIStatus = '^passed$|^completed$|^failed$|^incomplete$|^browsed$';
  31. CMIStatus2 = '^passed$|^completed$|^failed$|^incomplete$|^browsed$|^not attempted$';
  32. CMIExit = '^time-out$|^suspend$|^logout$|^$';
  33. CMIType = '^true-false$|^choice$|^fill-in$|^matching$|^performance$|^sequencing$|^likert$|^numeric$';
  34. CMIResult = '^correct$|^wrong$|^unanticipated$|^neutral$|^([0-9]{0,3})?(\.[0-9]{1,2})?$';
  35. NAVEvent = '^previous$|^continue$';
  36. // Children lists
  37. cmi_children = 'core, suspend_data, launch_data, comments, objectives, student_data, student_preference, interactions';
  38. core_children = 'student_id, student_name, lesson_location, credit, lesson_status, entry, score, total_time, lesson_mode, exit, session_time';
  39. score_children = 'raw, min, max';
  40. comments_children = 'content, location, time';
  41. objectives_children = 'id, score, status';
  42. student_data_children = 'attempt_number, tries, mastery_score, max_time_allowed, time_limit_action';
  43. student_preference_children = 'audio, language, speed, text';
  44. interactions_children = 'id, objectives, time, type, correct_responses, weighting, student_response, result, latency';
  45. // Data ranges
  46. score_range = '0#100';
  47. audio_range = '-1#100';
  48. speed_range = '-100#100';
  49. weighting_range = '-100#100';
  50. text_range = '-1#1';
  51. // The AICC data model
  52. var datamodel = {
  53. 'cmi._children':{'defaultvalue':cmi_children, 'mod':'r', 'writeerror':'402'},
  54. 'cmi._version':{'defaultvalue':'3.4', 'mod':'r', 'writeerror':'402'},
  55. 'cmi.core._children':{'defaultvalue':core_children, 'mod':'r', 'writeerror':'402'},
  56. 'cmi.core.student_id':{'defaultvalue':'<?php echo $userdata->student_id ?>', 'mod':'r', 'writeerror':'403'},
  57. 'cmi.core.student_name':{'defaultvalue':'<?php echo $userdata->student_name ?>', 'mod':'r', 'writeerror':'403'},
  58. 'cmi.core.lesson_location':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_location'})?$userdata->{'cmi.core.lesson_location'}:'' ?>', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},
  59. 'cmi.core.credit':{'defaultvalue':'<?php echo $userdata->credit ?>', 'mod':'r', 'writeerror':'403'},
  60. 'cmi.core.lesson_status':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.lesson_status'})?$userdata->{'cmi.core.lesson_status'}:'' ?>', 'format':CMIStatus, 'mod':'rw', 'writeerror':'405'},
  61. 'cmi.core.exit':{'defaultvalue':'<?php echo isset($userdata->{'cmi.core.exit'})?$userdata->{'cmi.core.exit'}:'' ?>', 'format':CMIExit, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  62. 'cmi.core.entry':{'defaultvalue':'<?php echo $userdata->entry ?>', 'mod':'r', 'writeerror':'403'},
  63. 'cmi.core.score._children':{'defaultvalue':score_children, 'mod':'r', 'writeerror':'402'},
  64. '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'},
  65. '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'},
  66. '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'},
  67. 'cmi.core.session_time':{'format':CMITimespan, 'mod':'w', 'defaultvalue':'00:00:00', 'readerror':'404', 'writeerror':'405'},
  68. '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'},
  69. 'cmi.core.lesson_mode':{'defaultvalue':'<?php echo $userdata->mode ?>', 'mod':'r', 'writeerror':'403'},
  70. 'cmi.suspend_data':{'defaultvalue':'<?php echo isset($userdata->{'cmi.suspend_data'})?$userdata->{'cmi.suspend_data'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'},
  71. 'cmi.launch_data':{'defaultvalue':'<?php echo isset($userdata->datafromlms)?$userdata->datafromlms:'' ?>', 'mod':'r', 'writeerror':'403'},
  72. 'cmi.comments':{'defaultvalue':'<?php echo isset($userdata->{'cmi.comments'})?$userdata->{'cmi.comments'}:'' ?>', 'format':CMIString4096, 'mod':'rw', 'writeerror':'405'},
  73. 'cmi.evaluation.comments._count':{'defaultvalue':'0', 'mod':'r', 'writeerror':'402'},
  74. 'cmi.evaluation.comments._children':{'defaultvalue':comments_children, 'mod':'r', 'writeerror':'402'},
  75. 'cmi.evaluation.comments.n.content':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},
  76. 'cmi.evaluation.comments.n.location':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},
  77. 'cmi.evaluation.comments.n.time':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'},
  78. 'cmi.comments_from_lms':{'mod':'r', 'writeerror':'403'},
  79. 'cmi.objectives._children':{'defaultvalue':objectives_children, 'mod':'r', 'writeerror':'402'},
  80. 'cmi.objectives._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},
  81. 'cmi.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'rw', 'writeerror':'405'},
  82. 'cmi.objectives.n.score._children':{'pattern':CMIIndex, 'mod':'r', 'writeerror':'402'},
  83. 'cmi.objectives.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  84. 'cmi.objectives.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  85. 'cmi.objectives.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  86. 'cmi.objectives.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'},
  87. 'cmi.student_data._children':{'defaultvalue':student_data_children, 'mod':'r', 'writeerror':'402'},
  88. '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'},
  89. 'cmi.student_data.tries.n.score.raw':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  90. 'cmi.student_data.tries.n.score.min':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  91. 'cmi.student_data.tries.n.score.max':{'defaultvalue':'', 'pattern':CMIIndex, 'format':CMIDecimal, 'range':score_range, 'mod':'rw', 'writeerror':'405'},
  92. 'cmi.student_data.tries.n.status':{'pattern':CMIIndex, 'format':CMIStatus2, 'mod':'rw', 'writeerror':'405'},
  93. 'cmi.student_data.tries.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'rw', 'writeerror':'405'},
  94. 'cmi.student_data.mastery_score':{'defaultvalue':'<?php echo isset($userdata->mastery_score)?$userdata->mastery_score:'' ?>', 'mod':'r', 'writeerror':'403'},
  95. 'cmi.student_data.max_time_allowed':{'defaultvalue':'<?php echo isset($userdata->max_time_allowed)?$userdata->max_time_allowed:'' ?>', 'mod':'r', 'writeerror':'403'},
  96. 'cmi.student_data.time_limit_action':{'defaultvalue':'<?php echo isset($userdata->time_limit_action)?$userdata->time_limit_action:'' ?>', 'mod':'r', 'writeerror':'403'},
  97. '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'},
  98. 'cmi.student_preference._children':{'defaultvalue':student_preference_children, 'mod':'r', 'writeerror':'402'},
  99. 'cmi.student_preference.audio':{'defaultvalue':'0', 'format':CMISInteger, 'range':audio_range, 'mod':'rw', 'writeerror':'405'},
  100. 'cmi.student_preference.language':{'defaultvalue':'', 'format':CMIString256, 'mod':'rw', 'writeerror':'405'},
  101. 'cmi.student_preference.speed':{'defaultvalue':'0', 'format':CMISInteger, 'range':speed_range, 'mod':'rw', 'writeerror':'405'},
  102. 'cmi.student_preference.text':{'defaultvalue':'0', 'format':CMISInteger, 'range':text_range, 'mod':'rw', 'writeerror':'405'},
  103. 'cmi.interactions._children':{'defaultvalue':interactions_children, 'mod':'r', 'writeerror':'402'},
  104. 'cmi.interactions._count':{'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},
  105. 'cmi.interactions.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  106. 'cmi.interactions.n.objectives._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},
  107. 'cmi.interactions.n.objectives.n.id':{'pattern':CMIIndex, 'format':CMIIdentifier, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  108. 'cmi.interactions.n.time':{'pattern':CMIIndex, 'format':CMITime, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  109. 'cmi.interactions.n.type':{'pattern':CMIIndex, 'format':CMIType, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  110. 'cmi.interactions.n.correct_responses._count':{'pattern':CMIIndex, 'mod':'r', 'defaultvalue':'0', 'writeerror':'402'},
  111. 'cmi.interactions.n.correct_responses.n.pattern':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  112. 'cmi.interactions.n.weighting':{'pattern':CMIIndex, 'format':CMIDecimal, 'range':weighting_range, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  113. 'cmi.interactions.n.student_response':{'pattern':CMIIndex, 'format':CMIFeedback, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  114. 'cmi.interactions.n.result':{'pattern':CMIIndex, 'format':CMIResult, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  115. 'cmi.interactions.n.latency':{'pattern':CMIIndex, 'format':CMITimespan, 'mod':'w', 'readerror':'404', 'writeerror':'405'},
  116. 'nav.event':{'defaultvalue':'', 'format':NAVEvent, 'mod':'w', 'readerror':'404', 'writeerror':'405'}
  117. };
  118. //
  119. // Datamodel inizialization
  120. //
  121. var cmi = new Object();
  122. cmi.core = new Object();
  123. cmi.core.score = new Object();
  124. cmi.objectives = new Object();
  125. cmi.student_data = new Object();
  126. cmi.student_preference = new Object();
  127. cmi.interactions = new Object();
  128. cmi.evaluation = new Object();
  129. cmi.evaluation.comments = new Object();
  130. // Navigation Object
  131. var nav = new Object();
  132. for (element in datamodel) {
  133. if (element.match(/\.n\./) == null) {
  134. if ((typeof eval('datamodel["'+element+'"].defaultvalue')) != 'undefined') {
  135. eval(element+' = datamodel["'+element+'"].defaultvalue;');
  136. } else {
  137. eval(element+' = "";');
  138. }
  139. }
  140. }
  141. <?php
  142. $current_objective = '';
  143. $count = 0;
  144. $objectives = '';
  145. foreach($userdata as $element => $value){
  146. if (substr($element,0,14) == 'cmi.objectives') {
  147. $element = preg_replace('/\.(\d+)\./', "_\$1.", $element);
  148. preg_match('/\_(\d+)\./', $element, $matches);
  149. if (count($matches) > 0 && $current_objective != $matches[1]) {
  150. $current_objective = $matches[1];
  151. $end = strpos($element,$matches[1])+strlen($matches[1]);
  152. $subelement = substr($element,0,$end);
  153. echo ' '.$subelement." = new Object();\n";
  154. echo ' '.$subelement.".score = new Object();\n";
  155. echo ' '.$subelement.".score._children = score_children;\n";
  156. echo ' '.$subelement.".score.raw = '';\n";
  157. echo ' '.$subelement.".score.min = '';\n";
  158. echo ' '.$subelement.".score.max = '';\n";
  159. }
  160. echo ' '.$element.' = \''.$value."';\n";
  161. }
  162. }
  163. if ($count > 0) {
  164. echo ' cmi.objectives._count = '.$count.";\n";
  165. }
  166. ?>
  167. if (cmi.core.lesson_status == '') {
  168. cmi.core.lesson_status = 'not attempted';
  169. }
  170. //
  171. // API Methods definition
  172. //
  173. var Initialized = false;
  174. function LMSInitialize (param) {
  175. errorCode = "0";
  176. if (param == "") {
  177. if (!Initialized) {
  178. Initialized = true;
  179. errorCode = "0";
  180. return "true";
  181. } else {
  182. errorCode = "101";
  183. }
  184. } else {
  185. errorCode = "201";
  186. }
  187. return "false";
  188. }
  189. function LMSFinish (param) {
  190. errorCode = "0";
  191. if (param == "") {
  192. if (Initialized) {
  193. Initialized = false;
  194. result = StoreData(cmi,true);
  195. if (nav.event != '') {
  196. if (nav.event == 'continue') {
  197. setTimeout('top.nextSCO();',500);
  198. } else {
  199. setTimeout('top.prevSCO();',500);
  200. }
  201. } else {
  202. if (<?php echo $scorm->auto ?> == 1) {
  203. setTimeout('top.nextSCO();',500);
  204. }
  205. }
  206. return "true";
  207. } else {
  208. errorCode = "301";
  209. }
  210. } else {
  211. errorCode = "201";
  212. }
  213. return "false";
  214. }
  215. function LMSGetValue (element) {
  216. errorCode = "0";
  217. if (Initialized) {
  218. if (element !="") {
  219. expression = new RegExp(CMIIndex,'g');
  220. elementmodel = String(element).replace(expression,'.n.');
  221. if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
  222. if (eval('datamodel["'+elementmodel+'"].mod') != 'w') {
  223. element = String(element).replace(expression, "_$1.");
  224. elementIndexes = element.split('.');
  225. subelement = 'cmi';
  226. i = 1;
  227. while ((i < elementIndexes.length) && (typeof eval(subelement) != "undefined")) {
  228. subelement += '.'+elementIndexes[i++];
  229. }
  230. if (subelement == element) {
  231. errorCode = "0";
  232. return eval(element);
  233. } else {
  234. errorCode = "0"; // Need to check if it is the right errorCode
  235. }
  236. } else {
  237. errorCode = eval('datamodel["'+elementmodel+'"].readerror');
  238. }
  239. } else {
  240. childrenstr = '._children';
  241. countstr = '._count';
  242. if (elementmodel.substr(elementmodel.length-childrenstr.length,elementmodel.length) == childrenstr) {
  243. parentmodel = elementmodel.substr(0,elementmodel.length-childrenstr.length);
  244. if ((typeof eval('datamodel["'+parentmodel+'"]')) != "undefined") {
  245. errorCode = "202";
  246. } else {
  247. errorCode = "201";
  248. }
  249. } else if (elementmodel.substr(elementmodel.length-countstr.length,elementmodel.length) == countstr) {
  250. parentmodel = elementmodel.substr(0,elementmodel.length-countstr.length);
  251. if ((typeof eval('datamodel["'+parentmodel+'"]')) != "undefined") {
  252. errorCode = "203";
  253. } else {
  254. errorCode = "201";
  255. }
  256. } else {
  257. errorCode = "201";
  258. }
  259. }
  260. } else {
  261. errorCode = "201";
  262. }
  263. } else {
  264. errorCode = "301";
  265. }
  266. return "";
  267. }
  268. function LMSSetValue (element,value) {
  269. errorCode = "0";
  270. if (Initialized) {
  271. if (element != "") {
  272. expression = new RegExp(CMIIndex,'g');
  273. elementmodel = String(element).replace(expression,'.n.');
  274. if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
  275. if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
  276. expression = new RegExp(eval('datamodel["'+elementmodel+'"].format'));
  277. value = value+'';
  278. matches = value.match(expression);
  279. if (matches != null) {
  280. //Create dynamic data model element
  281. if (element != elementmodel) {
  282. elementIndexes = element.split('.');
  283. subelement = 'cmi';
  284. for (i=1;i < elementIndexes.length-1;i++) {
  285. elementIndex = elementIndexes[i];
  286. if (elementIndexes[i+1].match(/^\d+$/)) {
  287. if ((typeof eval(subelement+'.'+elementIndex)) == "undefined") {
  288. eval(subelement+'.'+elementIndex+' = new Object();');
  289. eval(subelement+'.'+elementIndex+'._count = 0;');
  290. }
  291. if (elementIndexes[i+1] == eval(subelement+'.'+elementIndex+'._count')) {
  292. eval(subelement+'.'+elementIndex+'._count++;');
  293. }
  294. if (elementIndexes[i+1] > eval(subelement+'.'+elementIndex+'._count')) {
  295. errorCode = "201";
  296. }
  297. subelement = subelement.concat('.'+elementIndex+'_'+elementIndexes[i+1]);
  298. i++;
  299. } else {
  300. subelement = subelement.concat('.'+elementIndex);
  301. }
  302. if ((typeof eval(subelement)) == "undefined") {
  303. eval(subelement+' = new Object();');
  304. if (subelement.substr(0,14) == 'cmi.objectives') {
  305. eval(subelement+'.score = new Object();');
  306. eval(subelement+'.score._children = score_children;');
  307. eval(subelement+'.score.raw = "";');
  308. eval(subelement+'.score.min = "";');
  309. eval(subelement+'.score.max = "";');
  310. }
  311. if (subelement.substr(0,16) == 'cmi.interactions') {
  312. eval(subelement+'.objectives = new Object();');
  313. eval(subelement+'.objectives._count = 0;');
  314. eval(subelement+'.correct_responses = new Object();');
  315. eval(subelement+'.correct_responses._count = 0;');
  316. }
  317. }
  318. }
  319. element = subelement.concat('.'+elementIndexes[elementIndexes.length-1]);
  320. }
  321. //Store data
  322. if (errorCode == "0") {
  323. if ((typeof eval('datamodel["'+elementmodel+'"].range')) != "undefined") {
  324. range = eval('datamodel["'+elementmodel+'"].range');
  325. ranges = range.split('#');
  326. value = value*1.0;
  327. if ((value >= ranges[0]) && (value <= ranges[1])) {
  328. eval(element+'="'+value+'";');
  329. errorCode = "0";
  330. return "true";
  331. } else {
  332. errorCode = eval('datamodel["'+elementmodel+'"].writeerror');
  333. }
  334. } else {
  335. if (element == 'cmi.comments') {
  336. eval(element+'+="'+value+'";');
  337. } else {
  338. eval(element+'="'+value+'";');
  339. }
  340. errorCode = "0";
  341. return "true";
  342. }
  343. }
  344. } else {
  345. errorCode = eval('datamodel["'+elementmodel+'"].writeerror');
  346. }
  347. } else {
  348. errorCode = eval('datamodel["'+elementmodel+'"].writeerror');
  349. }
  350. } else {
  351. errorCode = "201"
  352. }
  353. } else {
  354. errorCode = "201";
  355. }
  356. } else {
  357. errorCode = "301";
  358. }
  359. return "false";
  360. }
  361. function LMSCommit (param) {
  362. errorCode = "0";
  363. if (param == "") {
  364. if (Initialized) {
  365. result = StoreData(cmi,false);
  366. return "true";
  367. } else {
  368. errorCode = "301";
  369. }
  370. } else {
  371. errorCode = "201";
  372. }
  373. return "false";
  374. }
  375. function LMSGetLastError () {
  376. return errorCode;
  377. }
  378. function LMSGetErrorString (param) {
  379. if (param != "") {
  380. var errorString = new Array();
  381. errorString["0"] = "No error";
  382. errorString["101"] = "General exception";
  383. errorString["201"] = "Invalid argument error";
  384. errorString["202"] = "Element cannot have children";
  385. errorString["203"] = "Element not an array - cannot have count";
  386. errorString["301"] = "Not initialized";
  387. errorString["401"] = "Not implemented error";
  388. errorString["402"] = "Invalid set value, element is a keyword";
  389. errorString["403"] = "Element is read only";
  390. errorString["404"] = "Element is write only";
  391. errorString["405"] = "Incorrect data type";
  392. return errorString[param];
  393. } else {
  394. return "";
  395. }
  396. }
  397. function LMSGetDiagnostic (param) {
  398. if (param == "") {
  399. param = errorCode;
  400. }
  401. return param;
  402. }
  403. function AddTime (first, second) {
  404. var sFirst = first.split(":");
  405. var sSecond = second.split(":");
  406. var cFirst = sFirst[2].split(".");
  407. var cSecond = sSecond[2].split(".");
  408. var change = 0;
  409. FirstCents = 0; //Cents
  410. if (cFirst.length > 1) {
  411. FirstCents = parseInt(cFirst[1],10);
  412. }
  413. SecondCents = 0;
  414. if (cSecond.length > 1) {
  415. SecondCents = parseInt(cSecond[1],10);
  416. }
  417. var cents = FirstCents + SecondCents;
  418. change = Math.floor(cents / 100);
  419. cents = cents - (change * 100);
  420. if (Math.floor(cents) < 10) {
  421. cents = "0" + cents.toString();
  422. }
  423. var secs = parseInt(cFirst[0],10)+parseInt(cSecond[0],10)+change; //Seconds
  424. change = Math.floor(secs / 60);
  425. secs = secs - (change * 60);
  426. if (Math.floor(secs) < 10) {
  427. secs = "0" + secs.toString();
  428. }
  429. mins = parseInt(sFirst[1],10)+parseInt(sSecond[1],10)+change; //Minutes
  430. change = Math.floor(mins / 60);
  431. mins = mins - (change * 60);
  432. if (mins < 10) {
  433. mins = "0" + mins.toString();
  434. }
  435. hours = parseInt(sFirst[0],10)+parseInt(sSecond[0],10)+change; //Hours
  436. if (hours < 10) {
  437. hours = "0" + hours.toString();
  438. }
  439. if (cents != '0') {
  440. return hours + ":" + mins + ":" + secs + '.' + cents;
  441. } else {
  442. return hours + ":" + mins + ":" + secs;
  443. }
  444. }
  445. function TotalTime() {
  446. total_time = AddTime(cmi.core.total_time, cmi.core.session_time);
  447. return '&'+underscore('cmi.core.total_time')+'='+escape(total_time);
  448. }
  449. function CollectData(data,parent) {
  450. var datastring = '';
  451. for (property in data) {
  452. if (typeof data[property] == 'object') {
  453. datastring += CollectData(data[property],parent+'.'+property);
  454. } else {
  455. element = parent+'.'+property;
  456. expression = new RegExp(CMIIndex,'g');
  457. elementmodel = String(element).replace(expression,'.n.');
  458. if ((typeof eval('datamodel["'+elementmodel+'"]')) != "undefined") {
  459. if (eval('datamodel["'+elementmodel+'"].mod') != 'r') {
  460. elementstring = '&'+underscore(element)+'='+escape(data[property]);
  461. if ((typeof eval('datamodel["'+elementmodel+'"].defaultvalue')) != "undefined") {
  462. if (eval('datamodel["'+elementmodel+'"].defaultvalue') != data[property]) {
  463. datastring += elementstring;
  464. }
  465. } else {
  466. datastring += elementstring;
  467. }
  468. }
  469. }
  470. }
  471. }
  472. return datastring;
  473. }
  474. function StoreData(data,storetotaltime) {
  475. if (storetotaltime) {
  476. if (cmi.core.lesson_mode == 'normal') {
  477. if (cmi.core.credit == 'credit') {
  478. cmi.core.lesson_status = 'completed';
  479. if (cmi.student_data.mastery_score != '') {
  480. if (cmi.core.score.raw >= cmi.student_data.mastery_score) {
  481. cmi.core.lesson_status = 'passed';
  482. } else {
  483. cmi.core.lesson_status = 'failed';
  484. }
  485. }
  486. }
  487. }
  488. if (cmi.core.lesson_mode == 'browse') {
  489. if (datamodel['cmi.core.lesson_status'].defaultvalue == '') {
  490. cmi.core.lesson_status = 'browsed';
  491. }
  492. }
  493. datastring = CollectData(data,'cmi');
  494. datastring += TotalTime();
  495. } else {
  496. datastring = CollectData(data,'cmi');
  497. }
  498. //popupwin(datastring);
  499. var myRequest = NewHttpReq();
  500. result = DoRequest(myRequest,"<?php p($CFG->wwwroot) ?>/mod/scorm/datamodel.php","id=<?php p($id) ?>&sesskey=<?php p($USER->sesskey) ?>"+datastring);
  501. results = result.split('\n');
  502. errorCode = results[1];
  503. return results[0];
  504. }
  505. this.LMSInitialize = LMSInitialize;
  506. this.LMSFinish = LMSFinish;
  507. this.LMSGetValue = LMSGetValue;
  508. this.LMSSetValue = LMSSetValue;
  509. this.LMSCommit = LMSCommit;
  510. this.LMSGetLastError = LMSGetLastError;
  511. this.LMSGetErrorString = LMSGetErrorString;
  512. this.LMSGetDiagnostic = LMSGetDiagnostic;
  513. }
  514. var API = new AICCapi();