3 class Calendar extends DatabaseTable {
5 public function __construct($id=false)
7 $db = new Database(DBDRIVER, DBHOST, DAV_DBNAME, DBUSER, DBPASS);
9 parent::__construct('calendar_item', false, $db);
12 public static function pgTimestamp($timestamp)
14 if (is_string($timestamp))
16 elseif (is_int($timestamp))
17 return date('Y-m-d H:i:s', $timestamp);
18 elseif (is_object($timestamp) && is_a($timestamp, 'DateTime'))
19 return $timestamp->format('Y-m-d H:i:s');
24 public static function formatTimespan($dtstart, $dtend=false)
26 $start = new DateTime($dtstart);
28 if ($dtend !== false) {
29 $end = new DateTime($dtend);
31 if ($start->format('Y-m-d') == $end->format('Y-m-d')) {
32 if ($start->format('i') == '00' && $end->format('i') == '00')
33 return $start->format('d.m. H') . '-' . $end->format('H') . ' Uhr';
35 return $start->format('d.m. H:i') . '-' . $end->format('H:i');
38 if ($start->format('H:i:s') == '00:00:00' && $end->format('H:i:s') == '00:00:00') {
39 $end->sub(new DateInterval('P1D'));
40 if ($start->format('Y-m-d') == $end->format('Y-m-d'))
41 return $start->format('d.m.');
43 return $start->format('d.m.') . '-' . $end->format('d.m.');
46 if ($start->format('Y-m-') == $end->format('Y-m-')) {
47 return $start->format('d.m. H:i') . '-' . $end->format('d.m. H:i');
54 public function getYears()
56 $sql = sprintf("SELECT DISTINCT extract(year from dtstart) AS year FROM calendar_item WHERE user_no = %d ORDER BY year",
58 return $this->db->fetchObjectList($sql);
61 public function getItems($from=false, $to=false)
63 $sql = sprintf("SELECT dav_id,dtstart,dtend,EXTRACT(WEEK FROM dtstart) AS kw,summary,location,description FROM calendar_item WHERE user_no = %d",
66 $sql .= sprintf(" AND dtstart >= %s", $this->db->quote(self::pgTimestamp($from)));
68 $sql .= sprintf(" AND dtstart <= %s", $this->db->quote(self::pgTimestamp($to)));
70 $sql .= " ORDER BY dtstart";
72 return $this->db->fetchObjectList($sql);
75 public function ajaxMonths(Array $data)
77 $monthname = array('','Jan','Feb','Mär', 'Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez');
78 $sql = sprintf("SELECT DISTINCT extract(year from dtstart) AS year,extract(month from dtstart) AS month " .
79 "FROM calendar_item WHERE user_no = %d ORDER BY year DESC,month DESC",
82 $now = array(date('Y'), date('m'));
83 foreach ($this->db->fetchObjectList($sql) as $row) {
84 $out .= sprintf('<option value="%04d-%02d"%s>%s %04d</option>',
85 $row->year, $row->month,
86 $row->year == $now[0] && $row->month == $now[1] ? ' selected' : '',
87 utf8_encode($monthname[$row->month]), $row->year);
90 return array('values' => array('thismonth' => date('Y-m')),
91 'html' => array('month' => $out));
94 private function getMonthData($year, $month)
96 $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year);
99 for ($i=1; $i < 8; $i++) {
100 $date = sprintf('%04d-%02d-%02d', $year, $month, 1);
101 $sql = sprintf("SELECT dav_id FROM calendar_item WHERE user_no = %d AND dtstart::date = '%s'::date - INTERVAL '%d DAY' ORDER BY dtstart",
102 DAV_USER_NO, $date, $i);
103 foreach ($this->fetchObjectList($sql) as $row) {
104 $item = new Calendar_Item($row->dav_id);
105 if ($item->isRegular()) continue;
107 foreach ($item->getDays() as $adate) {
108 if (!array_key_exists($adate, $areaDates))
109 $areaDates[$adate] = array();
110 $areaDates[$adate][] = $item;
116 for ($day=1; $day <= $numdays; $day++) {
117 $timestamp = mktime (0, 0, 0, $month, $day, $year);
118 $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
119 $sql = sprintf("SELECT dav_id FROM calendar_item WHERE user_no = %d AND dtstart::date = '%s'::date ORDER BY dtstart",
122 foreach ($this->fetchObjectList($sql) as $row) {
123 $item = new Calendar_Item($row->dav_id);
125 if (!$item->isRegular()) {
126 foreach ($item->getDays() as $adate) {
127 if (!array_key_exists($adate, $areaDates))
128 $areaDates[$adate] = array();
129 $areaDates[$adate][] = $item;
132 if (!array_key_exists($date, $regDates))
133 $regDates[$date] = array();
134 $regDates[$date][] = $item;
139 return array($areaDates, $regDates);
142 private function formatOneMonth($year, $month)
144 $weekday = array('', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So');
145 $monthname = array('','Jan','Feb','Mär', 'Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez');
146 $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year);
148 $out = sprintf('<div class="head" month="%04d-%02d">%s %04d</div>',
149 $year, $month, $monthname[intval($month)], $year);
151 list($areaDates, $regDates) = $this->getMonthData($year, $month);
153 $today = date('Y-m-d');
154 for ($day=1; $day <= $numdays; $day++) {
155 $timestamp = mktime (0, 0, 0, $month, $day, $year);
156 $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
159 if (array_key_exists($date, $areaDates))
160 foreach ($areaDates[$date] as $item)
161 $items[] = $item->toSpan();
163 if (array_key_exists($date, $regDates))
164 foreach ($regDates[$date] as $item)
165 $items[] = $item->toSpan();
167 $class = date('N', $timestamp) == 7 ? 'sunday' : 'day';
168 if ($today == $date) $class .= ' today';
169 $kw = date('N', $timestamp) == 1 ? sprintf('<div class="kw">%d</div>', date('W', $timestamp)) : '';
170 $out .= sprintf('<div class="%s" day="%d"><div class="wday">%s</div><div class="date">%d.</div>%s%s</div>',
173 $weekday[intval(date('N', $timestamp))],
175 count($items) ? implode('', $items) : ' ',
181 public function ajaxBiMonth(Array $data)
183 list($year, $month) = explode('-', $data['month']);
184 if (!empty($data['direction'])) {
185 switch ($data['direction']) {
187 if ($month > 1) $month--;
188 else {$year--; $month = 12;}
191 if ($month < 12) $month++;
192 else {$year++; $month = 1;}
197 $monthStr = sprintf('%04d-%02d', $year, $month);
198 $right = $this->formatOneMonth($year, $month);
200 if ($month < 12) $month++;
201 else {$year++; $month = 1;}
202 $left = $this->formatOneMonth($year, $month);
204 $out = '<div class="bimonth">';
206 $out .= '<div class="monthcolumn">';
210 $out .= '<div class="monthcolumn">';
216 return array('values' => array('thismonth' => $monthStr),
217 'html' => array('termine' => $out));
220 public function ajaxMonth(Array $data)
222 $monthname = array('','Januar','Februar','März', 'April','Mai','Juni','Juli','August','September','Oktober','November','Dezember');
224 list($year, $month) = explode('-', $data['month']);
225 if (!empty($data['direction'])) {
226 switch ($data['direction']) {
228 if ($month > 1) $month--;
229 else {$year--; $month = 12;}
232 if ($month < 12) $month++;
233 else {$year++; $month = 1;}
238 $monthStr = sprintf('%04d-%02d', $year, $month);
239 $monthText = utf8_encode($monthname[intval($month)] . ' ' . $year);
240 $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year);
242 list($areaDates, $regDates) = $this->getMonthData($year, $month);
244 $out = '<div class="month">';
247 <table width="100%" cellspacing="0" border="collapse">
249 <tr><td colspan="8" class="title">{$monthText}</td></tr>
251 <td width="2%"> </td>
252 <td width="14%">Montag</td>
253 <td width="14%">Dienstag</td>
254 <td width="14%">Mittwoch</td>
255 <td width="14%">Donnerstag</td>
256 <td width="14%">Freitag</td>
257 <td width="14%">Samstag</td>
258 <td width="14%">Sonntag</td>
264 $timestamp = mktime (4, 0, 0, $month, 1, $year);
265 if (date('N', $timestamp) != 1) {
267 $out .= sprintf('<td width="2%%">%d</td>', date('W', $timestamp));
268 for ($i=1; $i < date('N', $timestamp); $i++)
269 $out .= '<td width="14%" class="empty"> </td>';
272 $today = date('Y-m-d');
273 for ($day=1; $day <= $numdays; $day++) {
274 $timestamp = mktime (4, 0, 0, $month, $day, $year);
275 $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
276 if (date('N', $timestamp) == 1)
277 $out .= sprintf('<tr><td width="2%%">%d</td>', date('W', $timestamp));
281 if (array_key_exists($date, $areaDates))
282 foreach ($areaDates[$date] as $item)
283 $items[] = $item->toSpan();
285 if (array_key_exists($date, $regDates))
286 foreach ($regDates[$date] as $item)
287 $items[] = $item->toSpan();
289 $out .= sprintf('<td width="14%%"><div class="day">%d</day><div>%s</div></td>',
290 date('d', $timestamp),
291 count($items) ? implode('<br />', $items) : ' ');
293 if (date('N', $timestamp) == 7)
297 if (date('N', $timestamp) != 7) {
298 for ($i=date('N', $timestamp); $i < 7; $i++)
299 $out .= '<td width="14%" class="empty"> </td>';
303 $out .= '</tbody></table>';
307 return array('values' => array('thismonth' => $monthStr),
308 'html' => array('termine' => $out));