6da45412d4fbc8ca9946715919c8824feaa23e68
[moodle.git] / course / lib.php
1 <? // $Id$
2    // Library of useful functions
5 $COURSE_MAX_LOG_DISPLAY = 150;       // days
7 $COURSE_TEACHER_COLOR = "#990000";   // To hilight certain items that are teacher-only
9 $COURSE_LIVELOG_REFRESH = 60;        // Seconds
12 function print_log_selector_form($course, $selecteduser=0, $selecteddate="today") {
14     global $USER, $CFG;
16     // Get all the possible users
17     $users = array();
19     if ($course->category) {
20         if ($students = get_records_sql("SELECT u.* FROM user u, user_students s 
21                                          WHERE s.course = '$course->id' AND s.user = u.id
22                                          ORDER BY u.lastaccess DESC")) {
23             foreach ($students as $student) {
24                 $users["$student->id"] = "$student->firstname $student->lastname";
25             }
26         }
27         if ($teachers = get_records_sql("SELECT u.* FROM user u, user_teachers t 
28                                          WHERE t.course = '$course->id' AND t.user = u.id
29                                          ORDER BY u.lastaccess DESC")) {
30             foreach ($teachers as $teacher) {
31                 $users["$teacher->id"] = "$teacher->firstname $teacher->lastname";
32             }
33         }
34         if ($guest = get_user_info_from_db("username", "guest")) {
35             $users["$guest->id"] = "$guest->firstname $guest->lastname";
36         }
37     }
39     if (isadmin()) {
40         if ($ccc = get_records_sql("SELECT * FROM course ORDER BY fullname")) {
41             foreach ($ccc as $cc) {
42                 if ($cc->category) {
43                     $courses["$cc->id"] = "$cc->fullname";
44                 } else {
45                     $courses["$cc->id"] = " $cc->fullname (Site)";
46                 }
47             }
48         }
49         asort($courses);
50     }
52     asort($users);
54     // Get all the possible dates
55     // Note that we are keeping track of real (GMT) time and user time
56     // User time is only used in displays - all calcs and passing is GMT
58     $timenow = time(); // GMT
60     // What day is it now for the user, and when is midnight that day (in GMT).
61     $timemidnight = $today = usergetmidnight($timenow);
63     // Put today up the top of the list
64     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, "%e %B %Y") );
66     if (! $course->startdate) {
67         $course->startdate = $course->timecreated;
68     }
70     $numdates = 1;
71     while ($timemidnight > $course->startdate and $numdates < 365) {
72         $timemidnight = $timemidnight - 86400;
73         $timenow = $timenow - 86400;
74         $dates["$timemidnight"] = userdate($timenow, "%A, %e %B %Y");
75         $numdates++;
76     }
78     if ($selecteddate == "today") {
79         $selecteddate = $today;
80     }
82     echo "<CENTER>";
83     echo "<FORM ACTION=log.php METHOD=get>";
84     if (isadmin()) {
85         choose_from_menu ($courses, "id", $course->id, "");
86     } else {
87         echo "<INPUT TYPE=hidden NAME=id VALUE=\"$course->id\">";
88     }
89     if ($course->category) {
90         choose_from_menu ($users, "user", $selecteduser, get_string("allparticipants") );
91     }
92     choose_from_menu ($dates, "date", $selecteddate, get_string("alldays"));
93     echo "<INPUT TYPE=submit VALUE=\"".get_string("showtheselogs")."\">";
94     echo "</FORM>";
95     echo "</CENTER>";
96 }
98 function make_log_url($module, $url) {
99     switch ($module) {
100         case "course":
101         case "user":
102         case "file":
103         case "login":
104         case "lib":
105         case "admin":
106             return "/$module/$url";
107             break;
108         default:
109             return "/mod/$module/$url";
110             break;
111     }
115 function print_log($course, $user=0, $date=0, $order="ORDER BY l.time ASC") {
116 // It is assumed that $date is the GMT time of midnight for that day, 
117 // and so the next 86400 seconds worth of logs are printed.
119     if ($course->category) {
120         $selector = "WHERE l.course='$course->id' AND l.user = u.id";
122     } else {
123         $selector = "WHERE l.user = u.id";  // Show all courses
124         if ($ccc = get_records_sql("SELECT * FROM course ORDER BY fullname")) {
125             foreach ($ccc as $cc) {
126                 $courses[$cc->id] = "$cc->shortname";
127             }
128         }
129     }
131     if ($user) {
132         $selector .= " AND l.user = '$user'";
133     }
135     if ($date) {
136         $enddate = $date + 86400;
137         $selector .= " AND l.time > '$date' AND l.time < '$enddate'";
138     }
140     if (!$logs = get_records_sql("SELECT l.*, u.firstname, u.lastname, u.picture 
141                                   FROM log l, user u $selector $order")){
142         notify("No logs found!");
143         print_footer($course);
144         exit;
145     }
147     $count=0;
148     $tt = getdate(time());
149     $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
150     echo "<P ALIGN=CENTER>Displaying ".count($logs)." records</P>";
151     echo "<TABLE BORDER=0 ALIGN=center CELLPADDING=3 CELLSPACING=3>";
152     foreach ($logs as $log) {
154         if ($ld = get_record_sql("SELECT * FROM log_display WHERE module='$log->module' AND action='$log->action'")) {
155             $log->info = get_field($ld->mtable, $ld->field, "id", $log->info);
156         }
158         echo "<TR NOWRAP>";
159         if (! $course->category) {
160             echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"view.php?id=$log->course\">".$courses[$log->course]."</A></TD>";
161         }
162         echo "<TD NOWRAP ALIGN=right><FONT SIZE=2>".userdate($log->time, "%A")."</TD>";
163         echo "<TD NOWRAP><FONT SIZE=2>".userdate($log->time, "%e %B %Y, %I:%M %p")."</TD>";
164         echo "<TD NOWRAP><FONT SIZE=2>";
165         link_to_popup_window("$CFG->wwwroot/lib/ipatlas/plot.php?address=$log->ip&user=$log->user", "ipatlas","$log->ip", 400, 700);
166         echo "</TD>";
167         echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"../user/view.php?id=$log->user&course=$log->course\"><B>$log->firstname $log->lastname</B></TD>";
168         echo "<TD NOWRAP><FONT SIZE=2>";
169         link_to_popup_window( make_log_url($log->module,$log->url), "fromloglive","$log->module $log->action", 400, 600);
170         echo "</TD>";
171         echo "<TD NOWRAP><FONT SIZE=2>$log->info</TD>";
172         echo "</TR>";
173     }
174     echo "</TABLE>";
178 function print_all_courses($category="all", $style="full", $maxcount=999) {
179     global $CFG, $USER;
181     if ($category == "all") {
182         $courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY fullname ASC");
184     } else if ($category == "my") {
185         if (isset($USER->id)) {
186             if ($courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY fullname ASC")) {
187                 foreach ($courses as $key => $course) {
188                     if (!isteacher($course->id) and !isstudent($course->id)) {
189                         unset($courses[$key]);
190                     }
191                 }
192             }
193         }
195     } else {
196         $courses = get_records("course", "category", $category, "fullname ASC");
197     }
199     if ($courses) {
200         if ($style == "minimal") {
201             $count = 0;
202             $icon  = "<IMG SRC=\"pix/i/course.gif\" HEIGHT=16 WIDTH=16 ALT=\"".get_string("course")."\">";
203             foreach ($courses as $course) {
204                 $moddata[]="<A TITLE=\"$course->shortname\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
205                 $modicon[]=$icon;
206                 if ($count++ >= $maxcount) {
207                     break;
208                 }
209             }   
210             $fulllist = "<P><A HREF=\"$CFG->wwwroot/course/\">".get_string("fulllistofcourses")."</A>...";
211             print_side_block("", $moddata, "$fulllist", $modicon);
213         } else {
214             foreach ($courses as $course) {
215                 print_course($course);
216                 echo "<BR>\n";
217             }
218         }
220     } else {
221         echo "<H3>".get_string("nocoursesyet")."</H3>";
222     }
226 function print_course($course) {
228     global $CFG;
230     if (! $site = get_site()) {
231         error("Could not find a site!");
232     }
234     print_simple_box_start("CENTER", "100%");
236     echo "<TABLE WIDTH=100%>";
237     echo "<TR VALIGN=top>";
238     echo "<TD VALIGN=top WIDTH=50%>";
239     echo "<P><FONT SIZE=3><B><A TITLE=\"".get_string("entercourse")."\" 
240               HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A></B></FONT></P>";
241     if ($teachers = get_course_teachers($course->id)) {
242         echo "<P><FONT SIZE=1>\n";
243         foreach ($teachers as $teacher) {
244             if ($teacher->authority > 0) {
245                 if (!$teacher->role) {
246                     $teacher->role = $course->teacher;
247                 }
248                 echo "$teacher->role: <A HREF=\"$CFG->wwwroot/user/view.php?id=$teacher->id&course=$site->id\">$teacher->firstname $teacher->lastname</A><BR>";
249             }
250         }
251         echo "</FONT></P>";
252     }
253     if ($course->guest) {
254         echo "<A TITLE=\"".get_string("allowguests")."\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
255         echo "<IMG VSPACE=4 ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/user/user.gif\"></A>&nbsp;&nbsp;";
256     }
257     if ($course->password) {
258         echo "<A TITLE=\"".get_string("requireskey")."\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
259         echo "<IMG VSPACE=4 ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/pix/i/key.gif\"></A>";
260     }
263     echo "</TD><TD VALIGN=top WIDTH=50%>";
264     echo "<P><FONT SIZE=2>".text_to_html($course->summary)."</FONT></P>";
265     echo "</TD></TR>";
266     echo "</TABLE>";
268     print_simple_box_end();
271 function print_headline($text, $size=2) {
272     echo "<B><FONT SIZE=\"$size\">$text</FONT></B><BR>\n";
275 function print_recent_activity($course) {
276     // $course is an object
277     // This function trawls through the logs looking for 
278     // anything new since the user's last login
280     global $CFG, $USER, $COURSE_TEACHER_COLOR;
282     if (! $USER->lastlogin ) {
283         echo "<P ALIGN=CENTER><FONT SIZE=1>";
284         print_string("welcometocourse", "", $course->shortname);
285         echo "</FONT></P>";
286         return;
287     } else {
288         echo "<P ALIGN=CENTER><FONT SIZE=1>";
289         echo get_string("yourlastlogin").":<BR>"; 
290         echo userdate($USER->lastlogin, "%A, %e %b %Y, %H:%M");
291         echo "</FONT></P>";
292     }
294     if (! $logs = get_records_sql("SELECT * FROM log WHERE time > '$USER->lastlogin' AND course = '$course->id' ORDER BY time ASC")) {
295         return;
296     }
299     // Firstly, have there been any new enrolments?
301     $heading = false;
302     $content = false;
303     foreach ($logs as $log) {
304         if ($log->module == "course" and $log->action == "enrol") {
305             if (! $heading) {
306                 print_headline(get_string("newusers").":");
307                 $heading = true;
308                 $content = true;
309             }
310             $user = get_record("user", "id", $log->info);
311             if (isstudent($course->id, $user->id)) {
312                 echo "<P><FONT SIZE=1><A HREF=\"../user/view.php?id=$user->id&course=$course->id\">$user->firstname $user->lastname</A></FONT></P>";
313             }
314         }
315     }
317     // Next, have there been any changes to the course structure?
319     foreach ($logs as $log) {
320         if ($log->module == "course") {
321             if ($log->action == "add mod" or $log->action == "update mod" or $log->action == "delete mod") {
322                 $info = split(" ", $log->info);
323                 $modname = get_field($info[0], "name", "id", $info[1]);
324             
325                 switch ($log->action) {
326                     case "add mod":
327                        $stradded = get_string("added", "moodle", get_string("modulename", $info[0]));
328                        $changelist["$log->info"] = array ("operation" => "add", "text" => "$stradded:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
329                     break;
330                     case "update mod":
331                        $strupdated = get_string("updated", "moodle", get_string("modulename", $info[0]));
332                        if (! $changelist["$log->info"]) {
333                            $changelist["$log->info"] = array ("operation" => "update", "text" => "$strupdated:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
334                        }
335                     break;
336                     case "delete mod":
337                        if ($changelist["$log->info"]["operation"] == "add") {
338                            $changelist["$log->info"] = NULL;
339                        } else {
340                            $strdeleted = get_string("deletedactivity", "moodle", get_string("modulename", $info[0]));
341                            $changelist["$log->info"] = array ("operation" => "delete", "text" => $strdeleted);
342                        }
343                     break;
344                 }
345             }
346         }
347     }
349     if ($changelist) {
350         foreach ($changelist as $changeinfo => $change) {
351             if ($change) {
352                 $changes[$changeinfo] = $change;
353             }
354         }
355         if (count($changes) > 0) {
356             print_headline(get_string("courseupdates").":");
357             $content = true;
358             foreach ($changes as $changeinfo => $change) {
359                 echo "<P><FONT SIZE=1>".$change["text"]."</FONT></P>";
360             }
361         }
362     }
365     // Now display new things from each module
367     $mods = get_list_of_plugins("mod");
369     foreach ($mods as $mod) {
370         include_once("$CFG->dirroot/mod/$mod/lib.php");
371         $print_recent_activity = $mod."_print_recent_activity";
372         if (function_exists($print_recent_activity)) {
373             $modcontent = $print_recent_activity($logs, isteacher($course->id));
374             if ($modcontent) {
375                 $content = true;
376             }
377         }
378     }
381     if (! $content) {
382         echo "<FONT SIZE=2>".get_string("nothingnew")."</FONT>";
383     }
387 function get_array_of_activities($courseid) {
388 // For a given course, returns an array of course activity objects 
389 // Each item in the array contains he following properties:
390 //  cm - course module id
391 //  mod - name of the module (eg forum)
392 //  section - the number of the section (eg week or topic)
393 //  name - the name of the instance
395     $mod = array();
397     if (!$rawmods = get_records_sql("SELECT cm.*, m.name as modname
398                                      FROM modules m, course_modules cm
399                                      WHERE cm.course = '$courseid' 
400                                        AND cm.deleted = '0'
401                                        AND cm.module = m.id ") ) {
402         return NULL;
403     }
405     if ($sections = get_records("course_sections", "course", $courseid, "section ASC")) {
406        foreach ($sections as $section) {
407            if ($section->sequence) {
408                $sequence = explode(",", $section->sequence);
409                foreach ($sequence as $seq) {
410                    $mod[$seq]->cm = $rawmods[$seq]->id;
411                    $mod[$seq]->mod = $rawmods[$seq]->modname;
412                    $mod[$seq]->section = $section->section;
413                    $mod[$seq]->name = urlencode(get_field($rawmods[$seq]->modname, "name", "id", $rawmods[$seq]->instance));
414                }
415             }
416         }
417     }
418     return $mod;
424 function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
425 // Returns a number of useful structures for course displays
427     $mods          = NULL;    // course modules indexed by id
428     $modnames      = NULL;    // all course module names
429     $modnamesplural= NULL;    // all course module names (plural form)
430     $modnamesused  = NULL;    // course module names used
432     if ($allmods = get_records_sql("SELECT * FROM modules") ) {
433         foreach ($allmods as $mod) {
434             $modnames[$mod->name] = get_string("modulename", "$mod->name");
435             $modnamesplural[$mod->name] = get_string("modulenameplural", "$mod->name");
436         }
437         asort($modnames);
438     } else {
439         error("No modules are installed!");
440     }
442     if ($rawmods = get_records_sql("SELECT cm.*, m.name as modname
443                                      FROM modules m, course_modules cm
444                                      WHERE cm.course = '$courseid' 
445                                        AND cm.deleted = '0'
446                                        AND cm.module = m.id ") ) {
447         foreach($rawmods as $mod) {    // Index the mods
448             $mods[$mod->id] = $mod;
449             $mods[$mod->id]->modfullname = $modnames[$mod->modname];
450             $modnamesused[$mod->modname] = $modnames[$mod->modname];
451         }
452         asort($modnamesused);
453     }
456 function get_all_sections($courseid) {
457     
458     return get_records_sql("SELECT section, id, course, summary, sequence
459                             FROM course_sections 
460                             WHERE course = '$courseid' 
461                             ORDER BY section");
464 function get_all_categories() {
465     return get_records_sql("SELECT * FROM course_categories ORDER by name");
468 function print_section($course, $section, $mods, $modnamesused, $absolute=false, $width="100%") {
469     global $CFG;
472     echo "<TABLE WIDTH=\"$width\"><TR><TD>\n";
473     if ($section->sequence) {
475         $sectionmods = explode(",", $section->sequence);
477         foreach ($sectionmods as $modnumber) {
478             $mod = $mods[$modnumber];
479             $instancename = get_field("$mod->modname", "name", "id", "$mod->instance");
480             echo "<IMG SRC=\"$CFG->wwwroot/mod/$mod->modname/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"$mod->modfullname\">";
481             echo " <FONT SIZE=2><A TITLE=\"$mod->modfullname\"";
482             echo "   HREF=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename</A></FONT>";
483             if (isediting($course->id)) {
484                 echo make_editing_buttons($mod->id, $absolute);
485             }
486             echo "<BR>\n";
487         }
488     }
489     echo "</TD></TR></TABLE><BR>\n\n";
492 function print_side_block($heading="", $list=NULL, $footer="", $icons=NULL, $width=180) {
493     
494     echo "<TABLE WIDTH=\"$width\">\n";
495     echo "<TR><TD COLSPAN=2><P><B><FONT SIZE=2>$heading</TD></TR>\n";
496     if ($list) {
497         foreach($list as $key => $string) {
498             echo "<TR><TD VALIGN=top WIDTH=12>";
499             if ($icons[$key]) {
500                 echo $icons[$key];
501             } else {
502                 echo "";
503             }
504             echo "</TD>\n<TD WIDTH=100% VALIGN=top>";
505             echo "<P><FONT SIZE=2>$string</FONT></P>";
506             echo "</TD></TR>\n";
507         }
508     }
509     if ($footer) {
510         echo "<TR><TD></TD><TD ALIGN=left><P><FONT SIZE=2>$footer</TD></TR>\n";
511     }
512     echo "</TABLE><BR>\n\n";
515 function print_admin_links ($siteid, $width=180) {
516     global $THEME, $CFG;
517     
518     print_simple_box(get_string("administration"), $align="CENTER", $width, $color="$THEME->cellheading");
519     $icon = "<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
520     $moddata[]="<A HREF=\"$CFG->wwwroot/admin/config.php\">".get_string("configvariables")."</A>";
521     $modicon[]=$icon;
522     $moddata[]="<A HREF=\"$CFG->wwwroot/admin/site.php\">".get_string("sitesettings")."</A>";
523     $modicon[]=$icon;
524     $moddata[]="<A HREF=\"$CFG->wwwroot/course/log.php?id=$siteid\">".get_string("sitelogs")."</A>";
525     $modicon[]=$icon;
526     $moddata[]="<A HREF=\"$CFG->wwwroot/theme/index.php\">".get_string("choosetheme")."</A>";
527     $modicon[]=$icon;
528     $moddata[]="<A HREF=\"$CFG->wwwroot/admin/lang.php\">".get_string("checklanguage")."</A>";
529     $modicon[]=$icon;
530     if (file_exists("$CFG->dirroot/admin/$CFG->dbtype")) {
531         $moddata[]="<A HREF=\"$CFG->wwwroot/admin/$CFG->dbtype/\">".get_string("managedatabase")."</A>";
532         $modicon[]=$icon;
533     }
534     $moddata[]="<HR>";
535     $modicon[]="";
536     $moddata[]="<A HREF=\"$CFG->wwwroot/course/edit.php\">".get_string("addnewcourse")."</A>";
537     $modicon[]=$icon;
538     $moddata[]="<A HREF=\"$CFG->wwwroot/course/categories.php\">".get_string("categories")."</A>";
539     $modicon[]=$icon;
540     $moddata[]="<A HREF=\"$CFG->wwwroot/course/teacher.php\">".get_string("assignteachers")."</A>";
541     $modicon[]=$icon;
542     $moddata[]="<A HREF=\"$CFG->wwwroot/course/delete.php\">".get_string("deletecourse")."</A>";
543     $modicon[]=$icon;
544     $moddata[]="<HR>";
545     $modicon[]="";
546     $moddata[]="<A HREF=\"$CFG->wwwroot/admin/user.php?newuser=true\">".get_string("addnewuser")."</A>";
547     $modicon[]=$icon;
548     $moddata[]="<A HREF=\"$CFG->wwwroot/admin/user.php\">".get_string("edituser")."</A>";
549     $modicon[]=$icon;
550     $fulladmin = "<P><A HREF=\"$CFG->wwwroot/admin/\">".get_string("admin")."</A>...";
551     print_side_block("", $moddata, "$fulladmin", $modicon, $width);
552     echo "<IMG SRC=\"$CFG->wwwroot/pix/spacer.gif\" WIDTH=\"$width\" HEIGHT=1><BR>";
555 function print_course_admin_links($course, $width=180) {
556     global $THEME, $CFG;
558     echo "<BR>";
559     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/edit.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
560     if (isediting($course->id)) {
561         $admindata[]="<A HREF=\"view.php?id=$course->id&edit=off\">".get_string("turneditingoff")."</A>";
562     } else {
563         $admindata[]="<A HREF=\"view.php?id=$course->id&edit=on\">".get_string("turneditingon")."</A>";
564     }
565     $admindata[]="<A HREF=\"edit.php?id=$course->id\">".get_string("settings")."...</A>";
566     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
567     if (!$course->teachers) {
568         $course->teachers = get_string("defaultcourseteachers");
569     }
570     $admindata[]="<A HREF=\"teachers.php?id=$course->id\">$course->teachers...</A>";
571     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
573     $admindata[]="<A HREF=\"grades.php?id=$course->id\">".get_string("grades")."...</A>";
574     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/grades.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
576     $admindata[]="<A HREF=\"log.php?id=$course->id\">".get_string("logs")."...</A>";
577     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/log.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
578     $admindata[]="<A HREF=\"$CFG->wwwroot/files/index.php?id=$course->id\">".get_string("files")."...</A>";
579     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/files/pix/files.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
581     $admindata[]="<A HREF=\"$CFG->wwwroot/doc/view.php?id=$course->id&file=teacher.html\">".get_string("help")."...</A>";
582     $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/resource/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
585     if ($teacherforum = forum_get_course_forum($course->id, "teacher")) {
586         $admindata[]="<A HREF=\"$CFG->wwwroot/mod/forum/view.php?f=$teacherforum->id\">".get_string("nameteacher", "forum")."</A>";
587         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/forum/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
588     }
590     print_simple_box(get_string("administration"), $align="CENTER", $width, $color="$THEME->cellheading");
591     print_side_block("", $admindata, "", $adminicon, $width);
594 function print_course_categories($categories, $selected="none", $width=180) {
595     global $CFG, $THEME, $USER;
597     if ($selected == "index") {  // Print comprehensive index of categories with courses
598         if ($courses = get_records_sql("SELECT * FROM course WHERE category > 0 ORDER BY shortname")) {
599             if (isset($USER->id) and !isadmin()) {
600                 print_simple_box_start("LEFT", "100%");
601                 print_heading("<A HREF=\"course/index.php?category=my\">".get_string("mycourses")."</A>", "LEFT");
602                 $some = false;
603                 echo "<UL>";
604                 foreach ($courses as $key => $course) {
605                     if (isteacher($course->id) or isstudent($course->id)) {
606                         echo "<IMG SRC=\"$CFG->wwwroot/pix/i/course.gif\" HEIGHT=16 WIDTH=16>&nbsp;<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</A> &nbsp; ";
607                         $some = true;
608                     }
609                 }
610                 if (!$some) {
611                     print_string("nocoursesyet");
612                 }
613                 echo "</UL>";
614                 print_simple_box_end();
615                 print_spacer(8,1);
616             }
617             foreach ($categories as $category) {
618                 print_simple_box_start("CENTER", "100%");
619                 print_heading("<A HREF=\"course/index.php?category=$category->id\">$category->name</A>", "LEFT");
620                 $some = false;
621                 echo "<UL>";
622                 foreach ($courses as $key => $course) {
623                     if ($course->category == $category->id) {
624                         echo "<IMG SRC=\"$CFG->wwwroot/pix/i/course.gif\" HEIGHT=16 WIDTH=16>&nbsp;<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->shortname</A> &nbsp; ";
625                         unset($courses[$key]);
626                         $some = true;
627                     }
628                 }
629                 if (!$some) {
630                     print_string("nocoursesyet");
631                 }
632                 echo "</UL>";
633                 print_simple_box_end();
634                 print_spacer(8,1);
635             }
636         }
638     } else {                    // Print short list of categories only 
639         foreach ($categories as $cat) {
640             $caticon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/course.gif\" HEIGHT=16 WIDTH=16>";
641             if ($cat->id == $selected) {
642                 $catdata[]="$cat->name";
643             } else {
644                 $catdata[]="<A HREF=\"$CFG->wwwroot/course/index.php?category=$cat->id\">$cat->name</A>";
645             }
646         }
647         $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=all\">".get_string("fulllistofcourses")."</A>";
648         if (isset($USER->id)) {
649             $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=my\">".get_string("mycourses")."</A>";
650         }
651         print_side_block("", $catdata, $showall.$mine, $caticon, $width);
652     }
655 function print_log_graph($course, $userid=0, $type="course.png", $date=0) {
656     global $CFG;
657     echo "<IMG BORDER=0 SRC=\"$CFG->wwwroot/course/loggraph.php?id=$course->id&user=$userid&type=$type&date=$date\">";
662 /// MODULE FUNCTIONS /////////////////////////////////////////////////////////////////
664 function add_course_module($mod) {
665     GLOBAL $db;
667     $mod->added = time();
669     return insert_record("course_modules", $mod);
672 function add_mod_to_section($mod) {
673 // Returns the course_sections ID where the mod is inserted
674     GLOBAL $db;
676     if ($section = get_record_sql("SELECT * FROM course_sections 
677                                    WHERE course = '$mod->course' AND section = '$mod->section'") ) {
679         if ($section->sequence) {
680             $newsequence = "$section->sequence,$mod->coursemodule";
681         } else {
682             $newsequence = "$mod->coursemodule";
683         }
684         if (set_field("course_sections", "sequence", $newsequence, "id", $section->id)) {
685             return $section->id;     // Return course_sections ID that was used.
686         } else {
687             return 0;
688         }
689        
690     } else {  // Insert a new record
691         $section->course = $mod->course;
692         $section->section = $mod->section;
693         $section->summary = "";
694         $section->sequence = $mod->coursemodule;
695         return insert_record("course_sections", $section);
696     }
699 function delete_course_module($mod) {
700     return set_field("course_modules", "deleted", 1, "id", $mod);
703 function delete_mod_from_section($mod, $section) {
704     GLOBAL $db;
706     if ($section = get_record("course_sections", "id", "$section") ) {
708         $modarray = explode(",", $section->sequence);
710         if ($key = array_keys ($modarray, $mod)) {
711             array_splice($modarray, $key[0], 1);
712             $newsequence = implode(",", $modarray);
713             return set_field("course_sections", "sequence", $newsequence, "id", $section->id);
714         } else {
715             return false;
716         }
717        
718     } else {  
719         return false;
720     }
724 function move_module($id, $move) {
725     GLOBAL $db;
727     if (!$move) {
728         return true;
729     }
731     if (! $cm = get_record("course_modules", "id", $id)) {
732         error("This course module doesn't exist");
733     }
734     
735     if (! $thissection = get_record("course_sections", "id", $cm->section)) {
736         error("This course section doesn't exist");
737     }
739     $mods = explode(",", $thissection->sequence);
741     $len = count($mods);
742     $pos = array_keys($mods, $cm->id);
743     $thepos = $pos[0];
745     if ($len == 0 || count($pos) == 0 ) {
746         error("Very strange. Could not find the required module in this section.");
747     }
749     if ($len == 1) {
750         $first = true;
751         $last = true;
752     } else {
753         $first = ($thepos == 0);
754         $last  = ($thepos == $len - 1);
755     }
757     if ($move < 0) {    // Moving the module up
759         if ($first) {
760             if ($thissection->section == 1) {  // First section, do nothing
761                 return true;
762             } else {               // Push onto end of previous section
763                 $prevsectionnumber = $thissection->section - 1;
764                 if (! $prevsection = get_record_sql("SELECT * FROM course_sections 
765                                                   WHERE course='$thissection->course'
766                                                   AND section='$prevsectionnumber' ")) {
767                     error("Previous section ($prevsection->id) doesn't exist");
768                 }
770                 if ($prevsection->sequence) {
771                     $newsequence = "$prevsection->sequence,$cm->id";
772                 } else {
773                     $newsequence = "$cm->id";
774                 }
776                 if (! set_field("course_sections", "sequence", $newsequence, "id", $prevsection->id)) {
777                     error("Previous section could not be updated");
778                 }
780                 if (! set_field("course_modules", "section", $prevsection->id, "id", $cm->id)) {
781                     error("Module could not be updated");
782                 }
784                 array_splice($mods, 0, 1);
785                 $newsequence = implode(",", $mods);
786                 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
787                     error("Module could not be updated");
788                 }
790                 return true;
792             }
793         } else {        // move up within this section
794             $swap = $mods[$thepos-1];
795             $mods[$thepos-1] = $mods[$thepos];
796             $mods[$thepos] = $swap;
797             
798             $newsequence = implode(",", $mods);
799             if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
800                 error("This section could not be updated");
801             }
802             return true;
803         }
805     } else {            // Moving the module down
807         if ($last) {
808             $nextsectionnumber = $thissection->section + 1;
809             if ($nextsection = get_record_sql("SELECT * FROM course_sections 
810                                             WHERE course='$thissection->course'
811                                             AND section='$nextsectionnumber' ")) {
813                 if ($nextsection->sequence) {
814                     $newsequence = "$cm->id,$nextsection->sequence";
815                 } else {
816                     $newsequence = "$cm->id";
817                 }
819                 if (! set_field("course_sections", "sequence", $newsequence, "id", $nextsection->id)) {
820                     error("Next section could not be updated");
821                 }
823                 if (! set_field("course_modules", "section", $nextsection->id, "id", $cm->id)) {
824                     error("Module could not be updated");
825                 }
827                 array_splice($mods, $thepos, 1);
828                 $newsequence = implode(",", $mods);
829                 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
830                     error("This section could not be updated");
831                 }
832                 return true;
834             } else {        // There is no next section, so just return
835                 return true;
837             }
838         } else {      // move down within this section
839             $swap = $mods[$thepos+1];
840             $mods[$thepos+1] = $mods[$thepos];
841             $mods[$thepos] = $swap;
842             
843             $newsequence = implode(",", $mods);
844             if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
845                 error("This section could not be updated");
846             }
847             return true;
848         }
849     }
852 function make_editing_buttons($moduleid, $absolute=false) {
853     global $CFG;
855     $delete   = get_string("delete");
856     $moveup   = get_string("moveup");
857     $movedown = get_string("movedown");
858     $update   = get_string("update");
860     if ($absolute) {
861         $path = "$CFG->wwwroot/course/";
862     } else {
863         $path = "";
864     }
865     return "&nbsp; &nbsp; 
866           <A TITLE=\"$delete\" HREF=\"".$path."mod.php?delete=$moduleid\"><IMG 
867              SRC=".$path."../pix/t/delete.gif BORDER=0></A>
868           <A TITLE=\"$moveup\" HREF=\"".$path."mod.php?id=$moduleid&move=-1\"><IMG 
869              SRC=".$path."../pix/t/up.gif BORDER=0></A>
870           <A TITLE=\"$movedown\" HREF=\"".$path."mod.php?id=$moduleid&move=1\"><IMG 
871              SRC=".$path."../pix/t/down.gif BORDER=0></A>
872           <A TITLE=\"$update\" HREF=\"".$path."mod.php?update=$moduleid\"><IMG 
873              SRC=".$path."../pix/t/edit.gif BORDER=0></A>";
876 ?>