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('',
$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 ajaxOneMonth(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);
$out = '';
$out .= '
';
$out .= $right;
$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(' | ',
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));
}
}