protected function _hours() { global $prefs; $hours_html = ''; $dayWidth = round(100 / $this->_days); $span = floor(($this->_endHour - $this->_startHour) / 3); if (($this->_endHour - $this->_startHour) % 3) { $span++; } $date_format = $prefs->getValue('date_format'); for ($i = 0; $i < $this->_days; $i++) { $t = new Horde_Date(array('month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $day_label = Horde::url('#')->link(array('onclick' => 'return switchDateView(\'Day\',' . $t->dateString() . ');')) . $t->strftime($date_format) . '</a>'; $hours_html .= sprintf('<th colspan="%d" width="%s%%">%s</th>', $span, $dayWidth, $day_label); } $hours_html .= '</tr><tr><td width="100" class="label"> </td>'; $width = round(100 / ($span * $this->_days)); for ($i = 0; $i < $this->_days; $i++) { for ($h = $this->_startHour; $h < $this->_endHour; $h += 3) { $start = new Horde_Date(array('hour' => $h, 'month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $end = new Horde_Date($start); $end->hour += 2; $end->min = 59; $this->_timeBlocks[] = array($start, $end); $hour = $start->strftime($prefs->getValue('twentyFour') ? '%H:00' : '%I:00'); $hours_html .= sprintf('<th width="%d%%">%s</th>', $width, $hour); } } return $hours_html; }
protected function _hours() { $hours_html = ''; $dayWidth = round(100 / $this->_days); $week = $this->_start->weekOfYear(); $span = (7 - $week) % 7 + 1; $span_left = $this->_days; $t = new Horde_Date($this->_start); while ($span_left > 0) { $span_left -= $span; $week_label = Horde::url('#')->link(array('onclick' => 'return switchDateView(\'Week\',' . $t->dateString() . ');')) . "Week" . ' ' . $week . '</a>'; $hours_html .= sprintf('<th colspan="%d" width="%s%%">%s</th>', $span, $dayWidth, $week_label); $week++; $t->mday += 7; $span = min($span_left, 7); } $hours_html .= '</tr><tr><td width="100" class="label"> </td>'; for ($i = 0; $i < $this->_days; $i++) { $t = new Horde_Date(array('month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $day_label = Horde::url('#')->link(array('onclick' => 'return switchDateView(\'Day\',' . $t->dateString() . ');')) . ($i + 1) . '.</a>'; $hours_html .= sprintf('<th width="%s%%">%s</th>', $dayWidth, $day_label); } for ($i = 0; $i < $this->_days; $i++) { $start = new Horde_Date(array('hour' => $this->_startHour, 'month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $end = new Horde_Date(array('hour' => $this->_endHour, 'month' => $this->_start->month, 'mday' => $this->_start->mday + $i, 'year' => $this->_start->year)); $this->_timeBlocks[] = array($start, $end); } return $hours_html; }
protected function _title() { global $prefs; $prev = new Horde_Date($this->_start); $prev->mday--; $next = new Horde_Date($this->_start); $next->mday++; return Horde::url('#')->link(array('title' => _("Previous Day"), 'onclick' => 'return switchDate(' . $prev->dateString() . ');')) . Horde::img('nav/left.png', '<') . '</a>' . $this->_start->strftime($prefs->getValue('date_format')) . Horde::url('#')->link(array('title' => _("Next Day"), 'onclick' => 'return switchDate(' . $next->dateString() . ');')) . Horde::img('nav/right.png', '>') . '</a>'; }
/** * Converts free/busy data to a simple object suitable to be transferred * as json. * * @param Horde_Icalendar_Vfreebusy $fb A Free/busy component. * * @return object A simple object representation. */ public static function toJson(Horde_Icalendar_Vfreebusy $fb) { $json = new stdClass(); $start = $fb->getStart(); if ($start) { $start = new Horde_Date($start); $json->s = $start->dateString(); } $end = $fb->getEnd(); if ($end) { $end = new Horde_Date($end); $json->e = $end->dateString(); } $b = $fb->getBusyPeriods(); if (empty($b)) { $b = new StdClass(); } $new = new StdClass(); foreach ($b as $from => $to) { $from = new Horde_Date($from); $to = new Horde_Date($to); $new->{$from->toJson()} = $to->toJson(); } $json->b = $new; return $json; }
/** * Adds an event to all the days it covers. * * @param array $result The current result list. * @param Kronolith_Event $event An event object. * @param Horde_Date $eventStart The event's start at the actual * recurrence. * @param Horde_Date $eventEnd The event's end at the actual recurrence. * @param boolean $json Store the results of the events' toJson() * method? */ public static function addCoverDates(&$results, $event, $eventStart, $eventEnd, $json) { $loopDate = new Horde_Date($eventStart->year, $eventStart->month, $eventStart->mday); $allDay = $event->isAllDay(); while ($loopDate->compareDateTime($eventEnd) <= 0) { if (!$allDay || $loopDate->compareDateTime($eventEnd) != 0) { $addEvent = clone $event; $addEvent->start = $eventStart; $addEvent->end = $eventEnd; if ($loopDate->compareDate($eventStart) != 0) { $addEvent->first = false; } if ($loopDate->compareDate($eventEnd) != 0) { $addEvent->last = false; } if ($addEvent->recurs() && $addEvent->recurrence->hasCompletion($loopDate->year, $loopDate->month, $loopDate->mday)) { $addEvent->status = Kronolith::STATUS_CANCELLED; } $results[$loopDate->dateString()][$addEvent->id] = $json ? $addEvent->toJson($allDay) : $addEvent; } $loopDate->mday++; } }
/** * Converts free/busy data to a simple object suitable to be transferred * as json. * * @param Horde_Icalendar_Vfreebusy $fb A Free/busy component. * * @return object A simple object representation. */ public static function toJson(Horde_Icalendar_Vfreebusy $fb) { $json = new stdClass(); $start = $fb->getStart(); if ($start) { $start = new Horde_Date($start); $json->s = $start->dateString(); } $end = $fb->getEnd(); if ($end) { $end = new Horde_Date($end); $json->e = $end->dateString(); } $b = $fb->getBusyPeriods(); if (empty($b)) { $b = new StdClass(); } $json->b = $b; return $json; }
$attendees[$partname]['response'] = $partval; $session->set('kronolith', 'attendees', $attendees); } break; case 'dismiss': // Close the attendee window. if ($browser->hasFeature('javascript')) { echo Horde::wrapInlineScript(array('window.close();')); exit; } $url = Horde_Util::getFormData('url'); if (!empty($url)) { $url = new Horde_Url($url, true); } else { $date = new Horde_Date(Horde_Util::getFormData('startdate')); $url = Horde::url($prefs->getValue('defaultview') . '.php', true)->add('date', $date->dateString()); } // Make sure URL is unique. $url->unique()->redirect(); case 'clear': // Remove all the attendees and resources. $session->remove('kronolith', 'attendees'); $session->remove('kronolith', 'resources'); break; } /* Get list of resources for select list, and remove those we already added */ if (!empty($conf['resources']['enabled'])) { $allResources = Kronolith::getDriver('Resource')->listResources(Horde_Perms::READ, array(), 'name'); foreach (array_keys($resources) as $id) { unset($allResources[$id]); }
public function html() { global $prefs; $html = '<table id="kronolith-view-year" class="kronolith-minical"><tr>'; for ($month = 1; $month <= 12; ++$month) { $html .= '<td>'; // Heading for each month. $date = new Horde_Date(sprintf('%04d%02d01010101', $this->year, $month)); $html .= '<table><thead><tr class="kronolith-minical-nav"><th colspan="7">' . Horde::url('month.php')->add('date', $date->dateString())->link() . $date->strftime('%B') . '</a></th></tr><tr><th class="kronolith-minical-empty"> </th>'; if (!$prefs->getValue('week_start_monday')) { $html .= '<th>' . _("Su") . '</th>'; } $html .= '<th>' . _("Mo") . '</th>' . '<th>' . _("Tu") . '</th>' . '<th>' . _("We") . '</th>' . '<th>' . _("Th") . '</th>' . '<th>' . _("Fr") . '</th>' . '<th>' . _("Sa") . '</th>'; if ($prefs->getValue('week_start_monday')) { $html .= '<th>' . _("Su") . '</th>'; } $html .= '</tr></thead><tbody><tr><td class="kronolith-minical-week">'; $startday = new Horde_Date(array('mday' => 1, 'month' => $month, 'year' => $this->year)); $startday = $startday->dayOfWeek(); $daysInView = Date_Calc::weeksInMonth($month, $this->year) * 7; if (!$prefs->getValue('week_start_monday')) { $startOfView = 1 - $startday; // We may need to adjust the number of days in the // view if we're starting weeks on Sunday. if ($startday == Horde_Date::DATE_SUNDAY) { $daysInView -= 7; } $endday = new Horde_Date(array('mday' => Horde_Date_Utils::daysInMonth($month, $this->year), 'month' => $month, 'year' => $this->year)); $endday = $endday->dayOfWeek(); if ($endday == Horde_Date::DATE_SUNDAY) { $daysInView += 7; } } else { if ($startday == Horde_Date::DATE_SUNDAY) { $startOfView = -5; } else { $startOfView = 2 - $startday; } } $currentCalendars = array(true); foreach ($currentCalendars as $id => $cal) { $cell = 0; for ($day = $startOfView; $day < $startOfView + $daysInView; ++$day) { $date = new Kronolith_Day($month, $day, $this->year); $date->hour = $prefs->getValue('twentyFour') ? 12 : 6; $week = $date->weekOfYear(); if ($cell % 7 == 0) { if ($cell != 0) { $html .= "</tr>\n<tr><td class=\"kronolith-minical-week\">"; } $html .= (int) $date->weekOfYear() . '</td>'; } if ($date->month != $month) { $style = 'kronolith-other-month'; } else { $style = ''; } /* Set up the link to the day view. */ $url = Horde::url('day.php', true)->add('date', $date->dateString()); if ($date->month == $month && !empty($this->_events[$date->dateString()])) { /* There are events; create a cell with tooltip to list * them. */ $day_events = ''; foreach ($this->_events[$date->dateString()] as $event) { if ($event->status == Kronolith::STATUS_CONFIRMED) { /* Set the background color to distinguish the * day */ $style = 'year-event'; } if ($event->isAllDay()) { $day_events .= _("All day"); } else { $day_events .= $event->start->strftime($prefs->getValue('twentyFour') ? '%R' : '%I:%M%p') . '-' . $event->end->strftime($prefs->getValue('twentyFour') ? '%R' : '%I:%M%p'); } $day_events .= ':' . ($event->getLocation() ? ' (' . $event->getLocation() . ')' : '') . ' ' . $event->getTitle() . "\n"; } /* Bold the cell if there are events. */ $cellday = '<strong>' . Horde::linkTooltip($url, _("View Day"), '', '', '', $day_events) . $date->mday . '</a></strong>'; } else { /* No events, plain link to the day. */ $cellday = Horde::linkTooltip($url, _("View Day")) . $date->mday . '</a>'; } if ($date->isToday() && $date->month == $month) { $style .= ' kronolith-today'; } $html .= '<td align="center" class="' . $style . '" height="10" width="5%" valign="top">' . $cellday . '</td>'; ++$cell; } } $html .= '</tr></tbody></table></td>'; if ($month % 3 == 0 && $month != 12) { $html .= '</tr><tr>'; } } echo $html . '</tr></table>'; }
/** * Adds an event to all the days it covers. * * @param array $result The current result list. * @param Kronolith_Event $event An event object. * @param Horde_Date $eventStart The event's start of the actual * recurrence. * @param Horde_Date $eventEnd The event's end of the actual * recurrence. * @param boolean $json Store the results of the events' * toJson() method? * @param Horde_Date $originalStart The actual starting time of a single * event spanning multiple days. * @param Horde_Date $originalEnd The actual ending time of a single * event spanning multiple days. */ public static function addCoverDates(&$results, $event, $eventStart, $eventEnd, $json, $originalStart = null, $originalEnd = null, Horde_Date $endDate = null) { $loopDate = new Horde_Date(array('month' => $eventStart->month, 'mday' => $eventStart->mday, 'year' => $eventStart->year)); $allDay = $event->isAllDay(); while ($loopDate->compareDateTime($eventEnd) <= 0 && $loopDate->compareDateTime($endDate) <= 0) { if (!$allDay || $loopDate->compareDateTime($eventEnd) != 0) { $addEvent = clone $event; if ($originalStart) { $addEvent->originalStart = $originalStart; } if ($originalEnd) { $addEvent->originalEnd = $originalEnd; } /* If this is the start day, set the start time to * the real start time, otherwise set it to * 00:00 */ if ($loopDate->compareDate($eventStart) != 0) { $addEvent->start = clone $loopDate; $addEvent->start->hour = $addEvent->start->min = $addEvent->start->sec = 0; $addEvent->first = false; } else { $addEvent->start = $eventStart; } /* If this is the end day, set the end time to the * real event end, otherwise set it to 23:59. */ if ($loopDate->compareDate($eventEnd) != 0) { $addEvent->end = clone $loopDate; $addEvent->end->hour = 23; $addEvent->end->min = $addEvent->end->sec = 59; $addEvent->last = false; } else { $addEvent->end = $eventEnd; } if ($addEvent->recurs() && $addEvent->recurrence->hasCompletion($loopDate->year, $loopDate->month, $loopDate->mday)) { $addEvent->status = Kronolith::STATUS_CANCELLED; } $results[$loopDate->dateString()][$addEvent->id] = $json ? $addEvent->toJson(array('all_day' => $allDay)) : $addEvent; } $loopDate->mday++; } }
/** * Get the json representation of this slice. The resulting json contains * the following properties *<pre> * c - client id * cn - client object * co - costobject id * con - costobject name * d - date * desc - description * e - employee * h - hours * i - slice id * n - note * r - rate * s - submitted * t - type id * tn - type name * b - billable * x - can edit *</pre> * * @return array */ public function toJson() { $d = new Horde_Date($this->_properties['date']); // @TODO: DO we need the *entire* contact object? $cn = $GLOBALS['registry']->clients->getClients(array($this->_properties['client'])); $json = array('c' => $this->_properties['client'], 'cn' => current($cn), 'co' => $this->_properties['costobject'], 'con' => $this->_properties['_costobject_name'], 'd' => $d->dateString(), 'desc' => $this->_properties['description'], 'e' => $this->_properties['employee'], 'h' => $this->_properties['hours'], 'i' => $this->_properties['id'], 'n' => $this->_properties['note'], 'r' => $this->_properties['rate'], 's' => $this->_properties['submitted'], 't' => $this->_properties['type'], 'tn' => $this->_properties['_type_name'], 'b' => $this->_properties['billable'], 'x' => Hermes::canEditTimeslice($this->_properties['id'])); return $json; }