PageRenderTime 58ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

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

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