format('Y-m-d H:i:s'); else return NULL; } public static function formatTimespan($dtstart, $dtend=false) { $start = new DateTime($dtstart); if ($dtend !== false) { $end = new DateTime($dtend); if ($start->format('Y-m-d') == $end->format('Y-m-d')) { if ($start->format('i') == '00' && $end->format('i') == '00') return $start->format('d.m. H') . '-' . $end->format('H') . ' Uhr'; else return $start->format('d.m. H:i') . '-' . $end->format('H:i'); } if ($start->format('H:i:s') == '00:00:00' && $end->format('H:i:s') == '00:00:00') { $end->sub(new DateInterval('P1D')); if ($start->format('Y-m-d') == $end->format('Y-m-d')) return $start->format('d.m.'); else return $start->format('d.m.') . '-' . $end->format('d.m.'); } if ($start->format('Y-m-') == $end->format('Y-m-')) { return $start->format('d.m. H:i') . '-' . $end->format('d.m. H:i'); } } return 'timespan'; } public function getYears() { $sql = sprintf("SELECT DISTINCT extract(year from dtstart) AS year FROM calendar_item WHERE user_no = %d ORDER BY year", DAV_USER_NO); return $this->db->fetchObjectList($sql); } public function getItems($from=false, $to=false) { $sql = sprintf("SELECT dav_id,dtstart,dtend,EXTRACT(WEEK FROM dtstart) AS kw,summary,location,description FROM calendar_item WHERE user_no = %d", DAV_USER_NO); if ($from) $sql .= sprintf(" AND dtstart >= %s", $this->db->quote(self::pgTimestamp($from))); if ($to) $sql .= sprintf(" AND dtstart <= %s", $this->db->quote(self::pgTimestamp($to))); $sql .= " ORDER BY dtstart"; return $this->db->fetchObjectList($sql); } public function ajaxMonths(Array $data) { $monthname = array('','Jan','Feb','Mär', 'Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'); $sql = sprintf("SELECT DISTINCT extract(year from dtstart) AS year,extract(month from dtstart) AS month " . "FROM calendar_item WHERE user_no = %d ORDER BY year DESC,month DESC", DAV_USER_NO); $out = ''; $now = array(date('Y'), date('m')); foreach ($this->db->fetchObjectList($sql) as $row) { $out .= sprintf('', $row->year, $row->month, $row->year == $now[0] && $row->month == $now[1] ? ' selected' : '', utf8_encode($monthname[$row->month]), $row->year); } return array('values' => array('thismonth' => date('Y-m')), 'html' => array('month' => $out)); } private function getMonthData($year, $month) { $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year); $areaDates = array(); for ($i=1; $i < 8; $i++) { $date = sprintf('%04d-%02d-%02d', $year, $month, 1); $sql = sprintf("SELECT dav_id FROM calendar_item WHERE user_no = %d AND dtstart::date = '%s'::date - INTERVAL '%d DAY' ORDER BY dtstart", DAV_USER_NO, $date, $i); foreach ($this->fetchObjectList($sql) as $row) { $item = new Calendar_Item($row->dav_id); if ($item->isRegular()) continue; foreach ($item->getDays() as $adate) { if (!array_key_exists($adate, $areaDates)) $areaDates[$adate] = array(); $areaDates[$adate][] = $item; } } } $regDates = array(); for ($day=1; $day <= $numdays; $day++) { $timestamp = mktime (0, 0, 0, $month, $day, $year); $date = sprintf('%04d-%02d-%02d', $year, $month, $day); $sql = sprintf("SELECT dav_id FROM calendar_item WHERE user_no = %d AND dtstart::date = '%s'::date ORDER BY dtstart", DAV_USER_NO, $date); foreach ($this->fetchObjectList($sql) as $row) { $item = new Calendar_Item($row->dav_id); if (!$item->isRegular()) { foreach ($item->getDays() as $adate) { if (!array_key_exists($adate, $areaDates)) $areaDates[$adate] = array(); $areaDates[$adate][] = $item; } } else { if (!array_key_exists($date, $regDates)) $regDates[$date] = array(); $regDates[$date][] = $item; } } } return array($areaDates, $regDates); } private function formatOneMonth($year, $month) { $weekday = array('', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa', 'So'); $monthname = array('','Jan','Feb','Mär', 'Apr','Mai','Jun','Jul','Aug','Sep','Okt','Nov','Dez'); $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year); $out = sprintf('
%s %04d
', $year, $month, $monthname[intval($month)], $year); list($areaDates, $regDates) = $this->getMonthData($year, $month); $today = date('Y-m-d'); for ($day=1; $day <= $numdays; $day++) { $timestamp = mktime (0, 0, 0, $month, $day, $year); $date = sprintf('%04d-%02d-%02d', $year, $month, $day); $items = array(); if (array_key_exists($date, $areaDates)) foreach ($areaDates[$date] as $item) $items[] = $item->toSpan(); if (array_key_exists($date, $regDates)) foreach ($regDates[$date] as $item) $items[] = $item->toSpan(); $class = date('N', $timestamp) == 7 ? 'sunday' : 'day'; if ($today == $date) $class .= ' today'; $kw = date('N', $timestamp) == 1 ? sprintf('
%d
', date('W', $timestamp)) : ''; $out .= sprintf('
%s
%d.
%s%s
', $class, $day, $weekday[intval(date('N', $timestamp))], $day, count($items) ? implode('', $items) : ' ', $kw); } return $out; } public function ajaxBiMonth(Array $data) { list($year, $month) = explode('-', $data['month']); if (!empty($data['direction'])) { switch ($data['direction']) { case 'prev': if ($month > 1) $month--; else {$year--; $month = 12;} break; case 'next': if ($month < 12) $month++; else {$year++; $month = 1;} break; } } $monthStr = sprintf('%04d-%02d', $year, $month); $right = $this->formatOneMonth($year, $month); if ($month < 12) $month++; else {$year++; $month = 1;} $left = $this->formatOneMonth($year, $month); $out = '
'; $out .= '
'; $out .= $right; $out .= '
'; $out .= '
'; $out .= $left; $out .= '
'; $out .= '
'; return array('values' => array('thismonth' => $monthStr), 'html' => array('termine' => $out)); } public function ajaxMonth(Array $data) { $monthname = array('','Januar','Februar','März', 'April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'); list($year, $month) = explode('-', $data['month']); if (!empty($data['direction'])) { switch ($data['direction']) { case 'prev': if ($month > 1) $month--; else {$year--; $month = 12;} break; case 'next': if ($month < 12) $month++; else {$year++; $month = 1;} break; } } $monthStr = sprintf('%04d-%02d', $year, $month); $monthText = utf8_encode($monthname[intval($month)] . ' ' . $year); $numdays = cal_days_in_month(CAL_GREGORIAN, $month, $year); list($areaDates, $regDates) = $this->getMonthData($year, $month); $out = '
'; $out .= << {$monthText}   Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag EOT; $timestamp = mktime (4, 0, 0, $month, 1, $year); if (date('N', $timestamp) != 1) { $out .= ''; $out .= sprintf('%d', date('W', $timestamp)); for ($i=1; $i < date('N', $timestamp); $i++) $out .= ' '; } $today = date('Y-m-d'); for ($day=1; $day <= $numdays; $day++) { $timestamp = mktime (4, 0, 0, $month, $day, $year); $date = sprintf('%04d-%02d-%02d', $year, $month, $day); if (date('N', $timestamp) == 1) $out .= sprintf('%d', date('W', $timestamp)); $items = array(); if (array_key_exists($date, $areaDates)) foreach ($areaDates[$date] as $item) $items[] = $item->toSpan(); if (array_key_exists($date, $regDates)) foreach ($regDates[$date] as $item) $items[] = $item->toSpan(); $out .= sprintf('
%d
%s
', date('d', $timestamp), count($items) ? implode('
', $items) : ' '); if (date('N', $timestamp) == 7) $out .= ''; } if (date('N', $timestamp) != 7) { for ($i=date('N', $timestamp); $i < 7; $i++) $out .= ' '; $out .= ''; } $out .= ''; $out .= '
'; return array('values' => array('thismonth' => $monthStr), 'html' => array('termine' => $out)); } }