be416270117a44de6e3a3c980c9a8be75c046f6a
[moodle.git] / calendar / view.php
1 <?php
3 /////////////////////////////////////////////////////////////////////////////
4 //                                                                         //
5 // NOTICE OF COPYRIGHT                                                     //
6 //                                                                         //
7 // Moodle - Calendar extension                                             //
8 //                                                                         //
9 // Copyright (C) 2003-2004  Greek School Network            www.sch.gr     //
10 //                                                                         //
11 // Designed by:                                                            //
12 //     Avgoustos Tsinakos (tsinakos@teikav.edu.gr)                         //
13 //     Jon Papaioannou (pj@moodle.org)                                     //
14 //                                                                         //
15 // Programming and development:                                            //
16 //     Jon Papaioannou (pj@moodle.org)                                     //
17 //                                                                         //
18 // For bugs, suggestions, etc contact:                                     //
19 //     Jon Papaioannou (pj@moodle.org)                                     //
20 //                                                                         //
21 // The current module was developed at the University of Macedonia         //
22 // (www.uom.gr) under the funding of the Greek School Network (www.sch.gr) //
23 // The aim of this project is to provide additional and improved           //
24 // functionality to the Asynchronous Distance Education service that the   //
25 // Greek School Network deploys.                                           //
26 //                                                                         //
27 // This program is free software; you can redistribute it and/or modify    //
28 // it under the terms of the GNU General Public License as published by    //
29 // the Free Software Foundation; either version 2 of the License, or       //
30 // (at your option) any later version.                                     //
31 //                                                                         //
32 // This program is distributed in the hope that it will be useful,         //
33 // but WITHOUT ANY WARRANTY; without even the implied warranty of          //
34 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the           //
35 // GNU General Public License for more details:                            //
36 //                                                                         //
37 //          http://www.gnu.org/copyleft/gpl.html                           //
38 //                                                                         //
39 /////////////////////////////////////////////////////////////////////////////
41 //  Display the calendar page.
43 require_once('../config.php');
44 require_once($CFG->dirroot.'/course/lib.php');
45 require_once($CFG->dirroot.'/calendar/lib.php');
47 $courseid = optional_param('course', 0, PARAM_INT);
48 $view = optional_param('view', 'upcoming', PARAM_ALPHA);
49 $day  = optional_param('cal_d', 0, PARAM_INT);
50 $mon  = optional_param('cal_m', 0, PARAM_INT);
51 $yr   = optional_param('cal_y', 0, PARAM_INT);
53 $site = get_site();
55 $url = new moodle_url('/calendar/view.php');
56 if ($courseid !== 0) {
57     $url->param('course', $courseid);
58 }
59 if ($view !== 'upcoming') {
60     $url->param('view', $view);
61 }
62 if ($day !== 0) {
63     $url->param('cal_d', $day);
64 }
65 if ($mon !== 0) {
66     $url->param('cal_m', $mon);
67 }
68 if ($yr !== 0) {
69     $url->param('cal_y', $yr);
70 }
71 $PAGE->set_url($url);
73 if ($courseid && $courseid != SITEID) {
74     require_login($courseid);
75 } else if ($CFG->forcelogin) {
76     require_login();
77 }
79 // Initialize the session variables
80 calendar_session_vars();
82 //add_to_log($course->id, "course", "view", "view.php?id=$course->id", "$course->id");
83 $now = usergetdate(time());
84 $pagetitle = '';
86 $strcalendar = get_string('calendar', 'calendar');
88 $link = calendar_get_link_href(CALENDAR_URL.'view.php?view=upcoming&amp;course='.$courseid.'&amp;',
89                                $now['mday'], $now['mon'], $now['year']);
90 $PAGE->navbar->add($strcalendar, new moodle_url($link));
92 if(!checkdate($mon, $day, $yr)) {
93     $day = intval($now['mday']);
94     $mon = intval($now['mon']);
95     $yr = intval($now['year']);
96 }
97 $time = make_timestamp($yr, $mon, $day);
99 switch($view) {
100     case 'day':
101         $PAGE->navbar->add(userdate($time, get_string('strftimedate')));
102         $pagetitle = get_string('dayview', 'calendar');
103     break;
104     case 'month':
105         $PAGE->navbar->add(userdate($time, get_string('strftimemonthyear')));
106         $pagetitle = get_string('detailedmonthview', 'calendar');
107     break;
108     case 'upcoming':
109         $pagetitle = get_string('upcomingevents', 'calendar');
110     break;
113 // If a course has been supplied in the URL, change the filters to show that one
114 if (!empty($courseid)) {
115     if ($course = $DB->get_record('course', array('id'=>$courseid))) {
116         if ($course->id == SITEID) {
117             // If coming from the home page, show all courses
118             $SESSION->cal_courses_shown = calendar_get_default_courses(true);
119             calendar_set_referring_course(0);
121         } else {
122             // Otherwise show just this one
123             $SESSION->cal_courses_shown = $course->id;
124             calendar_set_referring_course($SESSION->cal_courses_shown);
125         }
126     }
127 } else {
128     $course = null;
131 if (!isloggedin() or isguestuser()) {
132     $defaultcourses = calendar_get_default_courses();
133     calendar_set_filters($courses, $groups, $users, $defaultcourses, $defaultcourses);
135 } else {
136     calendar_set_filters($courses, $groups, $users);
139 // Let's see if we are supposed to provide a referring course link
140 // but NOT for the "main page" course
141 if ($SESSION->cal_course_referer != SITEID &&
142    ($shortname = $DB->get_field('course', 'shortname', array('id'=>$SESSION->cal_course_referer))) !== false) {
143     require_login();
144     if (empty($course)) {
145         $course = $DB->get_record('course', array('id'=>$SESSION->cal_course_referer)); // Useful to have around
146     }
149 $strcalendar = get_string('calendar', 'calendar');
150 $prefsbutton = calendar_preferences_button();
152 // Print title and header
153 $PAGE->set_title("$site->shortname: $strcalendar: $pagetitle");
154 $PAGE->set_heading($strcalendar);
155 $PAGE->set_button($prefsbutton);
157 echo $OUTPUT->header();
159 // Layout the whole page as three big columns.
160 echo '<table class="calendarlayout">';
161 echo '<tr>';
163 // START: Main column
165 echo '<td class="maincalendar">';
166 echo '<div class="heightcontainer">';
168 switch($view) {
169     case 'day':
170         calendar_show_day($day, $mon, $yr, $courses, $groups, $users, $courseid);
171     break;
172     case 'month':
173         calendar_show_month_detailed($mon, $yr, $courses, $groups, $users, $courseid);
174     break;
175     case 'upcoming':
176         calendar_show_upcoming_events($courses, $groups, $users, get_user_preferences('calendar_lookahead', CALENDAR_UPCOMING_DAYS), get_user_preferences('calendar_maxevents', CALENDAR_UPCOMING_MAXEVENTS), $courseid);
177     break;
180 //Link to calendar export page
181 echo $OUTPUT->container_start('bottom');
182 if (!empty($CFG->enablecalendarexport)) {
183     echo $OUTPUT->single_button(new moodle_url('export.php', array('course'=>$courseid)), get_string('exportcalendar', 'calendar'));
185     if (isloggedin()) {
186         $authtoken = sha1($USER->username . $USER->password . $CFG->calendar_exportsalt);
187         $usernameencoded = urlencode($USER->username);
189         echo "<a href=\"export_execute.php?preset_what=all&amp;preset_time=recentupcoming&amp;username=$usernameencoded&amp;authtoken=$authtoken\">"
190              .'<img src="'.$OUTPUT->pix_url('i/ical') . '" height="14" width="36" '
191              .'alt="'.get_string('ical', 'calendar').'" '
192              .'title="'.get_string('quickdownloadcalendar', 'calendar').'" />'
193              .'</a>';
194     }
197 echo $OUTPUT->container_end();
198 echo '</div>';
199 echo '</td>';
201 // END: Main column
203 // START: Last column (3-month display)
204 echo '<td class="sidecalendar">';
205 list($prevmon, $prevyr) = calendar_sub_month($mon, $yr);
206 list($nextmon, $nextyr) = calendar_add_month($mon, $yr);
207 $getvars = 'id='.$courseid.'&amp;cal_d='.$day.'&amp;cal_m='.$mon.'&amp;cal_y='.$yr; // For filtering
209 $content='<div class="filters">';
210 $content.=calendar_filter_controls($view, $getvars, NULL, $courses);
211 $content.='</div>';
213 $bc = new block_contents();
214 $bc->content = $content;
215 $bc->footer = '';
216 $bc->title = strip_tags(get_string('eventskey', 'calendar'));
217 echo $OUTPUT->block($bc, BLOCK_POS_LEFT);
219 $content='<div class="minicalendarblock minicalendartop">';
220 $content.=calendar_top_controls('display', array('id' => $courseid, 'm' => $prevmon, 'y' => $prevyr));
221 $content.=calendar_get_mini($courses, $groups, $users, $prevmon, $prevyr);
222 $content.='</div><div class="minicalendarblock">';
223 $content.=calendar_top_controls('display', array('id' => $courseid, 'm' => $mon, 'y' => $yr));
224 $content.=calendar_get_mini($courses, $groups, $users, $mon, $yr);
225 $content.='</div><div class="minicalendarblock">';
226 $content.=calendar_top_controls('display', array('id' => $courseid, 'm' => $nextmon, 'y' => $nextyr));
227 $content.=calendar_get_mini($courses, $groups, $users, $nextmon, $nextyr);
228 $content.='</div>';
230 $bc = new block_contents();
231 $bc->content = $content;
232 $bc->footer = '';
233 $bc->title = strip_tags(get_string('monthlyview', 'calendar'));
234 echo $OUTPUT->block($bc, BLOCK_POS_LEFT);
236 echo '</td>';
238 echo '</tr></table>';
240 echo $OUTPUT->footer();
244 function calendar_show_day($d, $m, $y, $courses, $groups, $users, $courseid) {
245     global $CFG, $USER;
247     if (!checkdate($m, $d, $y)) {
248         $now = usergetdate(time());
249         list($d, $m, $y) = array(intval($now['mday']), intval($now['mon']), intval($now['year']));
250     }
252     $getvars = 'from=day&amp;cal_d='.$d.'&amp;cal_m='.$m.'&amp;cal_y='.$y; // For filtering
254     $starttime = make_timestamp($y, $m, $d);
255     $endtime   = make_timestamp($y, $m, $d + 1) - 1;
257     $events = calendar_get_upcoming($courses, $groups, $users, 1, 100, $starttime);
259     $text = '';
260     if (!isguestuser() && isloggedin() && calendar_user_can_add_event()) {
261         $text.= '<div class="buttons">';
262         $text.= '<form action="'.CALENDAR_URL.'event.php" method="get">';
263         $text.= '<div>';
264         $text.= '<input type="hidden" name="action" value="new" />';
265         $text.= '<input type="hidden" name="course" value="'.$courseid.'" />';
266         $text.= '<input type="hidden" name="cal_d" value="'.$d.'" />';
267         $text.= '<input type="hidden" name="cal_m" value="'.$m.'" />';
268         $text.= '<input type="hidden" name="cal_y" value="'.$y.'" />';
269         $text.= '<input type="submit" value="'.get_string('newevent', 'calendar').'" />';
270         $text.= '</div></form></div>';
271     }
273     $text .= '<label for="cal_course_flt_jump">'.
274                get_string('dayview', 'calendar').
275              ':</label>'.
276              calendar_course_filter_selector($getvars);
278     echo '<div class="header">'.$text.'</div>';
280     echo '<div class="controls">'.calendar_top_controls('day', array('id' => $courseid, 'd' => $d, 'm' => $m, 'y' => $y)).'</div>';
282     if (empty($events)) {
283         // There is nothing to display today.
284         echo '<h3>'.get_string('daywithnoevents', 'calendar').'</h3>';
286     } else {
288         echo '<div class="eventlist">';
290         $underway = array();
292         // First, print details about events that start today
293         foreach ($events as $event) {
295             $event = new calendar_event($event);
296             $event->calendarcourseid = $courseid;
298             if ($event->timestart >= $starttime && $event->timestart <= $endtime) {  // Print it now
301 /*
302                 $dayend = calendar_day_representation($event->timestart + $event->timeduration);
303                 $timeend = calendar_time_representation($event->timestart + $event->timeduration);
304                 $enddate = usergetdate($event->timestart + $event->timeduration);
305                 // Set printable representation
306                 echo calendar_get_link_tag($dayend, CALENDAR_URL.'view.php?view=day'.$morehref.'&amp;', $enddate['mday'], $enddate['mon'], $enddate['year']).' ('.$timeend.')';
307 */
308                 //unset($event->time);
310                 $event->time = calendar_format_event_time($event, time(), '', false, $starttime);
311                 calendar_print_event($event);
313             } else {                                                                 // Save this for later
314                 $underway[] = $event;
315             }
316         }
318         // Then, show a list of all events that just span this day
319         if (!empty($underway)) {
320             echo '<h3>'.get_string('spanningevents', 'calendar').':</h3>';
321             foreach ($underway as $event) {
322                 $event->time = calendar_format_event_time($event, time(), '', false, $starttime);
323                 calendar_print_event($event);
324             }
325         }
327         echo '</div>';
329     }
332 function calendar_show_month_detailed($m, $y, $courses, $groups, $users, $courseid) {
333     global $CFG, $SESSION, $USER, $CALENDARDAYS;
334     global $day, $mon, $yr;
336     $getvars = 'from=month&amp;cal_d='.$day.'&amp;cal_m='.$mon.'&amp;cal_y='.$yr; // For filtering
338     $display = new stdClass;
339     $display->minwday = get_user_preferences('calendar_startwday', calendar_get_starting_weekday());
340     $display->maxwday = $display->minwday + 6;
342     if(!empty($m) && !empty($y)) {
343         $thisdate = usergetdate(time()); // Time and day at the user's location
344         if($m == $thisdate['mon'] && $y == $thisdate['year']) {
345             // Navigated to this month
346             $date = $thisdate;
347             $display->thismonth = true;
348         }
349         else {
350             // Navigated to other month, let's do a nice trick and save us a lot of work...
351             if(!checkdate($m, 1, $y)) {
352                 $date = array('mday' => 1, 'mon' => $thisdate['mon'], 'year' => $thisdate['year']);
353                 $display->thismonth = true;
354             }
355             else {
356                 $date = array('mday' => 1, 'mon' => $m, 'year' => $y);
357                 $display->thismonth = false;
358             }
359         }
360     }
361     else {
362         $date = usergetdate(time());
363         $display->thismonth = true;
364     }
366     // Fill in the variables we 're going to use, nice and tidy
367     list($d, $m, $y) = array($date['mday'], $date['mon'], $date['year']); // This is what we want to display
368     $display->maxdays = calendar_days_in_month($m, $y);
370     $startwday = 0;
371     if (get_user_timezone_offset() < 99) {
372         // We 'll keep these values as GMT here, and offset them when the time comes to query the db
373         $display->tstart = gmmktime(0, 0, 0, $m, 1, $y); // This is GMT
374         $display->tend = gmmktime(23, 59, 59, $m, $display->maxdays, $y); // GMT
375         $startwday = gmdate('w', $display->tstart); // $display->tstart is already GMT, so don't use date(): messes with server's TZ
376     } else {
377         // no timezone info specified
378         $display->tstart = mktime(0, 0, 0, $m, 1, $y);
379         $display->tend = mktime(23, 59, 59, $m, $display->maxdays, $y);
380         $startwday = date('w', $display->tstart); // $display->tstart not necessarily GMT, so use date()
381     }
383     // Align the starting weekday to fall in our display range
384     if($startwday < $display->minwday) {
385         $startwday += 7;
386     }
388     // Get events from database
389     $events = calendar_get_events(usertime($display->tstart), usertime($display->tend), $users, $groups, $courses);
390     if (!empty($events)) {
391         foreach($events as $eventid => $event) {
392             $event = new calendar_event($event);
393             if (!empty($event->modulename)) {
394                 $cm = get_coursemodule_from_instance($event->modulename, $event->instance);
395                 if (!groups_course_module_visible($cm)) {
396                     unset($events[$eventid]);
397                 }
398             }
399         }
400     }
402     // Extract information: events vs. time
403     calendar_events_by_day($events, $m, $y, $eventsbyday, $durationbyday, $typesbyday, $courses);
405     $text = '';
406     if(!isguestuser() && isloggedin() && calendar_user_can_add_event()) {
407         $text.= '<div class="buttons"><form action="'.CALENDAR_URL.'event.php" method="get">';
408         $text.= '<div>';
409         $text.= '<input type="hidden" name="action" value="new" />';
410         $text.= '<input type="hidden" name="course" value="'.$courseid.'" />';
411         $text.= '<input type="hidden" name="cal_m" value="'.$m.'" />';
412         $text.= '<input type="hidden" name="cal_y" value="'.$y.'" />';
413         $text.= '<input type="submit" value="'.get_string('newevent', 'calendar').'" />';
414         $text.= '</div></form></div>';
415     }
417     $text .= get_string('detailedmonthview', 'calendar').': '.calendar_course_filter_selector($getvars);
419     echo '<div class="header">'.$text.'</div>';
421     echo '<div class="controls">';
422     echo calendar_top_controls('month', array('id' => $courseid, 'm' => $m, 'y' => $y));
423     echo '</div>';
425     // Start calendar display
426     echo '<table class="calendarmonth calendartable"><tr class="weekdays">'; // Begin table. First row: day names
428     // Print out the names of the weekdays
429     for($i = $display->minwday; $i <= $display->maxwday; ++$i) {
430         // This uses the % operator to get the correct weekday no matter what shift we have
431         // applied to the $display->minwday : $display->maxwday range from the default 0 : 6
432         echo '<th scope="col">'.get_string($CALENDARDAYS[$i % 7], 'calendar').'</th>';
433     }
435     echo '</tr><tr>'; // End of day names; prepare for day numbers
437     // For the table display. $week is the row; $dayweek is the column.
438     $week = 1;
439     $dayweek = $startwday;
441     // Paddding (the first week may have blank days in the beginning)
442     for($i = $display->minwday; $i < $startwday; ++$i) {
443         echo '<td class="nottoday">&nbsp;</td>'."\n";
444     }
446     // Now display all the calendar
447     for($day = 1; $day <= $display->maxdays; ++$day, ++$dayweek) {
448         if($dayweek > $display->maxwday) {
449             // We need to change week (table row)
450             echo "</tr>\n<tr>";
451             $dayweek = $display->minwday;
452             ++$week;
453         }
455         // Reset vars
456         $cell = '';
457         $dayhref = calendar_get_link_href(CALENDAR_URL.'view.php?view=day&amp;course='.$courseid.'&amp;', $day, $m, $y);
459         if(CALENDAR_WEEKEND & (1 << ($dayweek % 7))) {
460             // Weekend. This is true no matter what the exact range is.
461             $class = 'weekend';
462         }
463         else {
464             // Normal working day.
465             $class = '';
466         }
468         // Special visual fx if an event is defined
469         if(isset($eventsbyday[$day])) {
470             if(count($eventsbyday[$day]) == 1) {
471                 $title = get_string('oneevent', 'calendar');
472             }
473             else {
474                 $title = get_string('manyevents', 'calendar', count($eventsbyday[$day]));
475             }
476             $cell = '<div class="day"><a href="'.$dayhref.'" title="'.$title.'">'.$day.'</a></div>';
477         }
478         else {
479             $cell = '<div class="day">'.$day.'</div>';
480         }
482         // Special visual fx if an event spans many days
483         $durationclass = false;
484         if (isset($typesbyday[$day]['durationglobal'])) {
485             $durationclass = ' duration_global';
486         } else if(isset($typesbyday[$day]['durationcourse'])) {
487             $durationclass = ' duration_course';
488         } else if(isset($typesbyday[$day]['durationgroup'])) {
489             $durationclass = ' duration_group';
490         } else if(isset($typesbyday[$day]['durationuser'])) {
491             $durationclass = ' duration_user';
492         }
493         if ($durationclass) {
494             $class .= ' duration '.$durationclass;
495         }
497         // Special visual fx for today
498         if($display->thismonth && $day == $d) {
499             $class .= ' today';
500         } else {
501             $class .= ' nottoday';
502         }
504         // Just display it
505         if(!empty($class)) {
506             $class = ' class="'.trim($class).'"';
507         }
508         echo '<td'.$class.'>'.$cell;
510         if(isset($eventsbyday[$day])) {
511             echo '<ul class="events-new">';
512             foreach($eventsbyday[$day] as $eventindex) {
514                 // If event has a class set then add it to the event <li> tag
515                 $eventclass = '';
516                 if (!empty($events[$eventindex]->class)) {
517                     $eventclass = ' class="'.$events[$eventindex]->class.'"';
518                 }
520                 echo '<li'.$eventclass.'><a href="'.$dayhref.'#event_'.$events[$eventindex]->id.'">'.format_string($events[$eventindex]->name, true).'</a></li>';
521             }
522             echo '</ul>';
523         }
524         if(isset($durationbyday[$day])) {
525             echo '<ul class="events-underway">';
526             foreach($durationbyday[$day] as $eventindex) {
527                 echo '<li>['.format_string($events[$eventindex]->name,true).']</li>';
528             }
529             echo '</ul>';
530         }
531         echo "</td>\n";
532     }
534     // Paddding (the last week may have blank days at the end)
535     for($i = $dayweek; $i <= $display->maxwday; ++$i) {
536         echo '<td class="nottoday">&nbsp;</td>';
537     }
538     echo "</tr>\n"; // Last row ends
540     echo "</table>\n"; // Tabular display of days ends
542     // OK, now for the filtering display
543     echo '<div class="filters"><table><tr>';
545     // Global events
546     if($SESSION->cal_show_global) {
547         echo '<td class="calendar_event_global" style="width: 8px;"></td><td><strong>'.get_string('globalevents', 'calendar').':</strong> ';
548         echo get_string('shown', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showglobal&amp;'.$getvars.'">'.get_string('clickhide', 'calendar').'</a>)</td>'."\n";
549     } else {
550         echo '<td style="width: 8px;"></td><td><strong>'.get_string('globalevents', 'calendar').':</strong> ';
551         echo get_string('hidden', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showglobal&amp;'.$getvars.'">'.get_string('clickshow', 'calendar').'</a>)</td>'."\n";
552     }
554     // Course events
555     if(!empty($SESSION->cal_show_course)) {
556         echo '<td class="calendar_event_course" style="width: 8px;"></td><td><strong>'.get_string('courseevents', 'calendar').':</strong> ';
557         echo get_string('shown', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showcourses&amp;'.$getvars.'">'.get_string('clickhide', 'calendar').'</a>)</td>'."\n";
558     } else {
559         echo '<td style="width: 8px;"></td><td><strong>'.get_string('courseevents', 'calendar').':</strong> ';
560         echo get_string('hidden', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showcourses&amp;'.$getvars.'">'.get_string('clickshow', 'calendar').'</a>)</td>'."\n";
561     }
563     echo "</tr>\n";
565     if(isloggedin() && !isguestuser()) {
566         echo '<tr>';
567         // Group events
568         if($SESSION->cal_show_groups) {
569             echo '<td class="calendar_event_group" style="width: 8px;"></td><td><strong>'.get_string('groupevents', 'calendar').':</strong> ';
570             echo get_string('shown', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showgroups&amp;'.$getvars.'">'.get_string('clickhide', 'calendar').'</a>)</td>'."\n";
571         } else {
572             echo '<td style="width: 8px;"></td><td><strong>'.get_string('groupevents', 'calendar').':</strong> ';
573             echo get_string('hidden', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showgroups&amp;'.$getvars.'">'.get_string('clickshow', 'calendar').'</a>)</td>'."\n";
574         }
575         // User events
576         if($SESSION->cal_show_user) {
577             echo '<td class="calendar_event_user" style="width: 8px;"></td><td><strong>'.get_string('userevents', 'calendar').':</strong> ';
578             echo get_string('shown', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showuser&amp;'.$getvars.'">'.get_string('clickhide', 'calendar').'</a>)</td>'."\n";
579         } else {
580             echo '<td style="width: 8px;"></td><td><strong>'.get_string('userevents', 'calendar').':</strong> ';
581             echo get_string('hidden', 'calendar').' (<a href="'.CALENDAR_URL.'set.php?var=showuser&amp;'.$getvars.'">'.get_string('clickshow', 'calendar').'</a>)</td>'."\n";
582         }
583         echo "</tr>\n";
584     }
586     echo '</table></div>';
589 function calendar_show_upcoming_events($courses, $groups, $users, $futuredays, $maxevents, $courseid) {
590     global $USER, $OUTPUT;
592     $events = calendar_get_upcoming($courses, $groups, $users, $futuredays, $maxevents);
594     $text = '';
596     if(!isguestuser() && isloggedin() && calendar_user_can_add_event()) {
597         $text.= '<div class="buttons">';
598         $text.= '<form action="'.CALENDAR_URL.'event.php" method="get">';
599         $text.= '<div>';
600         $text.= '<input type="hidden" name="action" value="new" />';
601         $text.= '<input type="hidden" name="course" value="'.$courseid.'" />';
602         $text.= '<input type="submit" value="'.get_string('newevent', 'calendar').'" />';
603         $text.= '</div></form></div>';
604     }
606     $text .= '<label for="cal_course_flt_jump">'.
607                get_string('upcomingevents', 'calendar').
608              ': </label>'.
609              calendar_course_filter_selector('from=upcoming');
611     echo '<div class="header">'.$text.'</div>';
613     if ($events) {
615         echo '<div class="eventlist">';
616         foreach ($events as $event) {
617             // Convert to calendar_event object so that we transform description
618             // accordingly
619             $event = new calendar_event($event);
620             $event->calendarcourseid = $courseid;
621             calendar_print_event($event);
622         }
623         echo '</div>';
624     } else {
625         echo $OUTPUT->heading(get_string('noupcomingevents', 'calendar'));
626     }
629 function calendar_course_filter_selector($getvars = '') {
630     global $USER, $SESSION, $OUTPUT;
632     if (!isloggedin() or isguestuser()) {
633         return '';
634     }
636     if (has_capability('moodle/calendar:manageentries', get_context_instance(CONTEXT_SYSTEM)) && !empty($CFG->calendar_adminseesall)) {
637         $courses = get_courses('all', 'c.shortname','c.id,c.shortname');
638     } else {
639         $courses = get_my_courses($USER->id, 'shortname');
640     }
642     unset($courses[SITEID]);
644     $courseoptions = array();
645     $courseoptions[SITEID] = get_string('fulllistofcourses');
646     foreach ($courses as $course) {
647         $courseoptions[$course->id] = format_string($course->shortname);
648     }
650     if (is_numeric($SESSION->cal_courses_shown)) {
651         $selected = $SESSION->cal_courses_shown;
652     } else {
653         $selected = '';
654     }
655     $select = new single_select(new moodle_url(CALENDAR_URL.'set.php?var=setcourse&'.$getvars), 'id', $courseoptions, $selected, null);
656     $select->class = 'cal_courses_flt';
657     echo $OUTPUT->render($select);