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 ajaxOneMonth(Array $data)
222 list($year, $month) = explode('-', $data['month']);
223 if (!empty($data['direction'])) {
224 switch ($data['direction']) {
226 if ($month > 1) $month--;
227 else {$year--; $month = 12;}
230 if ($month < 12) $month++;
231 else {$year++; $month = 1;}
236 $monthStr = sprintf('%04d-%02d', $year, $month);
237 $right = $this->formatOneMonth($year, $month);
239 $out = '<div class="onemonth">';
241 $out .= '<div class="monthcolumn">';
247 return array('values' => array('thismonth' => $monthStr),
248 'html' => array('termine' => $out));
251 public function ajaxMonth(Array $data)
253 $monthname = array('','Januar','Februar','März', 'April','Mai','Juni','Juli','August','September','Oktober','November','Dezember');
255 list($year, $month) = explode('-', $data['month']);
256 if (!empty($data['direction'])) {
257 switch ($data['direction']) {
259 if ($month > 1) $month--;
260 else {$year--; $month = 12;}
263 if ($month < 12) $month++;
264 else {$year++; $month = 1;}
269 $monthStr = sprintf('%04d-%02d', $year, $month);
270 $monthText = utf8_encode($monthname[intval($month)] . ' ' . $year);
271 $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year);
273 list($areaDates, $regDates) = $this->getMonthData($year, $month);
275 $out = '<div class="month">';
278 <table width="100%" cellspacing="0" border="collapse">
280 <tr><td colspan="8" class="title">{$monthText}</td></tr>
282 <td width="2%"> </td>
283 <td width="14%">Montag</td>
284 <td width="14%">Dienstag</td>
285 <td width="14%">Mittwoch</td>
286 <td width="14%">Donnerstag</td>
287 <td width="14%">Freitag</td>
288 <td width="14%">Samstag</td>
289 <td width="14%">Sonntag</td>
295 $timestamp = mktime (4, 0, 0, $month, 1, $year);
296 if (date('N', $timestamp) != 1) {
298 $out .= sprintf('<td width="2%%">%d</td>', date('W', $timestamp));
299 for ($i=1; $i < date('N', $timestamp); $i++)
300 $out .= '<td width="14%" class="empty"> </td>';
303 $today = date('Y-m-d');
304 for ($day=1; $day <= $numdays; $day++) {
305 $timestamp = mktime (4, 0, 0, $month, $day, $year);
306 $date = sprintf('%04d-%02d-%02d', $year, $month, $day);
307 if (date('N', $timestamp) == 1)
308 $out .= sprintf('<tr><td width="2%%">%d</td>', date('W', $timestamp));
312 if (array_key_exists($date, $areaDates))
313 foreach ($areaDates[$date] as $item)
314 $items[] = $item->toSpan();
316 if (array_key_exists($date, $regDates))
317 foreach ($regDates[$date] as $item)
318 $items[] = $item->toSpan();
320 $out .= sprintf('<td width="14%%"><div class="day">%d</day><div>%s</div></td>',
321 date('d', $timestamp),
322 count($items) ? implode('<br />', $items) : ' ');
324 if (date('N', $timestamp) == 7)
328 if (date('N', $timestamp) != 7) {
329 for ($i=date('N', $timestamp); $i < 7; $i++)
330 $out .= '<td width="14%" class="empty"> </td>';
334 $out .= '</tbody></table>';
338 return array('values' => array('thismonth' => $monthStr),
339 'html' => array('termine' => $out));