Fixed some popup window problems (some still fixing)
[moodle.git] / mod / scorm / lib.php
1 <?PHP  // $Id$
3 /// Library of functions and constants for module scorm
4 /// (replace scorm with the name of your module and delete this line)
6 $SCORM_WINDOW_OPTIONS = array("resizable", "scrollbars", "status", "height", "width");
8 if (!isset($CFG->scorm_popup)) {
9     set_config("scorm_popup", "");
10 }  
12 foreach ($SCORM_WINDOW_OPTIONS as $popupoption) {
13     $popupoption = "scorm_popup$popupoption";
14     if (!isset($CFG->$popupoption)) {
15         if ($popupoption == "scorm_popupheight") {
16             set_config($popupoption, 450);
17         } else if ($popupoption == "scorm_popupwidth") {
18             set_config($popupoption, 620);
19         } else {
20             set_config($popupoption, "checked");
21         }
22     }  
23 }
25 if (!isset($CFG->scorm_framesize)) {
26     set_config("scorm_framesize", 140);
27 }
29 function scorm_add_instance($scorm) {
30 /// Given an object containing all the necessary data, 
31 /// (defined by the form in mod.html) this function 
32 /// will create a new instance and return the id number 
33 /// of the new instance.
35     $scorm->timemodified = time();
37     # May have to add extra stuff in here #
38     global $SCORM_WINDOW_OPTIONS;
39     
40     $scorm->popup = "";
41     
42     $optionlist = array();
43     foreach ($SCORM_WINDOW_OPTIONS as $option) {
44         if (isset($scorm->$option)) {
45             $optionlist[] = $option."=".$scorm->$option;
46         }
47     }
48     $scorm->popup = implode(',', $optionlist);
49     $scorm->auto = '0';
51     if ($scorm->popup != "")
52         $scorm->popup .= ',location=0,menubar=0,toolbar=0';
53     
54     return insert_record("scorm", $scorm);
55 }
58 function scorm_update_instance($scorm) {
59 /// Given an object containing all the necessary data, 
60 /// (defined by the form in mod.html) this function 
61 /// will update an existing instance with new data.
62     
63     $scorm->timemodified = time();
64     $scorm->id = $scorm->instance;
66     # May have to add extra stuff in here #
67     global $SCORM_WINDOW_OPTIONS;
68     
69     $scorm->popup = "";
70     
71     $optionlist = array();
72     foreach ($SCORM_WINDOW_OPTIONS as $option) {
73         if (isset($scorm->$option)) {
74             $optionlist[] = $option."=".$scorm->$option;
75         }
76     }
77     $scorm->popup = implode(',', $optionlist);
78     $scorm->auto = '0';
80     if ($scorm->popup != "")
81         $scorm->popup .= ',location=0,menubar=0,toolbar=0';
83     return update_record("scorm", $scorm);
84 }
87 function scorm_delete_instance($id) {
88 /// Given an ID of an instance of this module, 
89 /// this function will permanently delete the instance 
90 /// and any data that depends on it.  
91     
92     require('../config.php');
94     if (! $scorm = get_record("scorm", "id", "$id")) {
95         return false;
96     }
98     $result = true;
100     # Delete any dependent files #
101     scorm_delete_files($CFG->dataroot."/".$scorm->course."/moddata/scorm".$scorm->datadir);
103     # Delete any dependent records here #
104     if (! delete_records("scorm_sco_users", "scormid", "$scorm->id")) {
105         $result = false;
106     }
107     if (! delete_records("scorm_scoes", "scorm", "$scorm->id")) {
108         $result = false;
109     }
110     if (! delete_records("scorm", "id", "$scorm->id")) {
111         $result = false;
112     }
113     
115     return $result;
118 function scorm_user_outline($course, $user, $mod, $scorm) {
119 /// Return a small object with summary information about what a 
120 /// user has done with a given particular instance of this module
121 /// Used for user activity reports.
122 /// $return->time = the time they did it
123 /// $return->info = a short text description
125     return $return;
128 function scorm_user_complete($course, $user, $mod, $scorm) {
129 /// Print a detailed representation of what a  user has done with 
130 /// a given particular instance of this module, for user activity reports.
132     return true;
135 function scorm_print_recent_activity(&$logs, $isteacher=false) {
136 /// Given a list of logs, assumed to be those since the last login 
137 /// this function prints a short list of changes related to this module
138 /// If isteacher is true then perhaps additional information is printed.
139 /// This function is called from course/lib.php: print_recent_activity()
141     global $CFG, $COURSE_TEACHER_COLOR;
143     $content = NULL;
145     return $content;  // True if anything was printed, otherwise false
148 function scorm_cron () {
149 /// Function to be run periodically according to the moodle cron
150 /// This function searches for things that need to be done, such 
151 /// as sending out mail, toggling flags etc ... 
153     global $CFG;
155     return true;
158 function scorm_grades($scormid) {
159 /// Must return an array of grades for a given instance of this module, 
160 /// indexed by user.  It also returns a maximum allowed grade.
162     global $CFG;
163     
164     if (!$return->maxgrade = count_records_select("scorm_scoes","scorm='$scormid' AND launch<>''")) {
165         return NULL;
166     }
167     
168     $return->grades = NULL;
169     if ($sco_users=get_records_select("scorm_sco_users", "scormid='$scormid' GROUP BY userid")) {
170         foreach ($sco_users as $sco_user) {
171             $user_data=get_records_select("scorm_sco_users","scormid='$scormid' AND userid='$sco_user->userid'");
172             $scores->completed=0;
173             $scores->browsed=0;
174             $scores->incomplete=0;
175             $scores->failed=0;
176             $scores->notattempted=0;
177             $result="";
178             $data = current($user_data);
179             foreach ($user_data as $data) {
180                 if ($data->cmi_core_lesson_status=="passed")
181                     $scores->completed++;
182                 else
183                     $scores->{scorm_remove_spaces($data->cmi_core_lesson_status)}++;
184                 
185             }
186             if ($scores->completed)
187                 $result.="<img src=\"$CFG->wwwroot/mod/scorm/pix/completed.gif\" alt=\"".get_string("completed","scorm")."\" title=\"".get_string("completed","scorm")."\"> $scores->completed ";
188             if ($scores->incomplete)
189                 $result.="<img src=\"$CFG->wwwroot/mod/scorm/pix/incomplete.gif\" alt=\"".get_string("incomplete","scorm")."\" title=\"".get_string("incomplete","scorm")."\"> $scores->incomplete ";
190             if ($scores->failed)
191                 $result.="<img src=\"$CFG->wwwroot/mod/scorm/pix/failed.gif\" alt=\"".get_string("failed","scorm")."\" title=\"".get_string("failed","scorm")."\"> $scores->failed ";
192             if ($scores->browsed)
193                 $result.="<img src=\"$CFG->wwwroot/mod/scorm/pix/browsed.gif\" alt=\"".get_string("browsed","scorm")."\" title=\"".get_string("browsed","scorm")."\"> $scores->browsed ";
194             if ($scores->notattempted)
195                 $result.="<img src=\"$CFG->wwwroot/mod/scorm/pix/notattempted.gif\" alt=\"".get_string("notattempted","scorm")."\" title=\"".get_string("notattempted","scorm")."\"> $scores->notattempted ";
196             
197             $return->grades[$sco_user->userid]=$result;
198         }
199         
200     }
202     return $return;
206 //////////////////////////////////////////////////////////////////////////////////////
207 /// Any other scorm functions go here.  Each of them must have a name that 
208 /// starts with scorm_
211 function scorm_randstring($len = "8")
213         $rstring = NULL;
214         for($i=0; $i<$len; $i++) {
215                 $char = chr(rand(48,122));
216                 while (!ereg("[a-zA-Z0-9]", $char)){
217                         if($char == $lchar) continue;
218                         $char = chr(rand(48,90));
219                 }
220                 $rstring .= $char;
221                 $lchar = $char;
222         }
223         return $rstring;
226  
227 function scorm_datadir($strPath, $existingdir="", $prefix = "SCORM")
229     global $CFG;
231     if (($existingdir!="") && (is_dir($strPath.$existingdir)))
232         return $strPath.$existingdir;
233         
234     if (is_dir($strPath)) {
235         do {
236             $datadir="/".$prefix.scorm_randstring();
237         } while (file_exists($strPath.$datadir));
238         mkdir($strPath.$datadir, $CFG->directorypermissions);
239         @chmod($strPath.$datadir, $CFG->directorypermissions);  // Just in case mkdir didn't do it
240         return $strPath.$datadir;
241     } else {
242         return false;
243     }
244
246 function scorm_validate($manifest)
248     if (is_file ($manifest)) {
249     if (file_exists($manifest))
250     {
251         return "regular";
252     }
253     } else {
254         return "nomanifest";
255     }
258 function scorm_delete_files($directory)
260     if (is_dir($directory))
261     {
262         $handle=opendir($directory);
263         while (($file = readdir($handle)) != '')
264         {
265             if ($file != "." && $file != "..")
266         {
267             if (!is_dir($directory."/".$file))
268                     unlink($directory."/".$file);
269             else
270             scorm_delete_files($directory."/".$file);
271         }
272         }
273         rmdir($directory);
274     }
277 function scorm_startElement($parser, $name, $attrs) {
278     global $manifest,$i,$resources,$parent,$level;
279     if ($name == "ITEM") {
280         $i++;
281         $manifest[$i]["identifier"] = $attrs["IDENTIFIER"];
282         if (empty($attrs["IDENTIFIERREF"]))
283             $attrs["IDENTIFIERREF"] = "";
284         $manifest[$i]["identifierref"] = $attrs["IDENTIFIERREF"];
285         if (empty($attrs["ISVISIBLE"]))
286             $attrs["ISVISIBLE"] = "";
287         $manifest[$i]["isvisible"] = $attrs["ISVISIBLE"];
288         $manifest[$i]["parent"] = $parent[$level];
289         $level++;
290         $parent[$level] = $attrs["IDENTIFIER"];
291     }
292     if ($name == "RESOURCE") {
293         $resources[$attrs["IDENTIFIER"]]["href"]=$attrs["HREF"];
294         $resources[$attrs["IDENTIFIER"]]["type"]=$attrs["ADLCP:SCORMTYPE"];
295     }
298 function scorm_endElement($parser, $name) {
299     global $manifest,$i,$level,$datacontent,$navigation;
300     if ($name == "ITEM") {
301         $level--;
302     }
303     if ($name == "TITLE" && $level>0)
304     $manifest[$i]["title"] = $datacontent;
305     if ($name == "ADLCP:HIDERTSUI")
306     $manifest[$i][$datacontent] = 1;
309 function scorm_characterData($parser, $data) {
310     global $datacontent;
311     $datacontent = $data;
314 function scorm_parse($basedir,$file,$scorm_id) {
315     global $manifest,$i,$resources,$parent,$level;
316     $datacontent = "";
317     $manifest[][] = "";
318     $resources[] = "";
319     $i = 0;
320     $level = 0;
321     $parent[$level] = "/";
323     $xml_parser = xml_parser_create();
324     // use case-folding so we are sure to find the tag in $map_array
325     xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true);
326     xml_set_element_handler($xml_parser, "scorm_startElement", "scorm_endElement");
327     xml_set_character_data_handler($xml_parser, "scorm_characterData");
328     if (!($fp = fopen($basedir.$file, "r"))) {
329        die("could not open XML input");
330     }
332     while ($data = fread($fp, 4096)) {
333         if (!xml_parse($xml_parser, $data, feof($fp))) {
334             die(sprintf("XML error: %s at line %d",
335                     xml_error_string(xml_get_error_code($xml_parser)),
336                     xml_get_current_line_number($xml_parser)));
337         }
338     }
339     xml_parser_free($xml_parser);
340     $launch = 0;
342     $sco->scorm = $scorm_id;
343     delete_records("scorm_scoes","scorm",$scorm_id);
344     delete_records("scorm_sco_users","scormid",$scorm_id);
345     for ($j=1; $j<=$i; $j++) {
346         $sco->identifier = $manifest[$j]["identifier"];
347         $sco->parent = $manifest[$j]["parent"];
348         $sco->title = $manifest[$j]["title"];
349         if (empty($resources[($manifest[$j]["identifierref"])]["href"]))
350             $resources[($manifest[$j]["identifierref"])]["href"] = "";
351         $sco->launch = $resources[($manifest[$j]["identifierref"])]["href"];
352         if (empty($resources[($manifest[$j]["identifierref"])]["type"]))
353             $resources[($manifest[$j]["identifierref"])]["type"] = "";
354     $sco->type = $resources[($manifest[$j]["identifierref"])]["type"];
355     if (empty($manifest[$j]["previous"]))
356         $manifest[$j]["previous"] = 0;
357     $sco->previous = $manifest[$j]["previous"];
358     if (empty($manifest[$j]["continue"]))
359         $manifest[$j]["continue"] = 0;
360     $sco->next = $manifest[$j]["continue"];
361     if (scorm_remove_spaces($manifest[$j]["isvisible"]) != "false")
362         $id = insert_record("scorm_scoes",$sco);
363     if ($launch==0 && $sco->launch)
364         $launch = $id;  
365     }
366     return $launch;
369 function scorm_get_scoes_records($sco_user) {
370 /// Gets all info required to display the table of scorm results
371 /// for report.php
372     global $CFG;
374     return get_records_sql("SELECT su.*, u.firstname, u.lastname, u.picture 
375                             FROM {$CFG->prefix}scorm_sco_users su, 
376                                  {$CFG->prefix}user u
377                             WHERE su.scormid = '$sco_user->scormid'
378                               AND su.userid = u.id
379                               AND su.userid = $sco_user->userid
380                               ORDER BY scoid");
383 function scorm_remove_spaces($sourcestr) {
384 // Remove blank space from a string
385     $newstr="";
386     for( $i=0; $i<strlen($sourcestr); $i++) {
387         if ($sourcestr[$i]!=' ')
388             $newstr .=$sourcestr[$i];
389     }
390     return $newstr;
393 function scorm_string_round($stringa) {
394 // Crop a string to $len character and set an anchor title to the full string
395     $len=11;
396     if ( strlen($stringa)>$len ) {
397     return "<A name=\"\" title=\"$stringa\">".substr($stringa,0,$len-4)."...".substr($stringa,strlen($stringa)-1,1)."</A>";
398     } else
399     return $stringa;
402 function scorm_external_link($link) {
403 // check if a link is external
404     $result = false;
405     $link = strtolower($link);
406     if (substr($link,0,7) == "http://")
407         $result = true;
408     else if (substr($link,0,8) == "https://")
409         $result = true;
410     else if (substr($link,0,4) == "www.")
411         $result = true;
412     /*else if (substr($link,0,7) == "rstp://")
413         $result = true;
414     else if (substr($link,0,6) == "rtp://")
415         $result = true;
416     else if (substr($link,0,6) == "ftp://")
417         $result = true;
418     else if (substr($link,0,9) == "gopher://")
419         $result = true; */
420     return $result;
421 }    
422 ?>