/** * @param $Date &Academic_time Start time of day. * @return array[string] Class names. */ function CalCssGetDateClasses(&$day_start, $day_of_week, $past = NULL) { $today = Academic_time::NewToday(); $today_id = $today->Format('Ymd'); $cell_id = $day_start->Format('Ymd'); $classes_list = array(); if ($cell_id == $today_id) { $classes_list[] = 'tod'; } if ($day_start->Month() % 2 == 0) { $classes_list[] = 'ev'; } if (($day_of_week + 6) % 7 > 4) { $classes_list[] = 'we'; } if (NULL === $past && $day_start->Timestamp() < $today->Timestamp() || true === $past) { $classes_list[] = 'pa'; } return $classes_list; }
/** * @param $UriSegment string URI segment. * @param $AllowRange bool Whether to allow date ranges (using ':' in between). * @return array Return structure: * - 'valid' (bool Whether successful) * - 'start' (Academic_time Start of range specified by @a $UriSegment) * - 'end' (Academic_time End of range specified by @a $UriSegment) * - 'format' (string Format string which can be passed to GenerateUri()) * - 'description' (string Description of the date [range]) */ function ReadUri($UriSegment, $AllowRange = TRUE) { // Use GenerateRegex to get regex $regex = $this->GetRegex($AllowRange); $format = self::DefaultFormat(); $description = ''; $valid = preg_match($regex, $UriSegment, $results) > 0; if ($valid) { if ($this->mDebug) { echo '<p>Result of regular expression process:<br/>' . str_replace("\n", "<br/>\n", var_export($results, true) . '</p>'); } // Initial information extraction $start_academic = !empty($results['start_ac']); $start_gregorian = !empty($results['start_greg']); $start_relative = !empty($results['start_rel']); $end_academic = !empty($results['end_ac']); $end_gregorian = !empty($results['end_greg']); $end_relative = !empty($results['end_rel']); $has_start = $start_academic || $start_gregorian || $start_relative; $has_end = $end_academic || $end_gregorian || $end_relative; if ($has_end) { $description .= 'from '; } $start = Academic_time::NewToday(); $end = $start; // Find the start, its either academic, gregorian, or relative if ($start_academic) { $format = 'ac'; if ($end_academic) { $format .= ':ac'; } list($start, $end, $temp_description) = $this->ReadAcademic($start, $results['ac_year'], $results['ac_term'], empty($results['week']) ? '' : $results['week'], empty($results['day']) ? '' : $results['day']); $description .= $temp_description; } elseif ($start_gregorian) { $format = 'gr'; if ($end_gregorian) { $format .= ':gr'; } list($start, $end, $temp_description) = $this->ReadGregorian($start, $results['year'], $results['month'], empty($results['dom']) ? '' : $results['dom']); $description .= $temp_description; } elseif ($start_relative) { $format = 'gr'; if ($end_gregorian) { $format .= ':gr'; } $offset = ''; if (!empty($results['base'])) { switch ($results['base']) { case 'yesterday': $offset = '-1day'; break; case 'tomorrow': $offset = '1day'; break; } $description .= strtolower($results['base']); } else { if (!empty($results['offset'])) { if (!empty($results['offset_unit'])) { $offset .= $results['offset'] . $results['offset_unit']; } else { $offset .= $results['offset'] . 'day'; } $results['offset_unit'] = strtolower($results['offset_unit']); if ('s' !== substr($results['offset_unit'], -1, 1)) { $results['offset_unit'] .= 's'; } $description .= $results['offset'] . ' ' . $results['offset_unit'] . ' time'; } } if (!empty($offset)) { $start = $start->Adjust($offset); } // Set the implicit duration if no end is specified if (!$has_end) { $end = $start->Adjust('1day'); } } // Find the end, its either academic, gregorian, or relative if ($end_academic) { $description .= ' until '; list($dummy, $end, $temp_description) = $this->ReadAcademic($start, $results['end_ac_year'], $results['end_ac_term'], empty($results['end_week']) ? '' : $results['end_week'], empty($results['end_day']) ? '' : $results['end_day']); $description .= $temp_description; } elseif ($end_gregorian) { $description .= ' until '; list($dummy, $end, $temp_description) = $this->ReadGregorian($start, $results['end_year'], $results['end_month'], empty($results['end_dom']) ? '' : $results['end_dom']); $description .= $temp_description; } elseif ($end_relative) { $format .= ':re'; $end = $start; $offset = ''; if (!empty($results['end_base'])) { $end = Academic_time::NewToday()->Adjust('1day'); switch ($results['end_base']) { case 'yesterday': $offset .= '-1day'; break; case 'tomorrow': $offset .= '1day'; break; } $description .= ' until ' . strtolower($results['end_base']); } else { if (!empty($results['end_offset'])) { if (!empty($results['end_offset_unit'])) { $offset .= $results['end_offset'] . $results['end_offset_unit']; } else { $results['end_offset_unit'] = 'day'; $offset .= $results['end_offset'] . 'day'; } $results['end_offset_unit'] = strtolower($results['end_offset_unit']); if ('s' === substr($results['end_offset_unit'], -1, 1)) { if (1 == $results['end_offset']) { $results['end_offset_unit'] = substr($results['end_offset_unit'], 0, -1); } } else { if (1 != $results['end_offset']) { $results['end_offset_unit'] .= 's'; } } $description .= ' for ' . $results['end_offset'] . ' ' . $results['end_offset_unit']; } } if (!empty($offset)) { $end = $start->Adjust($offset); } } // If the end is before the start, use the start for 1 day if ($start->Timestamp() >= $end->Timestamp()) { $end = $start->Adjust('1day'); } } else { // Invalid, so puke back saying it was unrecognised $description = 'Unrecognised ' . ($AllowRange ? 'date range' : 'date'); } // Return the final array return array('valid' => $valid, 'format' => $format, 'start' => $valid ? $start : NULL, 'end' => $valid ? $end : NULL, 'description' => $description); }
} ?> "> <?php // Legend if (isset($Legend) && is_array($Legend) && !empty($Legend)) { echo '<tr><th colspan="8" class="term">Legend</th></tr>'; foreach ($Legend as $legend_info) { list($classes_array, $description) = $legend_info; $classnames = join(' ', $classes_array); echo "<tr><th /><td colspan=\"7\" class=\"{$classnames}\">{$description}</td></tr>"; } } $day_of_week_headings = array('S', 'M', 'T', 'W', 'T', 'F', 'S'); $term_date_alteration = '4days'; $today = Academic_time::NewToday(); // $today = $today->Adjust('1month'); // $day_start = $today->StartOfWeek(); $day_start = $today->Adjust('-' . $today->AcademicDay() . 'days')->StartOfWeek($WeekStart); $term_name = ''; $today_id = $today->Format('Ymd'); for ($week_counter = 0; $week_counter < 52; ++$week_counter) { $term_altered_date = $day_start->Adjust($term_date_alteration); $this_term_name = $term_altered_date->AcademicTermNameUnique() . ' ' . $term_altered_date->AcademicYearName(2); $week_number = $term_altered_date->AcademicWeek(); if ($this_term_name != $term_name) { $term_name = $this_term_name; $this_term_name .= ' (' . $day_start->Format('M') . ')'; ?> <tr><th colspan="8" class="term"><?php echo $this_term_name;
protected function _Load() { $value = $this->value; if (null === $value) { $value = Academic_time::NewToday(); } else { $value = new Academic_time($value); } ?> <div class="input_date_display"<?php ?> onclick="<?php echo xml_escape('return input_date_click("' . $this->name . '");'); ?> "<?php ?> ><?php if ($this->date) { ?> <span class="day" id="<?php echo $this->id . '__day'; ?> "><?php echo $value->Format('l'); ?> </span> <?php ?> week <span class="week" id="<?php echo $this->id . '__wk'; ?> "><?php echo $value->AcademicWeek(); ?> </span> <?php ?> of <span class="term" id="<?php echo $this->id . '__term'; ?> "><?php echo ucfirst($value->AcademicTermNameUnique()); echo ' ' . $value->StartOfTerm()->Year(); ?> </span> <?php } if ($this->time) { ?> at <span class="hour" id="<?php echo $this->id . '__hr'; ?> "><?php echo $value->Hour(); ?> </span><?php ?> :<span class="minute" id="<?php echo $this->id . '__min'; ?> "><?php echo $value->Minute(); ?> </span> <?php } ?> </div><?php $days = array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'); ?> <div class="input_date_selector"<?php ?> id="<?php echo $this->id . '__selector'; ?> "<?php ?> ><?php // Init script ?> <script type="text/javascript"><?php echo xml_escape('onLoadFunctions.push(function() {' . 'input_date_init(' . js_literalise($this->name) . ');' . '});', false); ?> </script><?php ?> <div><?php // Day of the week ?> <select id="<?php echo $this->id . '__day_select'; ?> "<?php ?> name="<?php echo $this->name . '[day]'; ?> "<?php ?> onchange="<?php echo xml_escape('return input_date_day_changed("' . $this->name . '");'); ?> "<?php ?> ><?php foreach ($days as $val => $day) { ?> <option value="<?php echo $val; ?> "<?php if ($val == $value->DayOfWeek(1)) { ?> selected="selected"<?php } ?> ><?php echo $day; ?> </option><?php } ?> </select><?php // Week of the term ?> <span>week</span><?php ?> <select id="<?php echo $this->id . '__wk_select'; ?> "<?php ?> name="<?php echo $this->name . '[wk]'; ?> "<?php ?> onchange="<?php echo xml_escape('return input_date_day_changed("' . $this->name . '");'); ?> "<?php ?> ><?php $weeks = $value->AcademicTermWeeks(); for ($wk = 1; $wk <= $weeks; ++$wk) { ?> <option value="<?php echo $wk; ?> "<?php if ($wk == $value->AcademicWeek()) { ?> selected="selected"<?php } ?> ><?php echo $wk; ?> </option><?php } ?> </select><?php // Term ?> <span>of</span><?php ?> <select id="<?php echo $this->id . '__term_select'; ?> "<?php ?> name="<?php echo $this->name . '[term]'; ?> "<?php ?> onchange="<?php echo xml_escape('return input_date_term_changed("' . $this->name . '");'); ?> "<?php ?> ><?php $sel_year = $value->AcademicYear(); $sel_term = $value->AcademicTerm(); $year = $sel_year; $term = 0; ?> <option value="earlier">(more)</option><?php for ($i = 0; $i < 6; ++$i) { $cur = new Academic_time(Academic_time::StartOfAcademicTerm($year, $term)); ?> <option value="<?php echo "{$year}-{$term}"; ?> "<?php if ($term == $sel_term && $year == $sel_year) { ?> selected="selected"<?php } ?> ><?php echo xml_escape(ucfirst($cur->AcademicTermNameUnique()) . ' ' . $cur->Year()); ?> </option><?php ++$term; if ($term == 6) { $term = 0; ++$year; } } ?> <option value="later">(more)</option><?php ?> </select><?php // Time of day if ($this->time) { ?> <span>at</span><?php ?> <select id="<?php echo $this->id . '__hr_select'; ?> "<?php ?> name="<?php echo $this->name . '[hr]'; ?> "<?php ?> onchange="<?php echo xml_escape('return input_date_time_changed("' . $this->name . '");'); ?> "<?php ?> ><?php for ($hr = 0; $hr < 24; ++$hr) { ?> <option value="<?php echo $hr; ?> "<?php if ($hr == $value->Hour()) { ?> selected="selected"<?php } ?> ><?php echo sprintf('%02d', $hr); ?> </option><?php } ?> </select><?php ?> <span>:</span><?php ?> <select id="<?php echo $this->id . '__min_select'; ?> "<?php ?> name="<?php echo $this->name . '[min]'; ?> "<?php ?> onchange="<?php echo xml_escape('return input_date_time_changed("' . $this->name . '");'); ?> "<?php ?> ><?php $minute = $value->Minute(); $minute_interval = 5; for ($min = 0; $min < 60; $min += $minute_interval) { ?> <option value="<?php echo $min; ?> "<?php if ($min <= $minute && $min + $minute_interval > $minute) { ?> selected="selected"<?php } ?> ><?php echo sprintf('%02d', $min); ?> </option><?php } ?> </select><?php } // Close button ?> <input type="button" value="x"<?php ?> onclick="<?php echo xml_escape('return input_selector_click("' . $this->name . '__selector");'); ?> "<?php ?> /><?php ?> </div><?php ?> <div><?php ?> <table class="recur-cal cal-text"><?php // Days along the top ?> <tr><?php ?> <th /><?php foreach ($days as $day) { ?> <th><?php echo xml_escape($day); ?> </th><?php } ?> </tr><?php $cur = $value->MondayWeek1OfTerm(); $sel = $value->Midnight()->Timestamp(); $today = Academic_time::NewToday()->Timestamp(); $last_month = 0; $term = $cur->AcademicTerm(); for ($wk = 1; $cur->AcademicTerm() == $term; ++$wk) { ?> <tr id="<?php echo $this->id . '__wk_' . $wk; ?> "><?php ?> <th><?php echo $wk; ?> </th><?php for ($dy = 0; $dy < 7; ++$dy) { $month = $cur->Month(); $ts = $cur->Timestamp(); $classes = array(); if ($ts < $today) { $classes[] = "pa"; } if ($month % 2 == 0) { $classes[] = "ev"; } if ($ts == $today) { $classes[] = "tod"; } if ($ts == $sel) { $classes[] = "sel"; } if ($dy >= 5) { $classes[] = "we"; } ?> <td class="<?php echo join(' ', $classes); ?> "<?php ?> id="<?php echo $this->id . '__' . $cur->AcademicWeek() . '_' . $cur->Format('D'); ?> "<?php ?> onclick="<?php echo xml_escape('return input_date_change(' . js_literalise($this->name) . ',' . js_literalise($wk) . ',' . js_literalise($dy) . ');'); ?> "<?php ?> ><?php if ($month != $last_month) { echo xml_escape($cur->Format('M')) . ' '; $last_month = $month; } echo xml_escape($cur->Format('j')); ?> </td><?php $cur = $cur->Adjust('+1day'); } ?> </tr><?php } ?> </table><?php ?> </div><?php ?> </div><?php }
/** * @pre SetRange() must have already been called. */ function Retrieve() { // Don't get any events from the database right now //parent::Retrieve(); // Calculate links to next, previous, and this whole term $prev_term = $this->mSelectedWeekStart->AcademicYear() - ($this->mSelectedWeekStart->AcademicTerm() == 0 ? 1 : 0) . '-' . Academic_time::GetAcademicTermNameUnique(($this->mSelectedWeekStart->AcademicTerm() + 5) % 6) . '-1'; //$this_term = // $this->mSelectedWeekStart->AcademicYear() . '-' . // $this->mSelectedWeekStart->AcademicTermNameUnique(); $next_term = $this->mSelectedWeekStart->AcademicYear() + ($this->mSelectedWeekStart->AcademicTerm() == 5 ? 1 : 0) . '-' . Academic_time::GetAcademicTermNameUnique(($this->mSelectedWeekStart->AcademicTerm() + 1) % 6) . '-1'; $this->SetData('links', array('prev_term' => site_url($this->mUriBase . $prev_term), 'this_term' => '', 'next_term' => site_url($this->mUriBase . $next_term))); $this->SetData('term', array('name' => $this->mSelectedWeekStart->AcademicTermName() . ' ' . $this->mSelectedWeekStart->AcademicTermTypeName())); // Get this monday $CI =& get_instance(); $monday = Academic_time::NewToday()->BackToMonday()->Timestamp(); $weeks = array(); $last_term = -1; for ($week = $this->mStartTime; $week->Timestamp() < $this->mEndTime->Timestamp(); $week = $next_week) { // Find the end of the week $next_week = $week->Adjust('1week'); if (FALSE) { // Titles before each new term if ($last_term !== $week->AcademicTerm()) { $weeks[] = array('link' => site_url($this->mUriBase . $week->AcademicYear() . '-' . $week->AcademicTermNameUnique()), 'name' => strtoupper($week->AcademicTermName() . ' ' . $week->AcademicTermTypeName() . ' ' . $week->AcademicYearName()), 'events' => 0, 'select' => FALSE, 'old' => FALSE, 'heading' => TRUE, 'start_date' => ''); $last_term = $week->AcademicTerm(); } } $old = $week->Timestamp() < $monday; // Is the week in the past? $selected = $this->mSelectedWeekStart->Timestamp() <= $week->Timestamp() && $this->mSelectedWeekEnd->Timestamp() >= $next_week->Timestamp(); $weeks[] = array('link' => $this->GenerateUri($week, $next_week), 'name' => 'Week ' . $week->AcademicWeek(), 'events' => 0, 'select' => $selected, 'old' => $old, 'heading' => FALSE); } $this->SetData('weeks', $weeks); }
function calendar($organisation, $DateRange = NULL, $Filter = NULL) { $this->load->model('subcontrollers/calendar_subcontroller'); if (!CheckPermissions('public')) { return; } // Set up the filter $data = $this->organisations->_GetOrgData($organisation); if (!empty($data)) { $this->_SetupOrganisationFrame($organisation); $this->main_frame->SetPage('calendar', 'directory'); $this->calendar_subcontroller->SetRangePageCode('directory_calendar'); // restrict to this organisation $this->calendar_subcontroller->UseStreams(array((int) $data['organisation']['id'] => array('subscribed' => isset($data['organisation']['subscription']) && $data['organisation']['subscription']['calendar'], 'name' => $data['organisation']['name'], 'short_name' => $organisation))); // disable cancelled events $sources =& $this->calendar_subcontroller->GetSources(); $sources->DisableGroup('inactive'); $args = func_get_args(); array_shift($args); $this->calendar_subcontroller->_map($args); } else { $this->load->library('custom_pages'); $this->main_frame->SetContent(new CustomPageView('directory_notfound', 'error')); $this->main_frame->Load(); } return; $this->pages_model->SetPageCode('directory_calendar'); $data = $this->organisations->_GetOrgData($organisation); if (!empty($data)) { $this->_SetupOrganisationFrame($organisation); $this->load->library('my_calendar'); $this->load->library('calendar_source_yorker'); $this->my_calendar->SetUrlPrefix('/directory/' . $organisation . '/calendar/'); //$this->My_calendar->SetAgenda(vip_url('calendar/agenda').'/'); $yorker_source = new CalendarSourceYorker(0); // Only those events of the organisation $yorker_source->DisableGroup('subscribed'); $yorker_source->DisableGroup('owned'); $yorker_source->DisableGroup('private'); $yorker_source->EnableGroup('active'); $yorker_source->DisableGroup('inactive'); $yorker_source->EnableGroup('hide'); $yorker_source->EnableGroup('show'); $yorker_source->EnableGroup('rsvp'); $yorker_source->IncludeStream((int) $data['organisation']['id'], TRUE); $now = new Academic_time(time()); $this->my_calendar->SetTabs(FALSE); $this->my_calendar->SetDefaultRange($now->AcademicYear() . '-' . $now->AcademicTermNameUnique()); $this->my_calendar->SetPath('edit', site_url('calendar/event')); $calendar_view = $this->my_calendar->GetMyCalendar($yorker_source, $DateRange, $Filter); if (FALSE) { $this->load->model('calendar/events_model'); $this->load->library('view_calendar_select_week'); $this->load->library('view_calendar_list'); $this->load->library('date_uri'); $use_default_range = FALSE; if (empty($DateRange)) { // $DateRange Empty $use_default_range = TRUE; } else { $uri_result = $this->date_uri->ReadUri($DateRange); if ($uri_result['valid']) { // valid $start_time = $uri_result['start']; $end_time = $uri_result['end']; $format = $uri_result['format']; $range_description = $uri_result['description']; } else { // invalid $this->main_frame->AddMessage('error', 'Unrecognised date range: "' . $DateRange . '"'); $use_default_range = TRUE; } } if ($use_default_range) { // Default to this week $start_time = Academic_time::NewToday(); $start_time = $start_time->BackToMonday(); $end_time = $start_time->Adjust('1week'); $format = 'ac'; //$range_description = 'from today for 1 week'; $range_description = 'this week'; } // Use the start time, end time, and format to set up views //$weeks_start = $start_time->Adjust('-2week')->BackToMonday(); $weeks_start = $this->academic_calendar->AcademicDayOfTerm($start_time->AcademicYear(), $start_time->AcademicTerm(), 1, 0, 0, 0); /*if ($weeks_start->Timestamp() < $monday->Timestamp()) { $weeks_start = $monday; }*/ /*$weeks_end = $end_time->Adjust('5week')->BackToMonday(); if ($weeks_end->Timestamp() < $monday->Timestamp()) { $weeks_end = $monday->Adjust('5week'); }*/ // Set up the week select view $week_select = new ViewCalendarSelectWeek(); $week_select->SetUriBase('directory/' . $organisation . '/calendar/'); $week_select->SetUriFormat($format); //$week_select->SetRange($weeks_start, $weeks_end); $week_select->SetAcademicTerm($weeks_start->AcademicYear(), $weeks_start->AcademicTerm()); $week_select->SetSelectedWeek($start_time, $end_time); $week_select->Retrieve(); $occurrence_filter = new EventOccurrenceFilter(); $occurrence_filter->EnableSource('all'); $occurrence_filter->SetSpecialCondition('organisations.organisation_directory_entry_name = ' . $this->db->escape($organisation)); // Set up the events list $events_list = new ViewCalendarList(); $events_list->SetUriBase('directory/' . $organisation . '/calendar/'); $events_list->SetUriFormat($format); $events_list->SetRange($start_time, $end_time); $events_list->SetOccurrenceFilter($occurrence_filter); $events_list->Retrieve(); // Set up the directory events view to contain the week select and // events list $directory_events = new FramesFrame('directory/directory_view_events', $data); $directory_events->SetContent($week_select, 'week_select'); $directory_events->SetContent($events_list, 'events_list'); $directory_events->SetData('date_range_description', $range_description); } // Set up the directory frame to use the messages frame $this->main_frame->SetPage('calendar', 'directory'); $this->frame_directory->SetOrganisation($data['organisation']); $this->frame_directory->SetContent($calendar_view); // Set up the public frame to use the directory frame $this->main_frame->SetTitleParameters(array('organisation' => $data['organisation']['name'])); $this->main_frame->SetContent($this->frame_directory); } else { $this->load->library('custom_pages'); $this->main_frame->SetContent(new CustomPageView('directory_notfound', 'error')); } // Load the public frame view $this->main_frame->Load(); }