16688184761cc6cdefd46f137b82a6ce49c1db09
[moodle.git] / course / lib.php
1 <? // $Id$
2    // Library of useful functions
5 if (isset($COURSE_MAX_LOG_DISPLAY)) {  // Being included again - should never happen!!
6     return;
7 }
9 $COURSE_MAX_LOG_DISPLAY = 150;       // days
11 $COURSE_MAX_LOGS_PER_PAGE = 1000;    // records
13 $COURSE_TEACHER_COLOR = "#990000";   // To hilight certain items that are teacher-only
15 $COURSE_LIVELOG_REFRESH = 60;        // Seconds
19 function print_log_selector_form($course, $selecteduser=0, $selecteddate="today") {
21     global $USER, $CFG;
23     // Get all the possible users
24     $users = array();
26     if ($course->category) {
27         if ($courseusers = get_course_users($course->id, "u.lastaccess DESC")) {
28             foreach ($courseusers as $courseuser) {
29                 $users[$courseuser->id] = "$courseuser->firstname $courseuser->lastname";
30             }
31         }
32         if ($guest = get_guest()) {
33             $users[$guest->id] = "$guest->firstname $guest->lastname";
34         }
35     }
37     if (isadmin()) {
38         if ($ccc = get_records("course", "", "", "fullname")) {
39             foreach ($ccc as $cc) {
40                 if ($cc->category) {
41                     $courses["$cc->id"] = "$cc->fullname";
42                 } else {
43                     $courses["$cc->id"] = " $cc->fullname (Site)";
44                 }
45             }
46         }
47         asort($courses);
48     }
51     $strftimedate = get_string("strftimedate");
52     $strftimedaydate = get_string("strftimedaydate");
54     asort($users);
56     // Get all the possible dates
57     // Note that we are keeping track of real (GMT) time and user time
58     // User time is only used in displays - all calcs and passing is GMT
60     $timenow = time(); // GMT
62     // What day is it now for the user, and when is midnight that day (in GMT).
63     $timemidnight = $today = usergetmidnight($timenow);
65     // Put today up the top of the list
66     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
68     if (! $course->startdate) {
69         $course->startdate = $course->timecreated;
70     }
72     $numdates = 1;
73     while ($timemidnight > $course->startdate and $numdates < 365) {
74         $timemidnight = $timemidnight - 86400;
75         $timenow = $timenow - 86400;
76         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
77         $numdates++;
78     }
80     if ($selecteddate == "today") {
81         $selecteddate = $today;
82     }
84     echo "<CENTER>";
85     echo "<FORM ACTION=log.php METHOD=get>";
86     if (isadmin()) {
87         choose_from_menu ($courses, "id", $course->id, "");
88     } else {
89         echo "<INPUT TYPE=hidden NAME=id VALUE=\"$course->id\">";
90     }
91     if ($course->category) {
92         choose_from_menu ($users, "user", $selecteduser, get_string("allparticipants") );
93     }
94     choose_from_menu ($dates, "date", $selecteddate, get_string("alldays"));
95     echo "<INPUT TYPE=submit VALUE=\"".get_string("showtheselogs")."\">";
96     echo "</FORM>";
97     echo "</CENTER>";
98 }
100 function make_log_url($module, $url) {
101     switch ($module) {
102         case "course":
103         case "user":
104         case "file":
105         case "login":
106         case "lib":
107         case "admin":
108             return "/$module/$url";
109             break;
110         default:
111             return "/mod/$module/$url";
112             break;
113     }
117 function print_log($course, $user=0, $date=0, $order="ORDER BY l.time ASC") {
118 // It is assumed that $date is the GMT time of midnight for that day, 
119 // and so the next 86400 seconds worth of logs are printed.
121     global $CFG, $COURSE_MAX_LOGS_PER_PAGE;
123     if ($course->category) {
124         $selector = "WHERE l.course='$course->id' AND l.userid = u.id";
126     } else {
127         $selector = "WHERE l.userid = u.id";  // Show all courses
128         if ($ccc = get_courses(-1)) {
129             foreach ($ccc as $cc) {
130                 $courses[$cc->id] = "$cc->shortname";
131             }
132         }
133     }
135     if ($user) {
136         $selector .= " AND l.userid = '$user'";
137     }
139     if ($date) {
140         $enddate = $date + 86400;
141         $selector .= " AND l.time > '$date' AND l.time < '$enddate'";
142     }
144     if (!$logs = get_logs($selector, $order)) {
145         notify("No logs found!");
146         print_footer($course);
147         exit;
148     }
150     $count=0;
151     $tt = getdate(time());
152     $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]);
153     if (($totalcountlogs = count($logs)) > $COURSE_MAX_LOGS_PER_PAGE) {
154         $totalcountlogs = "$COURSE_MAX_LOGS_PER_PAGE/$totalcountlogs";
155     }
157     $strftimedatetime = get_string("strftimedatetime");
159     echo "<P ALIGN=CENTER>";
160     print_string("displayingrecords", "", $totalcountlogs);
161     echo "</P>";
163     $countlogs = 0;
164     echo "<TABLE BORDER=0 ALIGN=center CELLPADDING=3 CELLSPACING=3>";
165     foreach ($logs as $log) {
167         $countlogs++;
169         if ($countlogs > $COURSE_MAX_LOGS_PER_PAGE) {
170             break;
171         }
173         if ($ld = get_record("log_display", "module", "$log->module", "action", "$log->action")) {
174             $log->info = get_field($ld->mtable, $ld->field, "id", $log->info);
175         }
177         echo "<TR NOWRAP>";
178         if (! $course->category) {
179             echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"view.php?id=$log->course\">".$courses[$log->course]."</A></TD>";
180         }
181         echo "<TD NOWRAP ALIGN=right><FONT SIZE=2>".userdate($log->time, "%A")."</TD>";
182         echo "<TD NOWRAP><FONT SIZE=2>".userdate($log->time, $strftimedatetime)."</TD>";
183         echo "<TD NOWRAP><FONT SIZE=2>";
184         link_to_popup_window("/lib/ipatlas/plot.php?address=$log->ip&user=$log->userid", "ipatlas","$log->ip", 400, 700);
185         echo "</TD>";
186         echo "<TD NOWRAP><FONT SIZE=2><A HREF=\"../user/view.php?id=$log->userid&course=$log->course\"><B>$log->firstname $log->lastname</B></TD>";
187         echo "<TD NOWRAP><FONT SIZE=2>";
188         link_to_popup_window( make_log_url($log->module,$log->url), "fromloglive","$log->module $log->action", 400, 600);
189         echo "</TD>";
190         echo "<TD NOWRAP><FONT SIZE=2>$log->info</TD>";
191         echo "</TR>";
192     }
193     echo "</TABLE>";
197 function print_all_courses($category="all", $style="full", $maxcount=999, $width=180) {
198     global $CFG, $USER;
200     if ($category == "all") {
201         $courses = get_courses();
203     } else if ($category == "my") {
204         if (isset($USER->id)) {
205             if ($courses = get_courses()) {
206                 foreach ($courses as $key => $course) {
207                     if (!isteacher($course->id) and !isstudent($course->id)) {
208                         unset($courses[$key]);
209                     }
210                 }
211             }
212         }
214     } else {
215         $courses = get_courses($category);
216     }
218     if ($style == "minimal") {
219         $count = 0;
220         $icon  = "<IMG SRC=\"pix/i/course.gif\" HEIGHT=16 WIDTH=16 ALT=\"".get_string("course")."\">";
221         if ($courses) {
222             foreach ($courses as $course) {
223                 $moddata[]="<A TITLE=\"$course->shortname\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
224                 $modicon[]=$icon;
225                 if ($count++ >= $maxcount) {
226                     break;
227                 }
228             }   
229             $fulllist = "<P><A HREF=\"$CFG->wwwroot/course/\">".get_string("fulllistofcourses")."</A>...";
230         } else {
231             $moddata = array();
232             $modicon = array();
233             $fulllist = get_string("nocoursesyet");
234         }
235         print_side_block(get_string("courses"), "", $moddata, $modicon, $fulllist, $width);
237     } else if ($courses) {
238         foreach ($courses as $course) {
239             print_course($course);
240             echo "<BR>\n";
241         }
243     } else {
244         echo "<P>".get_string("nocoursesyet")."</P>";
245     }
249 function print_course($course) {
251     global $CFG;
253     if (! $site = get_site()) {
254         error("Could not find a site!");
255     }
257     print_simple_box_start("CENTER", "100%");
259     echo "<TABLE WIDTH=100%>";
260     echo "<TR VALIGN=top>";
261     echo "<TD VALIGN=top WIDTH=50%>";
262     echo "<P><FONT SIZE=3><B><A TITLE=\"".get_string("entercourse")."\" 
263               HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A></B></FONT></P>";
264     if ($teachers = get_course_teachers($course->id)) {
265         echo "<P><FONT SIZE=1>\n";
266         foreach ($teachers as $teacher) {
267             if ($teacher->authority > 0) {
268                 if (!$teacher->role) {
269                     $teacher->role = $course->teacher;
270                 }
271                 echo "$teacher->role: <A HREF=\"$CFG->wwwroot/user/view.php?id=$teacher->id&course=$site->id\">$teacher->firstname $teacher->lastname</A><BR>";
272             }
273         }
274         echo "</FONT></P>";
275     }
276     if ($course->guest) {
277         $strallowguests = get_string("allowguests");
278         echo "<A TITLE=\"$strallowguests\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
279         echo "<IMG VSPACE=4 ALT=\"$strallowguests\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/user/user.gif\"></A>&nbsp;&nbsp;";
280     }
281     if ($course->password) {
282         $strrequireskey = get_string("requireskey");
283         echo "<A TITLE=\"$strrequireskey\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
284         echo "<IMG VSPACE=4 ALT=\"$strrequireskey\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/pix/i/key.gif\"></A>";
285     }
288     echo "</TD><TD VALIGN=top WIDTH=50%>";
289     echo "<P><FONT SIZE=2>".text_to_html($course->summary)."</FONT></P>";
290     echo "</TD></TR>";
291     echo "</TABLE>";
293     print_simple_box_end();
296 function print_headline($text, $size=2) {
297     echo "<B><FONT SIZE=\"$size\">$text</FONT></B><BR>\n";
300 function print_recent_activity($course) {
301     // $course is an object
302     // This function trawls through the logs looking for 
303     // anything new since the user's last login
305     global $CFG, $USER, $COURSE_TEACHER_COLOR;
307     if (! $USER->lastlogin ) {
308         echo "<P ALIGN=CENTER><FONT SIZE=1>";
309         print_string("welcometocourse", "", $course->shortname);
310         echo "</FONT></P>";
311         return;
312     } else {
313         echo "<P ALIGN=CENTER><FONT SIZE=1>";
314         echo get_string("yourlastlogin").":<BR>"; 
315         echo userdate($USER->lastlogin, get_string("strftimerecentfull"));
316         echo "</FONT></P>";
317     }
319     if (! $logs = get_records_select("log", "time > '$USER->lastlogin' AND course = '$course->id'", "time ASC")) {
320         return;
321     }
324     // Firstly, have there been any new enrolments?
326     $heading = false;
327     $content = false;
328     foreach ($logs as $log) {
329         if ($log->module == "course" and $log->action == "enrol") {
330             if (! $heading) {
331                 print_headline(get_string("newusers").":");
332                 $heading = true;
333                 $content = true;
334             }
335             $user = get_record("user", "id", $log->info);
336             if (isstudent($course->id, $user->id)) {
337                 echo "<P><FONT SIZE=1><A HREF=\"../user/view.php?id=$user->id&course=$course->id\">$user->firstname $user->lastname</A></FONT></P>";
338             }
339         }
340     }
342     // Next, have there been any changes to the course structure?
344     foreach ($logs as $log) {
345         if ($log->module == "course") {
346             if ($log->action == "add mod" or $log->action == "update mod" or $log->action == "delete mod") {
347                 $info = split(" ", $log->info);
348                 $modname = get_field($info[0], "name", "id", $info[1]);
349             
350                 switch ($log->action) {
351                     case "add mod":
352                        $stradded = get_string("added", "moodle", get_string("modulename", $info[0]));
353                        $changelist["$log->info"] = array ("operation" => "add", "text" => "$stradded:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
354                     break;
355                     case "update mod":
356                        $strupdated = get_string("updated", "moodle", get_string("modulename", $info[0]));
357                        if (empty($changelist["$log->info"])) {
358                            $changelist["$log->info"] = array ("operation" => "update", "text" => "$strupdated:<BR><A HREF=\"$CFG->wwwroot/course/$log->url\">$modname</A>");
359                        }
360                     break;
361                     case "delete mod":
362                        if ($changelist["$log->info"]["operation"] == "add") {
363                            $changelist["$log->info"] = NULL;
364                        } else {
365                            $strdeleted = get_string("deletedactivity", "moodle", get_string("modulename", $info[0]));
366                            $changelist["$log->info"] = array ("operation" => "delete", "text" => $strdeleted);
367                        }
368                     break;
369                 }
370             }
371         }
372     }
374     if (!empty($changelist)) {
375         foreach ($changelist as $changeinfo => $change) {
376             if ($change) {
377                 $changes[$changeinfo] = $change;
378             }
379         }
380         if (count($changes) > 0) {
381             print_headline(get_string("courseupdates").":");
382             $content = true;
383             foreach ($changes as $changeinfo => $change) {
384                 echo "<P><FONT SIZE=1>".$change["text"]."</FONT></P>";
385             }
386         }
387     }
390     // Now display new things from each module
392     $mods = get_list_of_plugins("mod");
394     foreach ($mods as $mod) {
395         include_once("$CFG->dirroot/mod/$mod/lib.php");
396         $print_recent_activity = $mod."_print_recent_activity";
397         if (function_exists($print_recent_activity)) {
398             $modcontent = $print_recent_activity($logs, isteacher($course->id));
399             if ($modcontent) {
400                 $content = true;
401             }
402         }
403     }
406     if (! $content) {
407         echo "<FONT SIZE=2>".get_string("nothingnew")."</FONT>";
408     }
412 function get_array_of_activities($courseid) {
413 // For a given course, returns an array of course activity objects 
414 // Each item in the array contains he following properties:
415 //  cm - course module id
416 //  mod - name of the module (eg forum)
417 //  section - the number of the section (eg week or topic)
418 //  name - the name of the instance
420     $mod = array();
422     if (!$rawmods = get_course_mods($courseid)) {
423         return NULL;
424     }
426     if ($sections = get_records("course_sections", "course", $courseid, "section ASC")) {
427        foreach ($sections as $section) {
428            if (!empty($section->sequence)) {
429                $sequence = explode(",", $section->sequence);
430                foreach ($sequence as $seq) {
431                    if (empty($rawmods[$seq])) {
432                        continue;
433                    }
434                    $mod[$seq]->cm = $rawmods[$seq]->id;
435                    $mod[$seq]->mod = $rawmods[$seq]->modname;
436                    $mod[$seq]->section = $section->section;
437                    $mod[$seq]->name = urlencode(get_field($rawmods[$seq]->modname, "name", "id", $rawmods[$seq]->instance));
438                }
439             }
440         }
441     }
442     return $mod;
448 function get_all_mods($courseid, &$mods, &$modnames, &$modnamesplural, &$modnamesused) {
449 // Returns a number of useful structures for course displays
451     $mods          = NULL;    // course modules indexed by id
452     $modnames      = NULL;    // all course module names
453     $modnamesplural= NULL;    // all course module names (plural form)
454     $modnamesused  = NULL;    // course module names used
456     if ($allmods = get_records("modules")) {
457         foreach ($allmods as $mod) {
458             $modnames[$mod->name] = get_string("modulename", "$mod->name");
459             $modnamesplural[$mod->name] = get_string("modulenameplural", "$mod->name");
460         }
461         asort($modnames);
462     } else {
463         error("No modules are installed!");
464     }
466     if ($rawmods = get_course_mods($courseid)) {
467         foreach($rawmods as $mod) {    // Index the mods
468             $mods[$mod->id] = $mod;
469             $mods[$mod->id]->modfullname = $modnames[$mod->modname];
470             $modnamesused[$mod->modname] = $modnames[$mod->modname];
471         }
472         asort($modnamesused);
473     }
477 function get_all_sections($courseid) {
478     
479     return get_records("course_sections", "course", "$courseid", "section", 
480                        "section, id, course, summary, sequence");
484 function print_section_block($heading, $course, $section, $mods, $modnames, $modnamesused, 
485                              $absolute=true, $width="100%", $isediting=false) {
487     global $CFG;
489     $modinfo = unserialize($course->modinfo);
490     $moddata = array();
491     $modicon = array();
492     $editbuttons = "";
494     if (!empty($section->sequence)) {
496         $sectionmods = explode(",", $section->sequence);
498         foreach ($sectionmods as $modnumber) {
499             $mod = $mods[$modnumber];
500             if ($isediting) {
501                 $editbuttons = make_editing_buttons($mod->id, $absolute);
502             }
503             $instancename = urldecode($modinfo[$modnumber]->name);
504             $modicon[] = "<img src=\"$CFG->wwwroot/mod/$mod->modname/icon.gif\" height=\"16\" width=\"16\" alt=\"$mod->modfullname\">";
505             $moddata[] = "<a title=\"$mod->modfullname\" href=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename</a><BR>$editbuttons";
506         }
507     }
508     if ($isediting) {
509         $editmenu = popup_form("$CFG->wwwroot/course/mod.php?id=$course->id&amp;section=$section->section&add=", 
510                    $modnames, "section0", "", get_string("add")."...", "mods", get_string("activities"), true);
511         $editmenu = "<DIV ALIGN=right>$editmenu</DIV>";
512     } else {
513         $editmenu = "";
514     }
516     print_side_block($heading, "", $moddata, $modicon, $editmenu, $width);
520 function print_section($course, $section, $mods, $modnamesused, $absolute=false, $width="100%") {
521     global $CFG;
523     $modinfo = unserialize($course->modinfo);
525     echo "<TABLE WIDTH=\"$width\"><TR><TD>\n";
526     if (!empty($section->sequence)) {
528         $sectionmods = explode(",", $section->sequence);
530         foreach ($sectionmods as $modnumber) {
531             if (empty($mods[$modnumber])) {
532                 continue;
533             }
534             $mod = $mods[$modnumber];
535             $instancename = urldecode($modinfo[$modnumber]->name);
536             echo "<IMG SRC=\"$CFG->wwwroot/mod/$mod->modname/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"$mod->modfullname\">";
537             echo " <FONT SIZE=2><A TITLE=\"$mod->modfullname\"";
538             echo "   HREF=\"$CFG->wwwroot/mod/$mod->modname/view.php?id=$mod->id\">$instancename</A></FONT>";
539             if (isediting($course->id)) {
540                 echo "&nbsp;&nbsp;";
541                 echo make_editing_buttons($mod->id, $absolute);
542             }
543             echo "<BR>\n";
544         }
545     }
546     echo "</TD></TR></TABLE><BR>\n\n";
549 function print_heading_block($heading, $width="100%", $class="headingblock") {
550     global $THEME;
552     echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">";
553     echo "<tr><td bgcolor=\"$THEME->cellheading\" class=\"$class\">";
554     echo stripslashes($heading);
555     echo "</td></tr></table>";
558 function print_side_block($heading="", $content="", $list=NULL, $icons=NULL, $footer="", $width=180) {
559 // Prints a nice side block with an optional header.  The content can either 
560 // be a block of HTML or a list of text with optional icons.
561     
562     global $THEME;
564     print_side_block_start($heading, $width);
566     if ($content) {
567         echo "$content";
568     } else {
569         echo "<table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"2\">";
570         foreach ($list as $key => $string) {
571             echo "<tr bgcolor=\"$THEME->cellcontent2\">";
572             if ($icons) {
573                 echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"16\">".$icons[$key]."</td>";
574             }
575             echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"*\"><font size=\"-1\">$string</font></td>";
576             echo "</tr>";
577         }
578         if ($footer) {
579             echo "<tr bgcolor=\"$THEME->cellcontent2\">";
580             if ($icons) {
581                 echo "<td class=\"sideblocklinks\" valign=\"top\" width=\"16\">&nbsp;</td>";
582             }
583             echo "<td class=\"sideblocklinks\"><font size=\"-1\">$footer</td>";
584             echo "</tr>";
585         }
586         echo "</table>";
587     }
589     print_side_block_end();
592 function print_side_block_start($heading="", $width=180, $class="sideblockmain") {
593 // Starts a nice side block with an optional header.
594     
595     global $THEME;
597     echo "<table class=\"sideblock\" width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"5\">";
598     if ($heading) {
599         echo "<tr>";
600         echo "<td class=\"sideblockheading\" bgcolor=\"$THEME->cellheading\">$heading</td>";
601         echo "</tr>";
602     }
603     echo "<tr>";
604     echo "<td class=\"$class\" bgcolor=\"$THEME->cellcontent2\">";
607 function print_side_block_end() {
608     echo "</td></tr>";
609     echo "</table><br \>";
613 function print_admin_links ($siteid, $width=180) {
614     global $CFG;
615     
616     $icon = "<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
617     if (isadmin()) {
618             $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/config.php\">".get_string("configvariables")."</A>";
619                 $modicon[]=$icon;
620                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/site.php\">".get_string("sitesettings")."</A>";
621                 $modicon[]=$icon;
622                 $moddata[]="<A HREF=\"$CFG->wwwroot/course/log.php?id=$siteid\">".get_string("sitelogs")."</A>";
623                 $modicon[]=$icon;
624                 $moddata[]="<A HREF=\"$CFG->wwwroot/theme/index.php\">".get_string("choosetheme")."</A>";
625                 $modicon[]=$icon;
626                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/lang.php\">".get_string("checklanguage")."</A>";
627                 $modicon[]=$icon;
628                 if (file_exists("$CFG->dirroot/$CFG->admin/$CFG->dbtype")) {
629             $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/$CFG->dbtype/frame.php\">".get_string("managedatabase")."</A>";
630                         $modicon[]=$icon;
631                 }
632                 $moddata[]="<HR>";
633                 $modicon[]="";
634     }
635     if (iscreator()) {
636             $moddata[]="<A HREF=\"$CFG->wwwroot/course/edit.php\">".get_string("addnewcourse")."</A>";
637                 $modicon[]=$icon;
638                 $moddata[]="<A HREF=\"$CFG->wwwroot/course/teacher.php\">".get_string("assignteachers")."</A>";
639                 $modicon[]=$icon;
640         $fulladmin = "";
641     }
642     if (isadmin()) {
643             $moddata[]="<A HREF=\"$CFG->wwwroot/course/categories.php\">".get_string("categories")."</A>";
644                 $modicon[]=$icon;
645                 $moddata[]="<A HREF=\"$CFG->wwwroot/course/delete.php\">".get_string("deletecourse")."</A>";
646                 $modicon[]=$icon;
647                 $moddata[]="<HR>";
648                 $modicon[]="";
649                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/user.php?newuser=true\">".get_string("addnewuser")."</A>";
650                 $modicon[]=$icon;
651                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/user.php\">".get_string("edituser")."</A>";
652                 $modicon[]=$icon;
653                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/admin.php\">".get_string("assignadmins")."</A>";
654                 $modicon[]=$icon;
655         $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/creators.php\">".get_string("assigncreators")."</A>";
656                 $modicon[]=$icon;
657                 $moddata[]="<A HREF=\"$CFG->wwwroot/$CFG->admin/auth.php\">".get_string("authentication")."</A>";
658                 $modicon[]=$icon;
659         $fulladmin = "<P><A HREF=\"$CFG->wwwroot/$CFG->admin/\">".get_string("admin")."</A>...";
660     }
662     print_side_block(get_string("administration"), "", $moddata, $modicon, $fulladmin, $width);
664     echo "<IMG SRC=\"$CFG->wwwroot/pix/spacer.gif\" WIDTH=\"$width\" HEIGHT=1><BR>";
667 function print_course_admin_links($course, $width=180) {
668     global $USER, $CFG;
670     if (isteacher($course->id)) {
671         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/edit.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
672         if (isediting($course->id)) {
673             $admindata[]="<A HREF=\"view.php?id=$course->id&edit=off\">".get_string("turneditingoff")."</A>";
674         } else {
675             $admindata[]="<A HREF=\"view.php?id=$course->id&edit=on\">".get_string("turneditingon")."</A>";
676         }
677         $admindata[]="<A HREF=\"edit.php?id=$course->id\">".get_string("settings")."...</A>";
678         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
679         if (!$course->teachers) {
680             $course->teachers = get_string("defaultcourseteachers");
681         }
682         $admindata[]="<A HREF=\"teachers.php?id=$course->id\">$course->teachers...</A>";
683         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/settings.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
684     
685         $admindata[]="<A HREF=\"grades.php?id=$course->id\">".get_string("grades")."...</A>";
686         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/grades.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
687     
688         $admindata[]="<A HREF=\"log.php?id=$course->id\">".get_string("logs")."...</A>";
689         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/log.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
690         $admindata[]="<A HREF=\"$CFG->wwwroot/files/index.php?id=$course->id\">".get_string("files")."...</A>";
691         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/files/pix/files.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
692     
693         $admindata[]="<A HREF=\"$CFG->wwwroot/doc/view.php?id=$course->id&file=teacher.html\">".get_string("help")."...</A>";
694         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/resource/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
696         if ($teacherforum = forum_get_course_forum($course->id, "teacher")) {
697             $admindata[]="<A HREF=\"$CFG->wwwroot/mod/forum/view.php?f=$teacherforum->id\">".get_string("nameteacher", "forum")."</A>";
698             $adminicon[]="<IMG SRC=\"$CFG->wwwroot/mod/forum/icon.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
699         }
700     } else {
701         $admindata[]="<A HREF=\"grade.php?id=$course->id\">".get_string("grades")."...</A>";
702         $adminicon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/grades.gif\" HEIGHT=16 WIDTH=16 ALT=\"\">";
703     } 
705     print_side_block(get_string("administration"), "", $admindata, $adminicon, "", $width);
708 function print_course_categories($categories, $selected="none", $width=180) {
709     global $CFG, $THEME, $USER;
710     
711     $strallowguests = get_string("allowguests");
712     $strrequireskey = get_string("requireskey");
714     if ($selected == "index") {  // Print comprehensive index of categories with courses
715         if ($courses = get_courses()) {
716             if (isset($USER->id) and !isadmin()) {
717                 print_simple_box_start("CENTER", "100%", $THEME->cellheading);
718                 print_heading("<A HREF=\"course/index.php?category=my\">".get_string("mycourses")."</A>", "LEFT");
719                 $some = false;
720                 echo "<UL>";
721                 foreach ($courses as $key => $course) {
722                     if (isteacher($course->id) or isstudent($course->id)) {
723                         echo "<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
724                         echo "<BR>";
725                         $some = true;
726                     }
727                 }
728                 if (!$some) {
729                     print_string("nocoursesyet");
730                 }
731                 echo "</UL>";
732                 print_simple_box_end();
733                 print_spacer(8,1);
734             }
735             foreach ($categories as $category) {
736                 print_simple_box_start("CENTER", "100%");
737                 print_heading("<A HREF=\"course/index.php?category=$category->id\">$category->name</A>", "LEFT");
738                 $some = false;
739                 echo "<UL>";
740                 foreach ($courses as $key => $course) {
741                     if ($course->category == $category->id) {
742                         echo "<A HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">$course->fullname</A>";
743                         echo "&nbsp;&nbsp;";
744                         unset($courses[$key]);
745                         if ($course->guest ) {
746                             echo "<A TITLE=\"$strallowguests\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
747                             echo "<IMG ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/user/user.gif\"></A>";
748                         }
749                         if ($course->password) {
750                             echo "<A TITLE=\"$strrequireskey\" HREF=\"$CFG->wwwroot/course/view.php?id=$course->id\">";
751                             echo "<IMG ALT=\"\" HEIGHT=16 WIDTH=16 BORDER=0 SRC=\"$CFG->wwwroot/pix/i/key.gif\"></A>";
752                         }
753                         echo "<BR>";
754                         $some = true;
755                     }
756                 }
757                 if (!$some) {
758                     print_string("nocoursesyet");
759                 }
760                 echo "</UL>";
761                 print_simple_box_end();
762                 print_spacer(8,1);
763             }
764         }
766     } else {                    // Print short list of categories only 
767         foreach ($categories as $cat) {
768             $caticon[]="<IMG SRC=\"$CFG->wwwroot/pix/i/course.gif\" HEIGHT=16 WIDTH=16>";
769             if ($cat->id == $selected) {
770                 $catdata[]="$cat->name";
771             } else {
772                 $catdata[]="<A HREF=\"$CFG->wwwroot/course/index.php?category=$cat->id\">$cat->name</A>";
773             }
774         }
775         $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=all\">".get_string("fulllistofcourses")."</A>";
776         $caticon[] = "";
777         if (isset($USER->id)) {
778             $catdata[] = "<A HREF=\"$CFG->wwwroot/course/index.php?category=my\">".get_string("mycourses")."</A>";
779             $caticon[] = "";
780         }
781         print_side_block(get_string("categories"), "", $catdata, $caticon, "", $width);
782     }
785 function print_log_graph($course, $userid=0, $type="course.png", $date=0) {
786     global $CFG;
787     if (empty($CFG->gdversion)) {
788         echo "(".get_string("gdneed").")";
789     } else {
790         echo "<IMG BORDER=0 SRC=\"$CFG->wwwroot/course/loggraph.php?id=$course->id&user=$userid&type=$type&date=$date\">";
791     }
796 /// MODULE FUNCTIONS /////////////////////////////////////////////////////////////////
798 function add_course_module($mod) {
799     GLOBAL $db;
801     $mod->added = time();
803     return insert_record("course_modules", $mod);
806 function add_mod_to_section($mod) {
807 // Returns the course_sections ID where the mod is inserted
808     GLOBAL $db;
810     if ($section = get_record("course_sections", "course", "$mod->course", "section", "$mod->section")) {
811         if (!empty($section->sequence)) {
812             $newsequence = "$section->sequence,$mod->coursemodule";
813         } else {
814             $newsequence = "$mod->coursemodule";
815         }
816         if (set_field("course_sections", "sequence", $newsequence, "id", $section->id)) {
817             return $section->id;     // Return course_sections ID that was used.
818         } else {
819             return 0;
820         }
821        
822     } else {  // Insert a new record
823         $section->course = $mod->course;
824         $section->section = $mod->section;
825         $section->summary = "";
826         $section->sequence = $mod->coursemodule;
827         return insert_record("course_sections", $section);
828     }
831 function delete_course_module($mod) {
832     return set_field("course_modules", "deleted", 1, "id", $mod);
835 function delete_mod_from_section($mod, $section) {
836     GLOBAL $db;
838     if ($section = get_record("course_sections", "id", "$section") ) {
840         $modarray = explode(",", $section->sequence);
842         if ($key = array_keys ($modarray, $mod)) {
843             array_splice($modarray, $key[0], 1);
844             $newsequence = implode(",", $modarray);
845             return set_field("course_sections", "sequence", $newsequence, "id", $section->id);
846         } else {
847             return false;
848         }
849        
850     } else {  
851         return false;
852     }
856 function move_module($cm, $move) {
857     GLOBAL $db;
859     if (!$move) {
860         return true;
861     }
863     if (! $thissection = get_record("course_sections", "id", $cm->section)) {
864         error("This course section doesn't exist");
865     }
867     $mods = explode(",", $thissection->sequence);
869     $len = count($mods);
870     $pos = array_keys($mods, $cm->id);
871     $thepos = $pos[0];
873     if ($len == 0 || count($pos) == 0 ) {
874         error("Very strange. Could not find the required module in this section.");
875     }
877     if ($len == 1) {
878         $first = true;
879         $last = true;
880     } else {
881         $first = ($thepos == 0);
882         $last  = ($thepos == $len - 1);
883     }
885     if ($move < 0) {    // Moving the module up
887         if ($first) {
888             if ($thissection->section == 1) {  // First section, do nothing
889                 return true;
890             } else {               // Push onto end of previous section
891                 $prevsectionnumber = $thissection->section - 1;
892                 if (! $prevsection = get_record("course_sections", "course", "$thissection->course", 
893                                                                    "section", "$prevsectionnumber")) {
894                     error("Previous section ($prevsection->id) doesn't exist");
895                 }
897                 if (!empty($prevsection->sequence)) {
898                     $newsequence = "$prevsection->sequence,$cm->id";
899                 } else {
900                     $newsequence = "$cm->id";
901                 }
903                 if (! set_field("course_sections", "sequence", $newsequence, "id", $prevsection->id)) {
904                     error("Previous section could not be updated");
905                 }
907                 if (! set_field("course_modules", "section", $prevsection->id, "id", $cm->id)) {
908                     error("Module could not be updated");
909                 }
911                 array_splice($mods, 0, 1);
912                 $newsequence = implode(",", $mods);
913                 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
914                     error("Module could not be updated");
915                 }
917                 return true;
919             }
920         } else {        // move up within this section
921             $swap = $mods[$thepos-1];
922             $mods[$thepos-1] = $mods[$thepos];
923             $mods[$thepos] = $swap;
924             
925             $newsequence = implode(",", $mods);
926             if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
927                 error("This section could not be updated");
928             }
929             return true;
930         }
932     } else {            // Moving the module down
934         if ($last) {
935             $nextsectionnumber = $thissection->section + 1;
936             if ($nextsection = get_record("course_sections", "course", "$thissection->course", 
937                                                                "section", "$nextsectionnumber")) {
939                 if (!empty($nextsection->sequence)) {
940                     $newsequence = "$cm->id,$nextsection->sequence";
941                 } else {
942                     $newsequence = "$cm->id";
943                 }
945                 if (! set_field("course_sections", "sequence", $newsequence, "id", $nextsection->id)) {
946                     error("Next section could not be updated");
947                 }
949                 if (! set_field("course_modules", "section", $nextsection->id, "id", $cm->id)) {
950                     error("Module could not be updated");
951                 }
953                 array_splice($mods, $thepos, 1);
954                 $newsequence = implode(",", $mods);
955                 if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
956                     error("This section could not be updated");
957                 }
958                 return true;
960             } else {        // There is no next section, so just return
961                 return true;
963             }
964         } else {      // move down within this section
965             $swap = $mods[$thepos+1];
966             $mods[$thepos+1] = $mods[$thepos];
967             $mods[$thepos] = $swap;
968             
969             $newsequence = implode(",", $mods);
970             if (! set_field("course_sections", "sequence", $newsequence, "id", $thissection->id)) {
971                 error("This section could not be updated");
972             }
973             return true;
974         }
975     }
978 function make_editing_buttons($moduleid, $absolute=false) {
979     global $CFG;
981     $delete   = get_string("delete");
982     $moveup   = get_string("moveup");
983     $movedown = get_string("movedown");
984     $update   = get_string("update");
986     if ($absolute) {
987         $path = "$CFG->wwwroot/course/";
988     } else {
989         $path = "";
990     }
991     return "<A TITLE=\"$delete\" HREF=\"".$path."mod.php?delete=$moduleid\"><IMG 
992              SRC=".$path."../pix/t/delete.gif BORDER=0></A>
993           <A TITLE=\"$moveup\" HREF=\"".$path."mod.php?id=$moduleid&move=-1\"><IMG 
994              SRC=".$path."../pix/t/up.gif BORDER=0></A>
995           <A TITLE=\"$movedown\" HREF=\"".$path."mod.php?id=$moduleid&move=1\"><IMG 
996              SRC=".$path."../pix/t/down.gif BORDER=0></A>
997           <A TITLE=\"$update\" HREF=\"".$path."mod.php?update=$moduleid\"><IMG 
998              SRC=".$path."../pix/t/edit.gif BORDER=0></A>";
1001 ?>