diff options
author | Bart Visscher <bartv@thisnet.nl> | 2011-11-23 21:08:26 +0100 |
---|---|---|
committer | Bart Visscher <bartv@thisnet.nl> | 2011-11-23 21:08:26 +0100 |
commit | bae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb (patch) | |
tree | f077558d240d660abb4c75e0e5ef2848b9585107 /apps | |
parent | 5e037bfd5458436e8f6d83d4fe53f62b53cd8ae9 (diff) | |
parent | ee549dfb3802e98156e96a4cf549854b9d4f791a (diff) | |
download | nextcloud-server-bae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb.tar.gz nextcloud-server-bae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb.zip |
Merge branch 'fullcalendar'
Diffstat (limited to 'apps')
24 files changed, 837 insertions, 1189 deletions
diff --git a/apps/calendar/ajax/activation.php b/apps/calendar/ajax/activation.php index 89239f21759..72882496ab6 100644 --- a/apps/calendar/ajax/activation.php +++ b/apps/calendar/ajax/activation.php @@ -13,5 +13,8 @@ if(!OC_USER::isLoggedIn()) { OC_JSON::checkAppEnabled('calendar'); $calendarid = $_POST['calendarid']; OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); -$cal = OC_Calendar_Calendar::findCalendar($calendarid); -echo $cal['active']; +$calendar = OC_Calendar_Calendar::findCalendar($calendarid); +OC_JSON::success(array( + 'active' => $calendar['active'], + 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), +)); diff --git a/apps/calendar/ajax/changeview.php b/apps/calendar/ajax/changeview.php index b396ff4945b..ef05c7cd496 100644 --- a/apps/calendar/ajax/changeview.php +++ b/apps/calendar/ajax/changeview.php @@ -7,10 +7,9 @@ */ require_once ("../../../lib/base.php"); -if(!OC_USER::isLoggedIn()) { - die("<script type=\"text/javascript\">document.location = oc_webroot;</script>"); -} +OC_JSON::checkLoggedIn(); OC_JSON::checkAppEnabled('calendar'); $currentview = $_GET["v"]; OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", $currentview); +OC_JSON::success(); ?> diff --git a/apps/calendar/ajax/createcalendar.php b/apps/calendar/ajax/createcalendar.php index 3fb2e8398a3..325a5ec35bc 100644 --- a/apps/calendar/ajax/createcalendar.php +++ b/apps/calendar/ajax/createcalendar.php @@ -20,4 +20,7 @@ OC_Calendar_Calendar::setCalendarActive($calendarid, 1); $calendar = OC_Calendar_Calendar::findCalendar($calendarid); $tmpl = new OC_Template('calendar', 'part.choosecalendar.rowfields'); $tmpl->assign('calendar', $calendar); -OC_JSON::success(array('data' => $tmpl->fetchPage())); +OC_JSON::success(array( + 'page' => $tmpl->fetchPage(), + 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), +)); diff --git a/apps/calendar/ajax/editevent.php b/apps/calendar/ajax/editevent.php index 3abf4de98b3..46feb068499 100644 --- a/apps/calendar/ajax/editevent.php +++ b/apps/calendar/ajax/editevent.php @@ -34,7 +34,14 @@ if($errarr){ OC_JSON::error(); exit; } - $vcalendar = Sabre_VObject_Reader::read($data['calendardata']); + $vcalendar = OC_Calendar_Object::parse($data['calendardata']); + + $last_modified = $vcalendar->VEVENT->__get('LAST-MODIFIED'); + if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){ + OC_JSON::error(array('modified'=>true)); + exit; + } + OC_Calendar_Object::updateVCalendarFromRequest($_POST, $vcalendar); $result = OC_Calendar_Object::edit($id, $vcalendar->serialize()); if ($data['calendarid'] != $cal) { diff --git a/apps/calendar/ajax/editeventform.php b/apps/calendar/ajax/editeventform.php index 34d6c657cec..63c72934079 100644 --- a/apps/calendar/ajax/editeventform.php +++ b/apps/calendar/ajax/editeventform.php @@ -26,7 +26,7 @@ if($calendar['userid'] != OC_User::getUser()){ echo $l10n->t('Wrong calendar'); exit; } -$object = Sabre_VObject_Reader::read($data['calendardata']); +$object = OC_Calendar_Object::parse($data['calendardata']); $vevent = $object->VEVENT; $dtstart = $vevent->DTSTART; $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); @@ -63,9 +63,16 @@ foreach($categories as $category){ } $repeat = isset($vevent->CATEGORY) ? $vevent->CATEGORY->value : ''; $description = isset($vevent->DESCRIPTION) ? $vevent->DESCRIPTION->value : ''; +$last_modified = $vevent->__get('LAST-MODIFIED'); +if ($last_modified){ + $lastmodified = $last_modified->getDateTime()->format('U'); +}else{ + $lastmodified = 0; +} $tmpl = new OC_Template('calendar', 'part.editevent'); $tmpl->assign('id', $id); +$tmpl->assign('lastmodified', $lastmodified); $tmpl->assign('calendar_options', $calendar_options); $tmpl->assign('category_options', $category_options); $tmpl->assign('repeat_options', $repeat_options); diff --git a/apps/calendar/ajax/events.php b/apps/calendar/ajax/events.php new file mode 100644 index 00000000000..9a2ba880608 --- /dev/null +++ b/apps/calendar/ajax/events.php @@ -0,0 +1,84 @@ +<?php +/** + * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ + +require_once ('../../../lib/base.php'); +require_once('../../../3rdparty/when/When.php'); + +function addoutput($event, $vevent, $return_event){ + $return_event['id'] = (int)$event['id']; + $return_event['title'] = $event['summary']; + $return_event['description'] = isset($vevent->DESCRIPTION)?$vevent->DESCRIPTION->value:''; + $last_modified = $vevent->__get('LAST-MODIFIED'); + if ($last_modified){ + $lastmodified = $last_modified->getDateTime()->format('U'); + }else{ + $lastmodified = 0; + } + $return_event['lastmodified'] = (int)$lastmodified; + return $return_event; +} + +OC_JSON::checkLoggedIn(); +OC_JSON::checkAppEnabled('calendar'); + +$start = DateTime::createFromFormat('U', $_GET['start']); +$end = DateTime::createFromFormat('U', $_GET['end']); + +$events = OC_Calendar_Object::allInPeriod($_GET['calendar_id'], $start, $end); +$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); +$return = array(); +foreach($events as $event){ + $object = OC_Calendar_Object::parse($event['calendardata']); + $vevent = $object->VEVENT; + $dtstart = $vevent->DTSTART; + $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); + $return_event = array(); + $start_dt = $dtstart->getDateTime(); + $start_dt->setTimezone(new DateTimeZone($user_timezone)); + $end_dt = $dtend->getDateTime(); + $end_dt->setTimezone(new DateTimeZone($user_timezone)); + if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){ + $return_event['allDay'] = true; + }else{ + $return_event['allDay'] = false; + } + //Repeating Events + if($event['repeating'] == 1){ + $duration = (double) $end_dt->format('U') - (double) $start_dt->format('U'); + $r = new When(); + $r->recur((string) $start_dt->format('Ymd\THis'))->rrule((string) $vevent->RRULE); + while($result = $r->next()){ + if($result->format('U') > $_GET['end']){ + break; + } + if($return_event['allDay'] == true){ + $return_event['start'] = $result->format('Y-m-d'); + $return_event['end'] = date('Y-m-d', $result->format('U') + $duration--); + }else{ + $return_event['start'] = $result->format('Y-m-d H:i:s'); + $return_event['end'] = date('Y-m-d H:i:s', $result->format('U') + $duration); + } + $return[] = addoutput($event, $vevent, $return_event); + } + }else{ + $return_event = array(); + if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE){ + $return_event['allDay'] = true; + $return_event['start'] = $start_dt->format('Y-m-d'); + $end_dt->modify('-1 sec'); + $return_event['end'] = $end_dt->format('Y-m-d'); + }else{ + $return_event['start'] = $start_dt->format('Y-m-d H:i:s'); + $return_event['end'] = $end_dt->format('Y-m-d H:i:s'); + $return_event['allDay'] = false; + } + $return[] = addoutput($event, $vevent, $return_event); + } +} +OC_JSON::encodedPrint($return); +?>
\ No newline at end of file diff --git a/apps/calendar/ajax/getcal.php b/apps/calendar/ajax/getcal.php deleted file mode 100644 index a65c6cf2602..00000000000 --- a/apps/calendar/ajax/getcal.php +++ /dev/null @@ -1,70 +0,0 @@ -<?php -/** - * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de> - * This file is licensed under the Affero General Public License version 3 or - * later. - * See the COPYING-README file. - */ - -require_once ("../../../lib/base.php"); -if(!OC_USER::isLoggedIn()) { - die("<script type=\"text/javascript\">document.location = oc_webroot;</script>"); -} -OC_JSON::checkAppEnabled('calendar'); - -$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1); -$events = array(); -$return = array('calendars'=>array()); -foreach($calendars as $calendar) { - $tmp = OC_Calendar_Object::all($calendar['id']); - $events = array_merge($events, $tmp); - $return['calendars'][$calendar['id']] = array( - 'displayname' => $calendar['displayname'], - 'color' => '#'.$calendar['calendarcolor'] - ); -} - -$select_year = $_GET["year"]; -$user_timezone = OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone", "Europe/London"); -foreach($events as $event) -{ - if ($select_year != substr($event['startdate'], 0, 4)) - continue; - $object = Sabre_VObject_Reader::read($event['calendardata']); - $vevent = $object->VEVENT; - $dtstart = $vevent->DTSTART; - $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); - $start_dt = $dtstart->getDateTime(); - $start_dt->setTimezone(new DateTimeZone($user_timezone)); - $end_dt = $dtend->getDateTime(); - $end_dt->setTimezone(new DateTimeZone($user_timezone)); - $year = $start_dt->format('Y'); - $month = $start_dt->format('n') - 1; // return is 0 based - $day = $start_dt->format('j'); - $hour = $start_dt->format('G'); - if ($dtstart->getDateType() == Sabre_VObject_Element_DateTime::DATE) { - $hour = 'allday'; - } - - $return_event = array(); - foreach(array('id', 'calendarid', 'objecttype', 'repeating') as $prop) - { - $return_event[$prop] = $event[$prop]; - } - $return_event['startdate'] = explode('|', $start_dt->format('Y|m|d|H|i')); - $return_event['enddate'] = explode('|', $end_dt->format('Y|m|d|H|i')); - $return_event['description'] = $event['summary']; - if ($hour == 'allday') - { - $return_event['allday'] = true; - } - if (isset($return[$year][$month][$day][$hour])) - { - $return[$year][$month][$day][$hour][] = $return_event; - } - else - { - $return[$year][$month][$day][$hour] = array(1 => $return_event); - } -} -OC_JSON::encodedPrint($return); diff --git a/apps/calendar/ajax/guesstimezone.php b/apps/calendar/ajax/guesstimezone.php new file mode 100755 index 00000000000..a3594498b0f --- /dev/null +++ b/apps/calendar/ajax/guesstimezone.php @@ -0,0 +1,39 @@ +<?php +/** + * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +function make_array_out_of_xml ($xml){ + $returnarray = array(); + $xml = (array)$xml ; + foreach ($xml as $property => $value){ + $value = (array)$value; + if(!isset($value[0])){ + $returnarray[$property] = make_array_out_of_xml($value); + }else{ + $returnarray[$property] = trim($value[0]); + } + } + return $returnarray; +} +require_once ("../../../lib/base.php"); +OC_JSON::checkLoggedIn(); +OC_JSON::checkAppEnabled('calendar'); +$l = new OC_L10N('calendar'); +$lat = $_GET['lat']; +$long = $_GET['long']; +$geolocation = file_get_contents('http://ws.geonames.org/timezone?lat=' . $lat . '&lng=' . $long); +//Information are by Geonames (http://www.geonames.org) and licensed under the Creative Commons Attribution 3.0 License +$geoxml = simplexml_load_string($geolocation); +$geoarray = make_array_out_of_xml($geoxml); +if(isset($geoarray['timezone']['timezoneId']) && $geoarray['timezone']['timezoneId'] != ''){ + OC_Preferences::setValue(OC_USER::getUser(), 'calendar', 'timezone', $geoarray['timezone']['timezoneId']); + $message = array('message'=> $l->t('New Timezone:') . $geoarray['timezone']['timezoneId']); + OC_JSON::success($message); +}else{ + OC_JSON::error(); +} + +?>
\ No newline at end of file diff --git a/apps/calendar/ajax/moveevent.php b/apps/calendar/ajax/moveevent.php index e2b777969da..6b315a39213 100644 --- a/apps/calendar/ajax/moveevent.php +++ b/apps/calendar/ajax/moveevent.php @@ -1,6 +1,6 @@ <?php /** - * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de> + * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> * This file is licensed under the Affero General Public License version 3 or * later. * See the COPYING-README file. @@ -11,93 +11,49 @@ OC_JSON::checkLoggedIn(); $data = OC_Calendar_Object::find($_POST["id"]); $calendarid = $data["calendarid"]; $cal = $calendarid; -$id = $_POST["id"]; +$id = $_POST['id']; $calendar = OC_Calendar_Calendar::findCalendar($calendarid); -if(OC_User::getUser() != $calendar["userid"]){ +if(OC_User::getUser() != $calendar['userid']){ OC_JSON::error(); exit; } -$newdate = $_POST["newdate"]; -$caldata = array(); -//modified part of editeventform.php -$object = Sabre_VObject_Reader::read($data['calendardata']); -$vevent = $object->VEVENT; +$allday = $_POST['allDay']; +$delta = new DateInterval('P0D'); +$delta->d = $_POST['dayDelta']; +$delta->i = $_POST['minuteDelta']; + +$vcalendar = OC_Calendar_Object::parse($data['calendardata']); +$vevent = $vcalendar->VEVENT; + +$last_modified = $vevent->__get('LAST-MODIFIED'); +if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){ + OC_JSON::error(); + exit; +} + $dtstart = $vevent->DTSTART; $dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); -switch($dtstart->getDateType()) { - case Sabre_VObject_Element_DateTime::LOCALTZ: - case Sabre_VObject_Element_DateTime::LOCAL: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = $dtstart->getDateTime()->format('H:i'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = $dtend->getDateTime()->format('H:i'); - $allday = false; - break; - case Sabre_VObject_Element_DateTime::DATE: - $startdate = $dtstart->getDateTime()->format('d-m-Y'); - $starttime = '00:00'; - $dtend->getDateTime()->modify('-1 day'); - $enddate = $dtend->getDateTime()->format('d-m-Y'); - $endtime = '23:59'; - $allday = true; - break; +$start_type = $dtstart->getDateType(); +$end_type = $dtend->getDateType(); +if ($allday && $start_type != Sabre_VObject_Element_DateTime::DATE){ + $start_type = $end_type = Sabre_VObject_Element_DateTime::DATE; + $dtend->setDateTime($dtend->getDateTime()->modify('+1 day'), $end_type); } -$caldata["title"] = isset($vevent->SUMMARY) ? $vevent->SUMMARY->value : ''; -$caldata["location"] = isset($vevent->LOCATION) ? $vevent->LOCATION->value : ''; -$caldata["categories"] = array(); -if (isset($vevent->CATEGORIES)){ - $caldata["categories"] = explode(',', $vevent->CATEGORIES->value); - $caldata["categories"] = array_map('trim', $categories); +if (!$allday && $start_type == Sabre_VObject_Element_DateTime::DATE){ + $start_type = $end_type = Sabre_VObject_Element_DateTime::LOCALTZ; } -foreach($caldata["categories"] as $category){ - if (!in_array($category, $category_options)){ - array_unshift($category_options, $category); - } -} -$caldata["repeat"] = isset($vevent->CATEGORY) ? $vevent->CATEGORY->value : ''; -$caldata["description"] = isset($vevent->DESCRIPTION) ? $vevent->DESCRIPTION->value : ''; -//end part of editeventform.php -$startdatearray = explode("-", $startdate); -$starttimearray = explode(":", $starttime); -$startunix = mktime($starttimearray[0], $starttimearray[1], 0, $startdatearray[1], $startdatearray[0], $startdatearray[2]); -$enddatearray = explode("-", $enddate); -$endtimearray = explode(":", $endtime); -$endunix = mktime($endtimearray[0], $endtimearray[1], 0, $enddatearray[1], $enddatearray[0], $enddatearray[2]); -$difference = $endunix - $startunix; -if(strlen($newdate) > 10){ - $newdatestringarray = explode("-", $newdate); - if($newdatestringarray[1] == "allday"){ - $allday = true; - $newdatestringarray[1] = "00:00"; - }else{ - if($allday == true){ - $difference = 3600; - } - $allday = false; - } -}else{ - $newdatestringarray = array(); - $newdatestringarray[0] = $newdate; - $newdatestringarray[1] = $starttime; -} -$newdatearray = explode(".", $newdatestringarray[0]); -$newtimearray = explode(":", $newdatestringarray[1]); -$newstartunix = mktime($newtimearray[0], $newtimearray[1], 0, $newdatearray[1], $newdatearray[0], $newdatearray[2]); -$newendunix = $newstartunix + $difference; -if($allday == true){ - $caldata["allday"] = true; -}else{ - unset($caldata["allday"]); -} -$caldata["from"] = date("d-m-Y", $newstartunix); -$caldata["fromtime"] = date("H:i", $newstartunix); -$caldata["to"] = date("d-m-Y", $newendunix); -$caldata["totime"] = date("H:i", $newendunix); -//modified part of editevent.php -$vcalendar = Sabre_VObject_Reader::read($data["calendardata"]); -OC_Calendar_Object::updateVCalendarFromRequest($caldata, $vcalendar); +$dtstart->setDateTime($dtstart->getDateTime()->add($delta), $start_type); +$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); +unset($vevent->DURATION); + +$now = new DateTime(); +$last_modified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED'); +$last_modified->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); +$vevent->__set('LAST-MODIFIED', $last_modified); + +$dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP'); +$dtstamp->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); +$vevent->DTSTAMP = $dtstamp; $result = OC_Calendar_Object::edit($id, $vcalendar->serialize()); -OC_JSON::success(); -//end part of editevent.php -?>
\ No newline at end of file +OC_JSON::success(array('lastmodified'=>(int)$now->format('U'))); diff --git a/apps/calendar/ajax/neweventform.php b/apps/calendar/ajax/neweventform.php index 9d4dcfa2e13..588d364871c 100644 --- a/apps/calendar/ajax/neweventform.php +++ b/apps/calendar/ajax/neweventform.php @@ -15,43 +15,35 @@ if(!OC_USER::isLoggedIn()) { } OC_JSON::checkAppEnabled('calendar'); -$calendar_options = OC_Calendar_Calendar::allCalendars(OC_User::getUser()); -$category_options = OC_Calendar_Object::getCategoryOptions($l10n); -$repeat_options = OC_Calendar_Object::getRepeatOptions($l10n); -$startday = substr($_GET['d'], 0, 2); -$startmonth = substr($_GET['d'], 2, 2); -$startyear = substr($_GET['d'], 4, 4); -$starttime = $_GET['t']; -$allday = $starttime == 'allday'; -if($starttime != 'undefined' && !is_nan($starttime) && !$allday){ - $startminutes = '00'; -}elseif($allday){ - $starttime = '0'; - $startminutes = '00'; -}else{ - $starttime = date('G'); - - $startminutes = date('i'); +if (!isset($_POST['start'])){ + OC_JSON::error(); + die; } +$start = $_POST['start']; +$end = $_POST['end']; +$allday = $_POST['allday']; -$datetimestamp = mktime($starttime, $startminutes, 0, $startmonth, $startday, $startyear); -$duration = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'duration', "60"); -$datetimestamp = $datetimestamp + ($duration * 60); -$endmonth = date("m", $datetimestamp); -$endday = date("d", $datetimestamp); -$endyear = date("Y", $datetimestamp); -$endtime = date("G", $datetimestamp); -$endminutes = date("i", $datetimestamp); - +if (!$end){ + $duration = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'duration', '60'); + $end = $start + ($duration * 60); +} +$start = new DateTime('@'.$start); +$end = new DateTime('@'.$end); +$timezone = OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timezone', 'Europe/London'); +$start->setTimezone(new DateTimeZone($timezone)); +$end->setTimezone(new DateTimeZone($timezone)); +$calendar_options = OC_Calendar_Calendar::allCalendars(OC_User::getUser()); +$category_options = OC_Calendar_Object::getCategoryOptions($l10n); +$repeat_options = OC_Calendar_Object::getRepeatOptions($l10n); $tmpl = new OC_Template('calendar', 'part.newevent'); $tmpl->assign('calendar_options', $calendar_options); $tmpl->assign('category_options', $category_options); -$tmpl->assign('startdate', $startday . '-' . $startmonth . '-' . $startyear); -$tmpl->assign('starttime', ($starttime <= 9 ? '0' : '') . $starttime . ':' . $startminutes); -$tmpl->assign('enddate', $endday . '-' . $endmonth . '-' . $endyear); -$tmpl->assign('endtime', ($endtime <= 9 ? '0' : '') . $endtime . ':' . $endminutes); +$tmpl->assign('startdate', $start->format('d-m-Y')); +$tmpl->assign('starttime', $start->format('H:i')); +$tmpl->assign('enddate', $end->format('d-m-Y')); +$tmpl->assign('endtime', $end->format('H:i')); $tmpl->assign('allday', $allday); $tmpl->printpage(); ?> diff --git a/apps/calendar/ajax/resizeevent.php b/apps/calendar/ajax/resizeevent.php new file mode 100644 index 00000000000..28a185411e0 --- /dev/null +++ b/apps/calendar/ajax/resizeevent.php @@ -0,0 +1,49 @@ +<?php +/** + * Copyright (c) 2011 Bart Visscher <bartv@thisnet.nl> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +error_reporting(E_ALL); +require_once('../../../lib/base.php'); +OC_JSON::checkLoggedIn(); +$data = OC_Calendar_Object::find($_POST["id"]); +$calendarid = $data["calendarid"]; +$cal = $calendarid; +$id = $_POST['id']; +$calendar = OC_Calendar_Calendar::findCalendar($calendarid); +if(OC_User::getUser() != $calendar['userid']){ + OC_JSON::error(); + exit; +} + +$delta = new DateInterval('P0D'); +$delta->d = $_POST['dayDelta']; +$delta->i = $_POST['minuteDelta']; + +$vcalendar = OC_Calendar_Object::parse($data['calendardata']); +$vevent = $vcalendar->VEVENT; + +$last_modified = $vevent->__get('LAST-MODIFIED'); +if($last_modified && $_POST['lastmodified'] != $last_modified->getDateTime()->format('U')){ + OC_JSON::error(); + exit; +} + +$dtend = OC_Calendar_Object::getDTEndFromVEvent($vevent); +$end_type = $dtend->getDateType(); +$dtend->setDateTime($dtend->getDateTime()->add($delta), $end_type); +unset($vevent->DURATION); + +$now = new DateTime(); +$last_modified = new Sabre_VObject_Element_DateTime('LAST-MODIFIED'); +$last_modified->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); +$vevent->__set('LAST-MODIFIED', $last_modified); + +$dtstamp = new Sabre_VObject_Element_DateTime('DTSTAMP'); +$dtstamp->setDateTime($now, Sabre_VObject_Element_DateTime::UTC); +$vevent->DTSTAMP = $dtstamp; + +$result = OC_Calendar_Object::edit($id, $vcalendar->serialize()); +OC_JSON::success(array('lastmodified'=>$now->format('U'))); diff --git a/apps/calendar/ajax/updatecalendar.php b/apps/calendar/ajax/updatecalendar.php index a81644ded17..e99ca16e22a 100644 --- a/apps/calendar/ajax/updatecalendar.php +++ b/apps/calendar/ajax/updatecalendar.php @@ -20,4 +20,7 @@ OC_Calendar_Calendar::setCalendarActive($calendarid, $_POST['active']); $calendar = OC_Calendar_Calendar::findCalendar($calendarid); $tmpl = new OC_Template('calendar', 'part.choosecalendar.rowfields'); $tmpl->assign('calendar', $calendar); -OC_JSON::success(array('data' => $tmpl->fetchPage())); +OC_JSON::success(array( + 'page' => $tmpl->fetchPage(), + 'eventSource' => OC_Calendar_Calendar::getEventSourceInfo($calendar), +)); diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php index 2dc01eab0f6..5675e624dda 100644 --- a/apps/calendar/appinfo/app.php +++ b/apps/calendar/appinfo/app.php @@ -21,3 +21,5 @@ OC_App::addNavigationEntry( array( 'name' => $l->t('Calendar'))); OC_App::registerPersonal('calendar', 'settings'); + +require_once('apps/calendar/lib/search.php');
\ No newline at end of file diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css index 80d29ca8974..0204f2fc12f 100644 --- a/apps/calendar/css/style.css +++ b/apps/calendar/css/style.css @@ -17,19 +17,12 @@ #editentry_dialog {display: none;} #parsingfail_dialog{display: none;} -#calendar_holder {height: 100%; width: 100%;} -#onedayview, #oneweekview, #fourweeksview, #onemonthview, #listview {display: none; position: absolute;bottom: 0; right: 0; left: 160px; top: 80px;} -#onedayview table {margin: 0; padding: 0; width: 100%; height: 100%; border-spacing:1px; background: #EEEEEE;} -#oneweekview table {margin: 0; padding: 0; width: 100%; height: 100%; border-spacing:1px; background: #EEEEEE;} -#fourweeksview table {margin: 0; padding: 0; width: 100%; height: 100%; border-spacing:1px; background: #EEEEEE;overflow: hidden;} -#onemonthview table {margin: 0; padding: 0; width: 100%; height: 100%; border-spacing:1px; background: #EEEEEE;} +#calendar_holder {position: relative;bottom: 0; right: 0; left: 0; top: 3em;} +.fc-content{padding:2px 4px;} #listview {margin: 0; padding: 10px; background: #EEEEEE;} #listview #more_before, #listview #more_after {border: 1px solid #1a1a1a; width:25em;padding: 3px;text-align: center;} #listview #events {width:25em;padding: 4px;} #listview #events .day {width:auto;padding-left:10px;border-bottom: 2px solid #EEEEEE;text-align:left;} -#fourweeksview .calw{vertical-align: middle;text-align: center;width: 50px;} - -#sysbox{display: none;} .actions {height: 33px; min-width: 800px;} .controls {min-width: 800px;} @@ -60,3 +53,75 @@ button.category{margin:0 3px;} .calendar-colorpicker-color{display:inline-block;width:20px;height:20px;margin-right:2px;cursor:pointer;border:2px solid transparent;} .calendar-colorpicker-color.active{border:2px solid black;} + +.fc-list-table +{ + margin: 10px; + border-style: hidden; + border-width: 10px; + padding: 10px; + vertical-align: top; + width: 100%; +} +.fc-list-table tr:hover +{ + color: #0000FF; + background-color: #CCFFCC; +} + + +.fc-list-date +{ + margin: 16px; + white-space: nowrap; + text-align: left; + width: 100%; + background-color: #808080; + color: #FFFFFF; + font-weight: bold; + font-family: Arial, Helvetica, sans-serif; +} +.fc-list-time +{ + text-align: center; + white-space: nowrap; + width: 1%; +} + +.fc-list-event +{ + text-align: left; +} + +.fc-list-event .fc-event-title +{ + cursor: pointer; +} +.tipsy-event .tipsy-inner{ +background-color:#0098E4; +border:2px solid #1d2d44; +max-width:400px; +padding:0; +} +.tipsy-event .tipsy-arrow-s{ +border-top-color:#1d2d44; +} +.tipsy-event .tipsy-arrow-n{ +border-bottom-color:#1d2d44; +} +.tipsy-event .summary, +.tipsy-event .timespan, +.tipsy-event .description{ +padding:0 8px; +} +.tipsy-event .summary{ +background-color:#1d2d44; +font-size:1.2em; +font-weight:bold; +text-align:left; +padding:0 8px 2px; +} +.tipsy-event .description{ +line-height:1.2; +margin-bottom:4px; +} diff --git a/apps/calendar/index.php b/apps/calendar/index.php index 8b8ac729588..3313750d52e 100644 --- a/apps/calendar/index.php +++ b/apps/calendar/index.php @@ -10,15 +10,36 @@ require_once ('../../lib/base.php'); OC_Util::checkLoggedIn(); OC_Util::checkAppEnabled('calendar'); // Create default calendar ... -$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser()); +$calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1); if( count($calendars) == 0){ OC_Calendar_Calendar::addCalendar(OC_User::getUser(),'Default calendar'); - $calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser()); + $calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1); } -OC_UTIL::addScript('calendar', 'calendar'); -OC_UTIL::addStyle('calendar', 'style'); -OC_UTIL::addScript('', 'jquery.multiselect'); -OC_UTIL::addStyle('', 'jquery.multiselect'); -OC_APP::setActiveNavigationEntry('calendar_index'); -$output = new OC_TEMPLATE('calendar', 'calendar', 'user'); -$output -> printPage(); +$eventSources = array(); +foreach($calendars as $calendar){ + $eventSources[] = OC_Calendar_Calendar::getEventSourceInfo($calendar); +} +//Fix currentview for fullcalendar +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "oneweekview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "agendaWeek"); +} +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "onemonthview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "month"); +} +if(OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') == "listview"){ + OC_Preferences::setValue(OC_USER::getUser(), "calendar", "currentview", "list"); +} + +OC_Util::addScript('3rdparty/fullcalendar', 'fullcalendar'); +OC_Util::addStyle('3rdparty/fullcalendar', 'fullcalendar'); +if(OC_Preferences::getValue(OC_USER::getUser(), "calendar", "timezone") == null){ + OC_UTIL::addScript('calendar', 'geo'); +} +OC_Util::addScript('calendar', 'calendar'); +OC_Util::addStyle('calendar', 'style'); +OC_Util::addScript('', 'jquery.multiselect'); +OC_Util::addStyle('', 'jquery.multiselect'); +OC_App::setActiveNavigationEntry('calendar_index'); +$tmpl = new OC_Template('calendar', 'calendar', 'user'); +$tmpl->assign('eventSources', $eventSources); +$tmpl->printPage();
\ No newline at end of file diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js index 2917d9f9134..005e359f8eb 100644 --- a/apps/calendar/js/calendar.js +++ b/apps/calendar/js/calendar.js @@ -8,261 +8,10 @@ Calendar={ space:' ', - firstdayofweek: '', - weekend: '', - Date:{ - normal_year_cal: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], - leap_year_cal: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], - calw:function() { - var dayofweek = this.current.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - } - var calw = Math.floor((this.doy() - dayofweek) / 7) + 1; - return calw; - }, - - doy:function() { - var cal = this.getnumberofdays(this.current.getFullYear()); - var doy = 0; - for(var i = 0; i < this.current.getMonth(); i++) { - doy = doy + cal[i]; - } - doy = doy + this.current.getDate(); - return doy; - }, - - getnumberofdays:function(year) { - if(this.checkforleapyear(year) == true) { - var cal = this.leap_year_cal; - } else { - var cal = this.normal_year_cal; - } - return cal; - }, - - checkforleapyear:function(year2check) { - if((year2check / 600) == Math.floor(year2check / 400)) { - return true; - } - if((year2check / 4) == Math.floor(year2check / 4)) { - if((year2check / 100) == Math.floor(year2check / 100)) { - return false; - } - return true; - } - return false; - }, - - current:new Date(), - forward_day:function(){ - this.current.setDate(this.current.getDate()+1); - }, - - forward_week:function(){ - this.current.setDate(this.current.getDate()+7); - }, - - forward_month:function(){ - this.current.setMonth(this.current.getMonth()+1); - }, - - backward_day:function(){ - this.current.setDate(this.current.getDate()-1); - }, - - backward_week:function(){ - this.current.setDate(this.current.getDate()-7); - }, - - backward_month:function(){ - this.current.setMonth(this.current.getMonth()-1); - }, - - }, UI:{ - weekdays: '', - formatDayShort:function(day){ - if (typeof(day) == 'undefined'){ - day = Calendar.Date.current.getDay(); - } - return this.dayshort[day]; - }, - formatDayLong:function(day){ - if (typeof(day) == 'undefined'){ - day = Calendar.Date.current.getDay(); - } - return this.daylong[day]; - }, - formatMonthShort:function(month){ - if (typeof(month) == 'undefined'){ - month = Calendar.Date.current.getMonth(); - } - return this.monthshort[month]; - }, - formatMonthLong:function(month){ - if (typeof(month) == 'undefined'){ - month = Calendar.Date.current.getMonth(); - } - return this.monthlong[month]; - }, - formatDate:function(date){ - return date[0] + '-' + date[1] + '-' + date[2]; - }, - formatTime:function(date){ - return date[3] + ':' + date[4]; - }, - updateView:function() { - this.current.removeEvents(); - this.current.renderCal(); - this.current.showEvents(); - }, - currentview:'none', - setCurrentView:function(view){ - if (view == this.currentview){ - return; - } - $('#'+this.currentview).hide(); - $('#'+this.currentview + "_radio").removeClass('active'); - this.currentview = view; - //sending ajax request on every change view - $("#sysbox").load(OC.filePath('calendar', 'ajax', 'changeview.php') + "?v="+view); - //not necessary to check whether the response is true or not - switch(view) { - case "onedayview": - this.current = this.OneDay; - break; - case "oneweekview": - this.current = this.OneWeek; - break; - case "fourweeksview": - this.current = this.FourWeeks; - break; - case "onemonthview": - this.current = this.OneMonth; - break; - case "listview": - this.current = this.List; - break; - default: - alert('Unknown view:'+view); - break; - } - $(document).ready(function() { - $('#'+Calendar.UI.currentview).show(); - $('#'+Calendar.UI.currentview + "_radio") - .addClass('active'); - Calendar.UI.updateView() - }); - }, - drageventid: '', - updateDate:function(direction){ - if(direction == 'forward' && this.current.forward) { - this.current.forward(); - if(Calendar.Date.current.getMonth() == 11){ - this.loadEvents(Calendar.Date.current.getFullYear() + 1); - } - this.updateView(); - } - if(direction == 'backward' && this.current.backward) { - this.current.backward(); - if(Calendar.Date.current.getMonth() == 0){ - this.loadEvents(Calendar.Date.current.getFullYear() - 1); - } - this.updateView(); - } - }, - events:[], - loadEvents:function(year){ - if( typeof (year) == 'undefined') { - this.events = []; - year = Calendar.Date.current.getFullYear(); - } - if( typeof (this.events[year]) == "undefined") { - this.events[year] = [] - } - $.getJSON(OC.filePath('calendar', 'ajax', 'getcal.php') + "?year=" + year, function(jsondata, status) { - if(status == "nosession") { - alert("You are not logged in. That can happen if you don't use owncloud for a long time."); - document.location(oc_webroot); - } - if(status == "parsingfail" || typeof (jsondata) == "undefined") { - $.ready(function() { - $( "#parsingfail_dialog" ).dialog(); - }); - } else { - if (typeof(jsondata[year]) != 'undefined'){ - Calendar.UI.calendars = jsondata['calendars']; - Calendar.UI.events[year] = jsondata[year]; - } - $(document).ready(function() { - Calendar.UI.updateView(); - }); - } - }); - window.setTimeout("Calendar.UI.loadEvents(" + year + ")", 120000); - }, - getEventsForDate:function(date){ - var day = date.getDate(); - var month = date.getMonth(); - var year = date.getFullYear(); - if( typeof (this.events[year]) == "undefined") { - this.loadEvents(year); - return false; - } - if( typeof (this.events[year][month]) == "undefined") { - return false; - } - if( typeof (this.events[year][month][day]) == "undefined") { - return false; - } - return this.events[year][month][day]; - }, - createEventsForDate:function(date, week){ - events = this.getEventsForDate(date); - if (!events) { - return; - } - var weekday = (date.getDay()+7-Calendar.firstdayofweek)%7; - if( typeof (events["allday"]) != "undefined") { - var eventnumber = 1; - var eventcontainer = this.current.getEventContainer(week, weekday, "allday"); - while( typeof (events["allday"][eventnumber]) != "undefined") { - this.addEventLabel(eventcontainer, events['allday'][eventnumber]); - eventnumber++; - } - } - for(var time = 0; time <= 23; time++) { - if( typeof (events[time]) != "undefined") { - var eventnumber = 1; - var eventcontainer = this.current.getEventContainer(week, weekday, time); - while( typeof (events[time][eventnumber]) != "undefined") { - this.addEventLabel(eventcontainer, events[time][eventnumber]); - eventnumber++; - } - } - } - }, - addEventLabel:function(eventcontainer, event){ - var event_holder = this.current.createEventLabel(event) - .addClass('event') - .data('event_info', event) - .hover(this.createEventPopup, - this.hideEventPopup) - .draggable({ - drag: function() { - Calendar.UI.drageventid = event.id; - } - }) - .click(this.editEvent); - var color = this.calendars[event['calendarid']]['color']; - if (color){ - event_holder.css('background-color', color) - .addClass('colored'); - } - eventcontainer.append(event_holder); - }, startEventDialog:function(){ + $('.tipsy').remove(); + $('#calendar_holder').fullCalendar('unselect'); Calendar.UI.lockTime(); $( "#from" ).datepicker({ dateFormat : 'dd-mm-yy' @@ -284,30 +33,20 @@ Calendar={ } }); }, - newEvent:function(selector, time){ - var date_info = $(selector).data('date_info'); - var dayofmonth = date_info.getDate(); - var month = date_info.getMonth(); - var year = date_info.getFullYear(); - if(dayofmonth <= 9){ - dayofmonth = '0' + dayofmonth; - } - month++; - if(month <= 9){ - month = '0' + month; + newEvent:function(start, end, allday){ + start = Math.round(start.getTime()/1000); + if (end){ + end = Math.round(end.getTime()/1000); } - var date = String(dayofmonth) + String(month) + String(year); if($('#event').dialog('isOpen') == true){ // TODO: save event $('#event').dialog('destroy').remove(); }else{ - $('#dialog_holder').load(OC.filePath('calendar', 'ajax', 'neweventform.php') + '?d=' + date + '&t=' + time, Calendar.UI.startEventDialog); + $('#dialog_holder').load(OC.filePath('calendar', 'ajax', 'neweventform.php'), {start:start, end:end, allday:allday?1:0}, Calendar.UI.startEventDialog); } }, - editEvent:function(event){ - event.stopPropagation(); - var event_data = $(this).data('event_info'); - var id = event_data.id; + editEvent:function(calEvent, jsEvent, view){ + var id = calEvent.id; if($('#event').dialog('isOpen') == true){ // TODO: save event $('#event').dialog('destroy').remove(); @@ -316,14 +55,14 @@ Calendar={ } }, submitDeleteEventForm:function(url){ - var post = $( "#event_form" ).serialize(); - $("#errorbox").empty(); + var post = $( '#event_form' ).serialize(); + $('#errorbox').empty(); $.post(url, post, function(data){ if(data.status == 'success'){ + $('#calendar_holder').fullCalendar('removeEvents', $('#event_form input[name=id]').val()); $('#event').dialog('destroy').remove(); - Calendar.UI.loadEvents(); } else { - $("#errorbox").html("Deletion failed"); + $('#errorbox').html(t('calendar', 'Deletion failed')); } }, "json"); @@ -334,27 +73,27 @@ Calendar={ $.post(url, post, function(data){ if(data.status == "error"){ - var output = "Missing fields: <br />"; + var output = missing_field + ": <br />"; if(data.title == "true"){ - output = output + "Title<br />"; + output = output + missing_field_title + "<br />"; } if(data.cal == "true"){ - output = output + "Calendar<br />"; + output = output + missing_field_calendar + "<br />"; } if(data.from == "true"){ - output = output + "From Date<br />"; + output = output + missing_field_fromdate + "<br />"; } if(data.fromtime == "true"){ - output = output + "From Time<br />"; + output = output + missing_field_fromtime + "<br />"; } if(data.to == "true"){ - output = output + "To Date<br />"; + output = output + missing_field_todate + "<br />"; } if(data.totime == "true"){ - output = output + "To Time<br />"; + output = output + missing_field_totime + "<br />"; } if(data.endbeforestart == "true"){ - output = "The event ends before it starts!"; + output = output + missing_field_startsbeforeends + "!<br/>"; } if(data.dberror == "true"){ output = "There was a database fail!"; @@ -363,65 +102,54 @@ Calendar={ } else if(data.status == 'success'){ $('#event').dialog('destroy').remove(); - Calendar.UI.loadEvents(); + $('#calendar_holder').fullCalendar('refetchEvents'); } },"json"); }, - moveevent:function(eventid, newstartdate){ - $.post(OC.filePath('calendar', 'ajax', 'moveevent.php'), { id: eventid, newdate: newstartdate}, + moveEvent:function(event, dayDelta, minuteDelta, allDay, revertFunc){ + $('.tipsy').remove(); + $.post(OC.filePath('calendar', 'ajax', 'moveevent.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, allDay: allDay?1:0, lastmodified: event.lastmodified}, + function(data) { + if (data.status == 'success'){ + event.lastmodified = data.lastmodified; + console.log("Event moved successfully"); + }else{ + revertFunc(); + $('#calendar_holder').fullCalendar('refetchEvents'); + } + }); + }, + resizeEvent:function(event, dayDelta, minuteDelta, revertFunc){ + $('.tipsy').remove(); + $.post(OC.filePath('calendar', 'ajax', 'resizeevent.php'), { id: event.id, dayDelta: dayDelta, minuteDelta: minuteDelta, lastmodified: event.lastmodified}, function(data) { - console.log("Event moved successfully"); + if (data.status == 'success'){ + event.lastmodified = data.lastmodified; + console.log("Event resized successfully"); + }else{ + revertFunc(); + $('#calendar_holder').fullCalendar('refetchEvents'); + } }); }, showadvancedoptions:function(){ $("#advanced_options").css("display", "block"); $("#advanced_options_button").css("display", "none"); }, - createEventPopup:function(e){ - var popup = $(this).data('popup'); - if (!popup){ - var event = $(this).data('event_info'); - popup = $(document.createElement('div')); - $(this).data('popup', popup).append(popup); - popup.addClass('popup') - popup.addClass('event_popup') - .html(Calendar.UI.getEventPopupText(event)); - } - popup.css('left', -(popup.width() - $(this).width())/2) - .show(); - }, - hideEventPopup:function(){ - $(this).data('popup').hide(); - }, getEventPopupText:function(event){ - var startdate = this.formatDate(event.startdate) - var starttime = this.formatTime(event.startdate) - var enddate = this.formatDate(event.enddate) - var endtime = this.formatTime(event.enddate) - if (event.allday){ - var timespan = startdate; - if (event.startdate[2] != parseInt(event.enddate[2])-1){ - timespan += ' - ' + enddate; - } + if (event.allDay){ + var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy]{ -[ddd d] MMMM yyyy}") }else{ - var start = startdate + ' ' + starttime; - if (startdate == enddate){ - var end = endtime; - }else{ - var end = enddate + ' ' + endtime; - } - var timespan = start + ' - ' + end; + var timespan = $.fullCalendar.formatDates(event.start, event.end, 'ddd d MMMM[ yyyy] ' + defaulttime + '{ -[ ddd d MMMM yyyy]' + defaulttime + '}', {monthNamesShort: monthNamesShort, monthNames: monthNames, dayNames: dayNames, dayNamesShort: dayNamesShort}); //t('calendar', "ddd d MMMM[ yyyy] HH:mm{ -[ ddd d MMMM yyyy] HH:mm}") + // Tue 18 October 2011 08:00 - 16:00 } - return '<span class="timespan">' + timespan + '</span>' - + ' ' - + '<span class="summary">' + event.description + '</span>'; - }, - addDateInfo:function(selector, date){ - $(selector).data('date_info', date); - }, - switch2Today:function(){ - Calendar.Date.current = new Date(); - Calendar.UI.updateView(); + var html = + '<div class="summary">' + event.title + '</div>' + + '<div class="timespan">' + timespan + '</div>'; + if (event.description){ + html += '<div class="description">' + event.description + '</div>'; + } + return html; }, lockTime:function(){ if($('#allday_checkbox').is(':checked')) { @@ -441,54 +169,41 @@ Calendar={ $('#caldav_url').show(); $("#caldav_url_close").show(); }, - deleteCalendar:function(calid){ - var check = confirm("Do you really want to delete this calendar?"); - if(check == false){ - return false; - }else{ - $.post(OC.filePath('calendar', 'ajax', 'deletecalendar.php'), { calendarid: calid}, - function(data) { - Calendar.UI.loadEvents(); - $('#choosecalendar_dialog').dialog('destroy').remove(); - Calendar.UI.Calendar.overview(); - }); - } - }, - initscroll:function(){ + initScroll:function(){ if(window.addEventListener) - document.addEventListener('DOMMouseScroll', Calendar.UI.scrollcalendar); + document.addEventListener('DOMMouseScroll', Calendar.UI.scrollCalendar); //}else{ - document.onmousewheel = Calendar.UI.scrollcalendar; + document.onmousewheel = Calendar.UI.scrollCalendar; //} }, - scrollcalendar:function(event){ + scrollCalendar:function(event){ + $('.tipsy').remove(); var direction; if(event.detail){ if(event.detail < 0){ - direction = "top"; + direction = 'top'; }else{ - direction = "down"; + direction = 'down'; } } if (event.wheelDelta){ if(event.wheelDelta > 0){ - direction = "top"; + direction = 'top'; }else{ - direction = "down"; + direction = 'down'; } } - if(Calendar.UI.currentview == "onemonthview"){ - if(direction == "down"){ - Calendar.UI.updateDate("forward"); - }else{ - Calendar.UI.updateDate("backward"); - } - }else if(Calendar.UI.currentview == "oneweekview"){ - if(direction == "down"){ - Calendar.UI.updateDate("forward"); - }else{ - Calendar.UI.updateDate("backward"); - } + var scroll = $(document).scrollTop(), + doc_height = $(document).height(), + win_height = $(window).height(); + if(direction == 'down' && win_height == (doc_height - scroll)){ + $('#calendar_holder').fullCalendar('next'); + $(document).scrollTop(0); + event.preventDefault(); + }else if (direction == 'top' && scroll == 0) { + $('#calendar_holder').fullCalendar('prev'); + $(document).scrollTop(win_height); + event.preventDefault(); } }, Calendar:{ @@ -510,8 +225,14 @@ Calendar={ { $.post(OC.filePath('calendar', 'ajax', 'activation.php'), { calendarid: calendarid, active: checkbox.checked?1:0 }, function(data) { - checkbox.checked = data == 1; - Calendar.UI.loadEvents(); + if (data.status == 'success'){ + checkbox.checked = data.active == 1; + if (data.active == 1){ + $('#calendar_holder').fullCalendar('addEventSource', data.eventSource); + }else{ + $('#calendar_holder').fullCalendar('removeEventSource', data.eventSource.url); + } + } }); }, newCalendar:function(object){ @@ -526,6 +247,46 @@ Calendar={ function(){Calendar.UI.Calendar.colorPicker(this)}); $(object).closest('tr').after(tr).hide(); }, + deleteCalendar:function(calid){ + var check = confirm("Do you really want to delete this calendar?"); + if(check == false){ + return false; + }else{ + $.post(OC.filePath('calendar', 'ajax', 'deletecalendar.php'), { calendarid: calid}, + function(data) { + if (data.status == 'success'){ + var url = 'ajax/events.php?calendar_id='+calid; + $('#calendar_holder').fullCalendar('removeEventSource', url); + $('#choosecalendar_dialog').dialog('destroy').remove(); + Calendar.UI.Calendar.overview(); + } + }); + } + }, + submit:function(button, calendarid){ + var displayname = $("#displayname_"+calendarid).val(); + var active = $("#edit_active_"+calendarid+":checked").length; + var description = $("#description_"+calendarid).val(); + var calendarcolor = $("#calendarcolor_"+calendarid).val(); + + var url; + if (calendarid == 'new'){ + url = "ajax/createcalendar.php"; + }else{ + url = "ajax/updatecalendar.php"; + } + $.post(url, { id: calendarid, name: displayname, active: active, description: description, color: calendarcolor }, + function(data){ + if(data.status == 'success'){ + $(button).closest('tr').prev().html(data.page).show().next().remove(); + $('#calendar_holder').fullCalendar('removeEventSource', data.eventSource.url); + $('#calendar_holder').fullCalendar('addEventSource', data.eventSource); + } + }, 'json'); + }, + cancel:function(button, calendarid){ + $(button).closest('tr').prev().show().next().remove(); + }, colorPicker:function(container){ // based on jquery-colorpicker at jquery.webspirited.com var obj = $('.colorpicker', container); @@ -551,429 +312,233 @@ Calendar={ position: 'absolute', left: -10000 }); - }, - submit:function(button, calendarid){ - var displayname = $("#displayname_"+calendarid).val(); - var active = $("#edit_active_"+calendarid+":checked").length; - var description = $("#description_"+calendarid).val(); - var calendarcolor = $("#calendarcolor_"+calendarid).val(); + } + } + } +} +$.fullCalendar.views.list = ListView; +function ListView(element, calendar) { + var t = this; - var url; - if (calendarid == 'new'){ - url = "ajax/createcalendar.php"; - }else{ - url = "ajax/updatecalendar.php"; - } - $.post(url, { id: calendarid, name: displayname, active: active, description: description, color: calendarcolor }, - function(data){ - if(data.error == "true"){ - }else{ - $(button).closest('tr').prev().html(data.data).show().next().remove(); - Calendar.UI.loadEvents(); - } - }, 'json'); - }, - cancel:function(button, calendarid){ - $(button).closest('tr').prev().show().next().remove(); - }, - },/* - OneDay:{ - forward:function(){ - Calendar.Date.forward_day(); - }, - backward:function(){ - Calendar.Date.backward_day(); - }, - removeEvents:function(){ - $("#onedayview .calendar_row").empty(); - }, - renderCal:function(){ - $("#datecontrol_date").val(Calendar.UI.formatDayShort() + Calendar.space + Calendar.Date.current.getDate() + Calendar.space + Calendar.UI.formatMonthShort() + Calendar.space + Calendar.Date.current.getFullYear()); - $("#onedayview_today").html(Calendar.UI.formatDayLong() + Calendar.space + Calendar.Date.current.getDate() + Calendar.space + Calendar.UI.formatMonthShort()); - Calendar.UI.addDateInfo('#onedayview_today', new Date(Calendar.Date.current)); - }, - showEvents:function(){ - Calendar.UI.createEventsForDate(Calendar.Date.current, 0); - }, - getEventContainer:function(week, weekday, when){ - return $("#onedayview ." + when); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '<strong>' + Calendar.UI.formatTime(event['startdate']) + ' - ' + Calendar.UI.formatTime(event['enddate']) + '</strong> '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - },*/ - OneWeek:{ - forward:function(){ - Calendar.Date.forward_week(); - }, - backward:function(){ - Calendar.Date.backward_week(); - }, - removeEvents:function(){ - for( i = 0; i <= 6; i++) { - $("#oneweekview ." + Calendar.UI.weekdays[i]).empty(); - } - $("#oneweekview .thisday").removeClass("thisday"); - }, - renderCal:function(){ - $("#datecontrol_date").val(Calendar.UI.cw_label + ": " + Calendar.Date.calw()); - var dates = this.generateDates(); - var today = new Date(); - for(var i = 0; i <= 6; i++){ - $("#oneweekview th." + Calendar.UI.weekdays[i]).html(Calendar.UI.formatDayShort((i+Calendar.firstdayofweek)%7) + Calendar.space + dates[i].getDate() + Calendar.space + Calendar.UI.formatMonthShort(dates[i].getMonth())); - $("#oneweekview td." + Calendar.UI.weekdays[i] + ".allday").attr('title', dates[i].getDate() + "." + String(parseInt(dates[i].getMonth()) + 1) + "." + dates[i].getFullYear() + "-" + "allday"); - $("#oneweekview td." + Calendar.UI.weekdays[i] + ".allday").droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - for(var ii = 0;ii <= 23; ii++){ - $("#oneweekview td." + Calendar.UI.weekdays[i] + "." + String(ii)).attr('title', dates[i].getDate() + "." + String(parseInt(dates[i].getMonth()) + 1) + "." + dates[i].getFullYear() + "-" + String(ii) + ":00"); - $("#oneweekview td." + Calendar.UI.weekdays[i] + "." + String(ii)).droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - } - if(dates[i].getDate() == today.getDate() && dates[i].getMonth() == today.getMonth() && dates[i].getFullYear() == today.getFullYear()){ - $("#oneweekview ." + Calendar.UI.weekdays[i]).addClass("thisday"); - } - Calendar.UI.addDateInfo('#oneweekview th.' + Calendar.UI.weekdays[i], dates[i]); - } - }, - showEvents:function(){ - var dates = this.generateDates(); - for(var weekday = 0; weekday <= 6; weekday++) { - Calendar.UI.createEventsForDate(dates[weekday], 0); - } - }, - getEventContainer:function(week, weekday, when){ - return $("#oneweekview ." + Calendar.UI.weekdays[weekday] + "." + when); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '<strong>' + Calendar.UI.formatTime(event['startdate']) + ' - ' + Calendar.UI.formatTime(event['enddate']) + '</strong> '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - } - if(Calendar.firstdayofweek > dayofweek){ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek - 7); - }else{ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek); - } - for(var i = 0; i <= 6; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); - } - return dates; - }, - },/* - FourWeeks:{ - forward:function(){ - Calendar.Date.forward_week(); - }, - backward:function(){ - Calendar.Date.backward_week(); - }, - removeEvents:function(){ - $('#fourweeksview .day.thisday').removeClass('thisday'); - $('#fourweeksview .day .events').empty(); - }, - renderCal:function(){ - var calw1 = Calendar.Date.calw(); - var calw2 = calw1 + 1; - var calw3 = calw1 + 2; - var calw4 = calw1 + 3; - switch(calw1) { - case 50: - calw4 = 1; - break; - case 51: - calw3 = 1; - calw4 = 2; - break; - case 52: - calw2 = 1; - calw3 = 2; - calw4 = 3; - break; - } - var calwplusfour = calw4; - var dates = this.generateDates(); - var week = 1; - var weekday = 0; - var today = new Date(); - for(var i = 0; i <= 27; i++){ - var dayofmonth = dates[i].getDate(); - var month = dates[i].getMonth(); - var year = dates[i].getFullYear(); - $("#fourweeksview .week_" + week + " ." + Calendar.UI.weekdays[weekday] + " .dateinfo").html(dayofmonth + Calendar.space + Calendar.UI.formatMonthShort(month)); - if(dayofmonth == today.getDate() && month == today.getMonth() && year == today.getFullYear()){ - $("#fourweeksview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).addClass('thisday'); - } - Calendar.UI.addDateInfo('#fourweeksview .week_' + week + ' .' + Calendar.UI.weekdays[weekday], dates[i]); - if(weekday == 6){ - weekday = 0; - week++; - }else{ - weekday++; - } - } - $("#fourweeksview .week_1 .calw").html(calw1); - $("#fourweeksview .week_2 .calw").html(calw2); - $("#fourweeksview .week_3 .calw").html(calw3); - $("#fourweeksview .week_4 .calw").html(calw4); - $("#datecontrol_date").val(Calendar.UI.cws_label + ": " + Calendar.Date.calw() + " - " + calwplusfour); - }, - showEvents:function(){ - var dates = this.generateDates(); - var weekdaynum = 0; - var weeknum = 1; - for(var i = 0; i <= 27; i++) { - Calendar.UI.createEventsForDate(dates[i], weeknum); - if(weekdaynum == 6){ - weekdaynum = 0; - weeknum++; - }else{ - weekdaynum++; - } - } - }, - getEventContainer:function(week, weekday, when){ - return $("#fourweeksview .week_" + week + " .day." + Calendar.UI.weekdays[weekday] + " .events"); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '<strong>' + Calendar.UI.formatTime(event['startdate']) + '</strong> '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - } - date.setDate(date.getDate() - dayofweek + 1); - for(var i = 0; i <= 27; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); - } - return dates; - }, - },*/ - OneMonth:{ - forward:function(){ - Calendar.Date.forward_month(); - }, - backward:function(){ - Calendar.Date.backward_month(); - }, - removeEvents:function(){ - $('#onemonthview .day.thisday').removeClass('thisday'); - $('#onemonthview .day .events').empty(); - }, - renderCal:function(){ - $("#datecontrol_date").val(Calendar.UI.formatMonthLong() + Calendar.space + Calendar.Date.current.getFullYear()); - var cal = Calendar.Date.getnumberofdays(Calendar.Date.current.getFullYear()); - var monthview_dayofweek = Calendar.Date.current.getDay(); - var monthview_dayofmonth = Calendar.Date.current.getDate(); - for(var i = monthview_dayofmonth; i > 1; i--) { - if(monthview_dayofweek == 0) { - monthview_dayofweek = 6; - } else { - monthview_dayofweek--; - } - } - $("#onemonthview .week_5").hide(); - $("#onemonthview .week_6").hide(); - this.rows = monthview_dayofweek + cal[Calendar.Date.current.getMonth()]; - this.rows = this.rows / 7; - this.rows = Math.ceil(this.rows); - var dates = this.generateDates(); - var week = 1; - var weekday = 0; - var today = new Date(); - for(var i = 0; i <= 41; i++){ - var dayofmonth = dates[i].getDate(); - var month = dates[i].getMonth(); - var year = dates[i].getFullYear(); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday] + " .dateinfo").html(dayofmonth + Calendar.space + Calendar.UI.formatMonthShort(month)); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).attr('title', dayofmonth + "." + String(parseInt(month) + 1) + "." + year); - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).droppable({ - drop: function() { - Calendar.UI.moveevent(Calendar.UI.drageventid, this.title); - Calendar.UI.loadEvents(); - } - }); - if(dayofmonth == today.getDate() && month == today.getMonth() && year == today.getFullYear()){ - $("#onemonthview .week_" + week + " ." + Calendar.UI.weekdays[weekday]).addClass('thisday'); - } - Calendar.UI.addDateInfo('#onemonthview .week_' + week + ' .' + Calendar.UI.weekdays[weekday], dates[i]); - if(weekday == 6){ - weekday = 0; - week++; - }else{ - weekday++; - } - } - if(this.rows == 4){ - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("23%"); - } - } - if(this.rows == 5) { - $("#onemonthview .week_5").show(); - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("18%"); - } - } - if(this.rows == 6) { - $("#onemonthview .week_5").show(); - $("#onemonthview .week_6").show(); - for(var i = 1;i <= 6;i++){ - $("#onemonthview .week_" + String(i)).height("14%"); - } - } - }, - showEvents:function(){ - var dates = this.generateDates(); - var weekdaynum = 0; - var weeknum = 1; - for(var i = 0; i <= 41; i++) { - Calendar.UI.createEventsForDate(dates[i], weeknum); - if(weekdaynum == 6){ - weekdaynum = 0; - weeknum++; - }else{ - weekdaynum++; - } - } - }, - getEventContainer:function(week, weekday, when){ - return $("#onemonthview .week_" + week + " .day." + Calendar.UI.weekdays[weekday] + " .events"); - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = '<strong>' + Calendar.UI.formatTime(event['startdate']) + '</strong> '; - } - return $(document.createElement('p')) - .html(time + event['description']) - }, - generateDates:function(){ - var dates = new Array(); - var date = new Date(Calendar.Date.current) - date.setDate(1); - var dayofweek = date.getDay(); - if(dayofweek == 0) { - dayofweek = 7; - this.rows++; - } - if(Calendar.firstdayofweek > dayofweek){ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek - 7); - }else{ - date.setDate(date.getDate() - dayofweek + Calendar.firstdayofweek); - } - for(var i = 0; i <= 41; i++) { - dates[i] = new Date(date) - date.setDate(date.getDate() + 1); + // imports + jQuery.fullCalendar.views.month.call(t, element, calendar); + var opt = t.opt; + var trigger = t.trigger; + var eventElementHandlers = t.eventElementHandlers; + var reportEventElement = t.reportEventElement; + var formatDate = calendar.formatDate; + var formatDates = calendar.formatDates; + var addDays = $.fullCalendar.addDays; + var cloneDate = $.fullCalendar.cloneDate; + function skipWeekend(date, inc, excl) { + inc = inc || 1; + while (!date.getDay() || (excl && date.getDay()==1 || !excl && date.getDay()==6)) { + addDays(date, inc); + } + return date; + } + + // overrides + t.name='list'; + t.render=render; + t.renderEvents=renderEvents; + t.setHeight=setHeight; + t.setWidth=setWidth; + t.clearEvents=clearEvents; + + function setHeight(height, dateChanged) { + } + + function setWidth(width) { + } + + function clearEvents() { + this.reportEventClear(); + } + + // main + function sortEvent(a, b) { + return a.start - b.start; + } + + function render(date, delta) { + if (!t.start){ + t.start = addDays(cloneDate(date, true), -7); + t.end = addDays(cloneDate(date, true), 7); + } + if (delta) { + if (delta < 0){ + addDays(t.start, -7); + if (!opt('weekends')) { + skipWeekend(t.start, delta < 0 ? -1 : 1); } - return dates; - }, - }, - List:{ - removeEvents:function(){ - this.eventContainer = $('#listview #events').empty(); - this.startdate = new Date(); - this.enddate = new Date(); - this.enddate.setDate(this.enddate.getDate()); - }, - renderCal:function(){ - var today = new Date(); - $('#datecontrol_date').val(this.formatDate(Calendar.Date.current)); - }, - showEvents:function(){ - this.renderMoreBefore(); - this.renderMoreAfter(); - }, - formatDate:function(date){ - return Calendar.UI.formatDayShort(date.getDay()) - + Calendar.space - + date.getDate() - + Calendar.space - + Calendar.UI.formatMonthShort(date.getMonth()) - + Calendar.space - + date.getFullYear(); - }, - createDay:function(date) { - return $(document.createElement('div')) - .addClass('day') - .html(this.formatDate(date)); - }, - renderMoreBefore:function(){ - var date = Calendar.UI.List.startdate; - for(var i = 0; i <= 13; i++) { - if (Calendar.UI.getEventsForDate(date)) { - Calendar.UI.List.dayContainer=Calendar.UI.List.createDay(date); - Calendar.UI.createEventsForDate(date, 0); - Calendar.UI.List.eventContainer.prepend(Calendar.UI.List.dayContainer); - } - date.setDate(date.getDate()-1); + }else{ + addDays(t.end, 7); + if (!opt('weekends')) { + skipWeekend(t.end, delta < 0 ? -1 : 1); } - var start = Calendar.UI.List.formatDate(date); - $('#listview #more_before').html(String(Calendar.UI.more_before).replace('{startdate}', start)); - }, - renderMoreAfter:function(){ - var date = Calendar.UI.List.enddate; - for(var i = 0; i <= 13; i++) { - if (Calendar.UI.getEventsForDate(date)) { - Calendar.UI.List.dayContainer=Calendar.UI.List.createDay(date); - Calendar.UI.createEventsForDate(date, 0); - Calendar.UI.List.eventContainer.append(Calendar.UI.List.dayContainer); - } - date.setDate(date.getDate()+1); + } + } + t.title = formatDates( + t.start, + t.end, + opt('titleFormat', 'week') + ); + t.visStart = cloneDate(t.start); + t.visEnd = cloneDate(t.end); + } + + function eventsOfThisDay(events, theDate) { + var start = cloneDate(theDate, true); + var end = addDays(cloneDate(start), 1); + var retArr = new Array(); + for (i in events) { + var event_end = t.eventEnd(events[i]); + if (events[i].start < end && event_end >= start) { + retArr.push(events[i]); + } + } + return retArr; + } + + function renderEvent(event) { + if (event.allDay) { //all day event + var time = opt('allDayText'); + } + else { + var time = formatDates(event.start, event.end, opt('timeFormat', 'agenda')); + } + var classes = ['fc-event', 'fc-list-event']; + classes = classes.concat(event.className); + if (event.source) { + classes = classes.concat(event.source.className || []); + } + var html = '<tr>' + + '<td> </td>' + + '<td class="fc-list-time">' + + time + + '</td>' + + '<td> </td>' + + '<td class="fc-list-event">' + + '<span id="list' + event.id + '"' + + ' class="' + classes.join(' ') + '"' + + '>' + + '<span class="fc-event-title">' + + event.title + + '</span>' + + '</span>' + + '</td>' + + '</tr>'; + return html; + } + + function renderDay(date, events) { + var dayRows = $('<tr>' + + '<td colspan="4" class="fc-list-date">' + + '<span>' + + formatDate(date, opt('titleFormat', 'day')) + + '</span>' + + '</td>' + + '</tr>'); + for (i in events) { + var event = events[i]; + var eventElement = $(renderEvent(event)); + triggerRes = trigger('eventRender', event, event, eventElement); + if (triggerRes === false) { + eventElement.remove(); + }else{ + if (triggerRes && triggerRes !== true) { + eventElement.remove(); + eventElement = $(triggerRes); } - var end = Calendar.UI.List.formatDate(date); - $('#listview #more_after').html(String(Calendar.UI.more_after).replace('{enddate}', end)); - }, - getEventContainer:function(week, weekday, when){ - return this.dayContainer; - }, - createEventLabel:function(event){ - var time = ''; - if (!event['allday']){ - time = Calendar.UI.formatTime(event['startdate']) + ' - ' + Calendar.UI.formatTime(event['enddate']) + ' '; + $.merge(dayRows, eventElement); + eventElementHandlers(event, eventElement); + reportEventElement(event, eventElement); + } + } + return dayRows; + } + + function renderEvents(events, modifiedEventId) { + events = events.sort(sortEvent); + + var table = $('<table class="fc-list-table"></table>'); + var total = events.length; + if (total > 0) { + var date = cloneDate(t.visStart); + while (date <= t.visEnd) { + var dayEvents = eventsOfThisDay(events, date); + if (dayEvents.length > 0) { + table.append(renderDay(date, dayEvents)); } - return $(document.createElement('p')) - .html(time + event['description']) - }, + date=addDays(date, 1); + } } + + this.element.html(table); } } $(document).ready(function(){ - $('#listview #more_before').click(Calendar.UI.List.renderMoreBefore); - $('#listview #more_after').click(Calendar.UI.List.renderMoreAfter); - Calendar.UI.initscroll(); + Calendar.UI.initScroll(); + $('#calendar_holder').fullCalendar({ + header: false, + firstDay: 1, + editable: true, + defaultView: defaultView, + timeFormat: { + agenda: agendatime, + '': defaulttime + }, + titleFormat: { + list: 'yyyy/MMM/d dddd' + }, + axisFormat: defaulttime, + monthNames: monthNames, + monthNamesShort: monthNamesShort, + dayNames: dayNames, + dayNamesShort: dayNamesShort, + allDayText: allDayText, + viewDisplay: function(view) { + $('#datecontrol_date').html(view.title); + $.get(OC.filePath('calendar', 'ajax', 'changeview.php') + "?v="+view.name); + }, + selectable: true, + selectHelper: true, + select: Calendar.UI.newEvent, + eventClick: Calendar.UI.editEvent, + eventDrop: Calendar.UI.moveEvent, + eventResize: Calendar.UI.resizeEvent, + eventRender: function(event, element) { + element.tipsy({ + className: 'tipsy-event', + opacity: 0.9, + gravity:$.fn.tipsy.autoBounds(150, 's'), + fade:true, + delayIn: 400, + html:true, + title:function() { + return Calendar.UI.getEventPopupText(event); + } + }); + }, + eventSources: eventSources + }); + $('#oneweekview_radio').click(function(){ + $('#calendar_holder').fullCalendar('changeView', 'agendaWeek'); + }); + $('#onemonthview_radio').click(function(){ + $('#calendar_holder').fullCalendar('changeView', 'month'); + }); + $('#listview_radio').click(function(){ + $('#calendar_holder').fullCalendar('changeView', 'list'); + }); + $('#today_input').click(function(){ + $('#calendar_holder').fullCalendar('today'); + }); + $('#datecontrol_left').click(function(){ + $('#calendar_holder').fullCalendar('prev'); + }); + $('#datecontrol_right').click(function(){ + $('#calendar_holder').fullCalendar('next'); + }); }); -//event vars -Calendar.UI.loadEvents(); diff --git a/apps/calendar/js/geo.js b/apps/calendar/js/geo.js new file mode 100755 index 00000000000..acea17c0269 --- /dev/null +++ b/apps/calendar/js/geo.js @@ -0,0 +1,20 @@ +/** + * Copyright (c) 2011 Georg Ehrke <ownclouddev at georgswebsite dot de> + * This file is licensed under the Affero General Public License version 3 or + * later. + * See the COPYING-README file. + */ +if (navigator.geolocation) { + navigator.geolocation.getCurrentPosition(function(position) { + $.getJSON(OC.filePath('calendar', 'ajax', 'guesstimezone.php?lat=' + position.coords.latitude + '&long=' + position.coords.longitude + ''), + function(data){ + if (data.status == 'success'){ + $('#notification').html(data.message); + $('#notification').slideDown(); + window.setTimeout(function(){$('#notification').slideUp();}, 5000); + }else{ + console.log('Can\'t set new timezone.'); + } + }); + }); +}
\ No newline at end of file diff --git a/apps/calendar/l10n/xgettextfiles b/apps/calendar/l10n/xgettextfiles index 4cc636436b4..27b8e457193 100644 --- a/apps/calendar/l10n/xgettextfiles +++ b/apps/calendar/l10n/xgettextfiles @@ -1,7 +1,11 @@ ../appinfo/app.php +../lib/object.php ../templates/calendar.php +../templates/part.choosecalendar.php +../templates/part.choosecalendar.rowfields.php +../templates/part.editcalendar.php ../templates/part.editevent.php -../templates/part.eventinfo.php +../templates/part.eventform.php +../templates/part.import.php ../templates/part.newevent.php -../templates/part.choosecalendar.php -../js/calendar.js +../templates/settings.php
\ No newline at end of file diff --git a/apps/calendar/lib/calendar.php b/apps/calendar/lib/calendar.php index f6d40aa534e..3db4398096e 100644 --- a/apps/calendar/lib/calendar.php +++ b/apps/calendar/lib/calendar.php @@ -240,4 +240,12 @@ class OC_Calendar_Calendar{ 'ecc255', // dark yellow ); } + public static function getEventSourceInfo($calendar){ + return array( + 'url' => 'ajax/events.php?calendar_id='.$calendar['id'], + 'backgroundColor' => '#'.$calendar['calendarcolor'], + 'borderColor' => '#888', + 'textColor' => 'black', + ); + } } diff --git a/apps/calendar/lib/object.php b/apps/calendar/lib/object.php index 33871cd3185..58d46ce6a7d 100644 --- a/apps/calendar/lib/object.php +++ b/apps/calendar/lib/object.php @@ -31,6 +31,34 @@ class OC_Calendar_Object{ } /** + * @brief Returns all objects of a calendar between $start and $end + * @param integer $id + * @param DateTime $start + * @param DateTime $end + * @return array + * + * The objects are associative arrays. You'll find the original vObject + * in ['calendardata'] + */ + public static function allInPeriod($id, $start, $end){ + $stmt = OC_DB::prepare( 'SELECT * FROM *PREFIX*calendar_objects WHERE calendarid = ?' + .' AND ((startdate >= ? AND startdate <= ? AND repeating = 0)' + .' OR (startdate <= ? AND repeating = 1))' ); + $start = self::getUTCforMDB($start); + $end = self::getUTCforMDB($end); + $result = $stmt->execute(array($id, + $start, $end, + $end)); + + $calendarobjects = array(); + while( $row = $result->fetchRow()){ + $calendarobjects[] = $row; + } + + return $calendarobjects; + } + + /** * @brief Returns an object * @param integer $id * @return associative array @@ -279,6 +307,7 @@ class OC_Calendar_Object{ */ public static function parse($data){ try { + Sabre_VObject_Reader::$elementMap['LAST-MODIFIED'] = 'Sabre_VObject_Element_DateTime'; $calendar = Sabre_VObject_Reader::read($data); return $calendar; } catch (Exception $e) { @@ -398,7 +427,7 @@ class OC_Calendar_Object{ $errarr['endbeforestart'] = 'true'; $errnum++; } - if($fromday == $today && $frommonth == $tomonth && $fromyear == $toyear){ + if(!$allday && $fromday == $today && $frommonth == $tomonth && $fromyear == $toyear){ list($tohours, $tominutes) = explode(':', $request['totime']); list($fromhours, $fromminutes) = explode(':', $request['fromtime']); if($tohours < $fromhours){ @@ -453,9 +482,11 @@ class OC_Calendar_Object{ $categories = isset($request["categories"]) ? $request["categories"] : null; $allday = isset($request["allday"]); $from = $request["from"]; - $fromtime = $request["fromtime"]; $to = $request["to"]; - $totime = $request["totime"]; + if (!$allday){ + $fromtime = $request['fromtime']; + $totime = $request['totime']; + } $description = $request["description"]; //$repeat = $request["repeat"]; /*switch($request["repeatfreq"]){ diff --git a/apps/calendar/lib/search.php b/apps/calendar/lib/search.php new file mode 100644 index 00000000000..41faf49a519 --- /dev/null +++ b/apps/calendar/lib/search.php @@ -0,0 +1,26 @@ +<?php +class OC_Search_Provider_Calendar extends OC_Search_Provider{ + function search($query){ + $calendars = OC_Calendar_Calendar::allCalendars(OC_User::getUser(), 1); + if(count($calendars)==0 || !OC_App::isEnabled('calendar')){ + //return false; + } + $results=array(); + $searchquery=array(); + if(substr_count($query, ' ') > 0){ + $searchquery = explode(' ', $query); + }else{ + $searchquery[] = $query; + } + foreach($calendars as $calendar){ + $objects = OC_Calendar_Object::all($calendar['id']); + foreach($objects as $object){ + if(substr_count(strtolower($object['summary']), strtolower($query)) > 0){//$name,$text,$link,$type + $results[]=new OC_Search_Result($object['summary'],'','#','Cal.'); + } + } + } + return $results; + } +} +new OC_Search_Provider_Calendar();
\ No newline at end of file diff --git a/apps/calendar/templates/calendar.php b/apps/calendar/templates/calendar.php index 317bb17ddbc..2003b7efc49 100644..100755 --- a/apps/calendar/templates/calendar.php +++ b/apps/calendar/templates/calendar.php @@ -1,217 +1,50 @@ -<?php -$hours24 = array( - 'allday' => $l->t('All day'), - 0 => '0', - 1 => '1', - 2 => '2', - 3 => '3', - 4 => '4', - 5 => '5', - 6 => '6', - 7 => '7', - 8 => '8', - 9 => '9', - 10 => '10', - 11 => '11', - 12 => '12', - 13 => '13', - 14 => '14', - 15 => '15', - 16 => '16', - 17 => '17', - 18 => '18', - 19 => '19', - 20 => '20', - 21 => '21', - 22 => '22', - 23 => '23', -); -$hoursampm = array( - 'allday' => $l->t('All day'), - 0 => '12 a.m.', - 1 => '1 a.m.', - 2 => '2 a.m.', - 3 => '3 a.m.', - 4 => '4 a.m.', - 5 => '5 a.m.', - 6 => '6 a.m.', - 7 => '7 a.m.', - 8 => '8 a.m.', - 9 => '9 a.m.', - 10 => '10 a.m.', - 11 => '11 a.m.', - 12 => '12 p.m.', - 13 => '1 p.m.', - 14 => '2 p.m.', - 15 => '3 p.m.', - 16 => '4 p.m.', - 17 => '5 p.m.', - 18 => '6 p.m.', - 19 => '7 p.m.', - 20 => '8 p.m.', - 21 => '9 p.m.', - 22 => '10 p.m.', - 23 => '11 p.m.', -); -if(OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'timeformat', "24") == "24"){ - $hours = $hours24; -}else{ - $hours = $hoursampm; -} -$weekdaynames = array('sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'); -$dayforgenerator = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'firstdayofweek', "1"); -$weekdays = array(); -for($i = 0;$i <= 6; $i++){ - $weekdays[$i] = $weekdaynames[$dayforgenerator]; - if($dayforgenerator == 6){ - $dayforgenerator = 0; - }else{ - $dayforgenerator++; - } -} -$weekendjson = OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'weekend', '{"Monday":"false","Tuesday":"false","Wednesday":"false","Thursday":"false","Friday":"false","Saturday":"true","Sunday":"true"}'); -$weekend = json_decode($weekendjson, true); -$weekenddays = array("sunday"=>$weekend["Sunday"], "monday"=>$weekend["Monday"], "tuesday"=>$weekend["Tuesday"], "wednesday"=>$weekend["Wednesday"], "thursday"=>$weekend["Thursday"], "friday"=>$weekend["Friday"], "saturday"=>$weekend["Saturday"]); -?> - <script type="text/javascript"> - <?php - echo "var weekdays = new Array('".$weekdays[0]."','".$weekdays[1]."','".$weekdays[2]."','".$weekdays[3]."','".$weekdays[4]."','".$weekdays[5]."','".$weekdays[6]."');\n"; - ?> - Calendar.UI.weekdays = weekdays; - Calendar.UI.daylong = new Array("<?php echo $l -> t("Sunday");?>", "<?php echo $l -> t("Monday");?>", "<?php echo $l -> t("Tuesday");?>", "<?php echo $l -> t("Wednesday");?>", "<?php echo $l -> t("Thursday");?>", "<?php echo $l -> t("Friday");?>", "<?php echo $l -> t("Saturday");?>"); - Calendar.UI.dayshort = new Array("<?php echo $l -> t("Sun.");?>", "<?php echo $l -> t("Mon.");?>", "<?php echo $l -> t("Tue.");?>", "<?php echo $l -> t("Wed.");?>", "<?php echo $l -> t("Thu.");?>", "<?php echo $l -> t("Fri.");?>", "<?php echo $l -> t("Sat.");?>"); - Calendar.UI.monthlong = new Array("<?php echo $l -> t("January");?>", "<?php echo $l -> t("February");?>", "<?php echo $l -> t("March");?>", "<?php echo $l -> t("April");?>", "<?php echo $l -> t("May");?>", "<?php echo $l -> t("June");?>", "<?php echo $l -> t("July");?>", "<?php echo $l -> t("August");?>", "<?php echo $l -> t("September");?>", "<?php echo $l -> t("October");?>", "<?php echo $l -> t("November");?>", "<?php echo $l -> t("December");?>"); - Calendar.UI.monthshort = new Array("<?php echo $l -> t("Jan.");?>", "<?php echo $l -> t("Feb.");?>", "<?php echo $l -> t("Mar.");?>", "<?php echo $l -> t("Apr.");?>", "<?php echo $l -> t("May.");?>", "<?php echo $l -> t("Jun.");?>", "<?php echo $l -> t("Jul.");?>", "<?php echo $l -> t("Aug.");?>", "<?php echo $l -> t("Sep.");?>", "<?php echo $l -> t("Oct.");?>", "<?php echo $l -> t("Nov.");?>", "<?php echo $l -> t("Dec.");?>"); - Calendar.UI.cw_label = "<?php echo $l->t("Week");?>"; - Calendar.UI.cws_label = "<?php echo $l->t("Weeks");?>"; - Calendar.UI.more_before = String('<?php echo $l->t('More before {startdate}') ?>'); - Calendar.UI.more_after = String('<?php echo $l->t('More after {enddate}') ?>'); - Calendar.firstdayofweek = parseInt("<?php echo OC_Preferences::getValue( OC_User::getUser(), 'calendar', 'firstdayofweek', "1"); ?>"); - //use last view as default on the next - Calendar.UI.setCurrentView("<?php echo OC_Preferences::getValue(OC_USER::getUser(), "calendar", "currentview", "onemonthview") ?>"); - var totalurl = "<?php echo OC_Helper::linkTo('calendar', 'caldav.php', null, true) . '/calendars'; ?>"; + <script type='text/javascript'> + var defaultView = '<?php echo OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'currentview', 'month') ?>'; + var eventSources = <?php echo json_encode($_['eventSources']) ?>; + var dayNames = <?php echo json_encode($l->tA(array('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'))) ?>; + var dayNamesShort = <?php echo json_encode($l->tA(array('Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'))) ?>; + var monthNames = <?php echo json_encode($l->tA(array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'))) ?>; + var monthNamesShort = <?php echo json_encode($l->tA(array('Jan.', 'Feb.', 'Mar.', 'Apr.', 'May.', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'))) ?>; + var agendatime = '<?php echo ((int) OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timeformat', '24') == 24 ? 'HH:mm' : 'hh:mm tt'); ?>{ - <?php echo ((int) OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timeformat', '24') == 24 ? 'HH:mm' : 'hh:mm tt'); ?>}'; + var defaulttime = '<?php echo ((int) OC_Preferences::getValue(OC_USER::getUser(), 'calendar', 'timeformat', '24') == 24 ? 'HH:mm' : 'hh:mm tt'); ?>'; + var allDayText = '<?php echo $l->t('All day') ?>'; + var missing_field = '<?php echo $l->t('Missing fields') ?>'; + var missing_field_title = '<?php echo $l->t('Title') ?>'; + var missing_field_calendar = '<?php echo $l->t('Calendar') ?>'; + var missing_field_fromdate = '<?php echo $l->t('From Date') ?>'; + var missing_field_fromtime = '<?php echo $l->t('From Time') ?>'; + var missing_field_todate = '<?php echo $l->t('To Date') ?>'; + var missing_field_totime = '<?php echo $l->t('To Time') ?>'; + var missing_field_startsbeforeends = '<?php echo $l->t('The event ends before it starts') ?>'; + var missing_field_dberror = '<?php echo $l->t('There was a database fail') ?>'; + var totalurl = '<?php echo OC_Helper::linkTo('apps/calendar', 'caldav.php', null, true); ?>/calendars'; </script> - <div id="sysbox"></div> <div id="controls"> <div> <form> <div id="view"> - <!-- <input type="button" value="1 <?php echo $l->t('Day');?>" id="onedayview_radio" onclick="Calendar.UI.setCurrentView('onedayview');"/> --> - <input type="button" value="<?php echo $l->t('Week');?>" id="oneweekview_radio" onclick="Calendar.UI.setCurrentView('oneweekview');"/> - <!-- <input type="button" value="4 <?php echo $l->t('Weeks');?>" id="fourweeksview_radio" onclick="Calendar.UI.setCurrentView('fourweeksview');"/> --> - <input type="button" value="<?php echo $l->t('Month');?>" id="onemonthview_radio" onclick="Calendar.UI.setCurrentView('onemonthview');"/> - <input type="button" value="<?php echo $l->t('List');?>" id="listview_radio" onclick="Calendar.UI.setCurrentView('listview');"/> + <input type="button" value="<?php echo $l->t('Week');?>" id="oneweekview_radio"/> + <input type="button" value="<?php echo $l->t('Month');?>" id="onemonthview_radio"/> + <input type="button" value="<?php echo $l->t('List');?>" id="listview_radio"/> </div> </form> <form> <div id="choosecalendar"> - <input type="button" id="today_input" value="<?php echo $l->t("Today");?>" onclick="Calendar.UI.switch2Today();"/> + <input type="button" id="today_input" value="<?php echo $l->t("Today");?>"/> <input type="button" id="choosecalendar_input" value="<?php echo $l->t("Calendars");?>" onclick="Calendar.UI.Calendar.overview();" /> </div> </form> <form> <div id="datecontrol"> - <input type="button" value=" < " id="datecontrol_left" onclick="Calendar.UI.updateDate('backward');"/> - <input id="datecontrol_date" type="button" value=""/> - <input type="button" value=" > " id="datecontrol_right" onclick="Calendar.UI.updateDate('forward');"/> + <input type="button" value=" < " id="datecontrol_left"/> + <span class="button" id="datecontrol_date"></span> + <input type="button" value=" > " id="datecontrol_right"/> </div> </form> </div> </div> + <div id="notification" style="display:none;"></div> <div id="calendar_holder"> - <div id="onedayview"> - <table> - <thead> - <tr> - <th class="calendar_time"><?php echo $l->t("Time");?></th> - <th id="onedayview_today" class="calendar_row" onclick="Calendar.UI.newEvent('#onedayview_today');"></th> - </tr> - </thead> - <tbody> -<?php foreach($hours as $time => $time_label): ?> - <tr> - <td class="calendar_time"><?php echo $time_label ?></td> - <td class="calendar_row <?php echo $time ?>" onclick="Calendar.UI.newEvent('#onedayview_today', '<?php echo $time ?>');"></td> - </tr> -<?php endforeach; ?> - </tbody> - </table> - </div> - <div id="oneweekview"> - <table> - <thead> - <tr> - <th class="calendar_time"><?php echo $l->t("Time");?></th> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <th class="calendar_row <?php echo $weekday ?> <?php echo $weekenddays[$weekday] == "true" ? 'weekend_thead' : '' ?>" onclick="Calendar.UI.newEvent('#oneweekview th.<?php echo $weekday ?>');"></th> -<?php endforeach; ?> - </tr> - </thead> - <tbody> -<?php foreach($hours as $time => $time_label): ?> - <tr> - <td class="calendar_time"><?php echo $time_label?></td> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <td class="<?php echo $weekday ?> <?php echo $time ?> calendar_row <?php echo $weekenddays[$weekday] == "true" ? 'weekend_row' : '' ?>" onclick="Calendar.UI.newEvent('#oneweekview th.<?php echo $weekday ?>', '<?php echo $time ?>');"></td> -<?php endforeach; ?> - </tr> -<?php endforeach; ?> - </tbody> - </table> - </div> - <div id="fourweeksview"> - <table> - <thead> - <tr> - <th class="calendar_row calw"><?php echo $l -> t("Week");?></th> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <th class="calendar_row <?php echo $weekdaynr > 4 ? 'weekend_thead' : '' ?>"><?php echo $l->t(ucfirst($weekday)) ?></th> -<?php endforeach; ?> - </tr> - </thead> - <tbody> -<?php foreach(range(1, 4) as $week): ?> - <tr class="week_<?php echo $week ?>"> - <td class="calw"></td> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <td class="day <?php echo $weekday ?> <?php echo $weekdaynr > 4 ? 'weekend' : '' ?>" onclick="Calendar.UI.newEvent('#fourweeksview .week_<?php echo $week ?> .<?php echo $weekday ?>')"> - <div class="dateinfo"></div> - <div class="events"></div> - </td> -<?php endforeach; ?> - </tr> -<?php endforeach; ?> - </tbody> - </table> - </div> - <div id="onemonthview"> - <table> - <thead> - <tr> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <th class="calendar_row <?php echo $weekenddays[$weekday] == "true" ? 'weekend_thead' : '' ?> <?php echo $weekday ?>"><?php echo $l->t(ucfirst($weekday));?></th> -<?php endforeach; ?> - </tr> - </thead> - <tbody> -<?php foreach(range(1, 6) as $week): ?> - <tr class="week_<?php echo $week ?>"> -<?php foreach($weekdays as $weekdaynr => $weekday): ?> - <td class="day <?php echo $weekday ?> <?php echo $weekenddays[$weekday] == "true" ? 'weekend' : '' ?>" onclick="Calendar.UI.newEvent('#onemonthview .week_<?php echo $week ?> .<?php echo $weekday ?>')"> - <div class="dateinfo"></div> - <div class="events"></div> - </td> -<?php endforeach; ?> - </tr> -<?php endforeach; ?> - </tbody> - </table> - </div> - <div id="listview"> - <div id="more_before"></div> - <div id="events"></div> - <div id="more_after"></div> - </div> </div> <!-- Dialogs --> <div id="dialog_holder"></div> diff --git a/apps/calendar/templates/part.choosecalendar.rowfields.php b/apps/calendar/templates/part.choosecalendar.rowfields.php index db0c71252bb..a789be45a43 100644 --- a/apps/calendar/templates/part.choosecalendar.rowfields.php +++ b/apps/calendar/templates/part.choosecalendar.rowfields.php @@ -1,4 +1,4 @@ <?php echo "<td width=\"20px\"><input id=\"active_" . $_['calendar']["id"] . "\" type=\"checkbox\" onClick=\"Calendar.UI.Calendar.activation(this, " . $_['calendar']["id"] . ")\"" . ($_['calendar']["active"] ? ' checked="checked"' : '') . "></td>"; echo "<td><label for=\"active_" . $_['calendar']["id"] . "\">" . $_['calendar']["displayname"] . "</label></td>"; - echo "<td width=\"20px\"><a href=\"#\" onclick=\"Calendar.UI.showCalDAVUrl('" . OC_User::getUser() . "', '" . $_['calendar']["uri"] . "');\" title=\"" . $l->t("CalDav Link") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/public.svg\"></a></td><td width=\"20px\"><a href=\"export.php?calid=" . $_['calendar']["id"] . "\" title=\"" . $l->t("Download") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/download.svg\"></a></td><td width=\"20px\"><a href=\"#\" title=\"" . $l->t("Edit") . "\" class=\"action\" onclick=\"Calendar.UI.Calendar.edit(this, " . $_['calendar']["id"] . ");\"><img class=\"svg action\" src=\"../../core/img/actions/rename.svg\"></a></td><td width=\"20px\"><a href=\"#\" onclick=\"Calendar.UI.deleteCalendar('" . $_['calendar']["id"] . "');\" title=\"" . $l->t("Delete") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/delete.svg\"></a></td>"; + echo "<td width=\"20px\"><a href=\"#\" onclick=\"Calendar.UI.showCalDAVUrl('" . OC_User::getUser() . "', '" . $_['calendar']["uri"] . "');\" title=\"" . $l->t("CalDav Link") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/public.svg\"></a></td><td width=\"20px\"><a href=\"export.php?calid=" . $_['calendar']["id"] . "\" title=\"" . $l->t("Download") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/download.svg\"></a></td><td width=\"20px\"><a href=\"#\" title=\"" . $l->t("Edit") . "\" class=\"action\" onclick=\"Calendar.UI.Calendar.edit(this, " . $_['calendar']["id"] . ");\"><img class=\"svg action\" src=\"../../core/img/actions/rename.svg\"></a></td><td width=\"20px\"><a href=\"#\" onclick=\"Calendar.UI.Calendar.deleteCalendar('" . $_['calendar']["id"] . "');\" title=\"" . $l->t("Delete") . "\" class=\"action\"><img class=\"svg action\" src=\"../../core/img/actions/delete.svg\"></a></td>"; diff --git a/apps/calendar/templates/part.editevent.php b/apps/calendar/templates/part.editevent.php index ae969f2dc3b..b3acfc4a072 100644 --- a/apps/calendar/templates/part.editevent.php +++ b/apps/calendar/templates/part.editevent.php @@ -1,6 +1,7 @@ <div id="event" title="<?php echo $l->t("Edit an event");?>"> <form id="event_form"> <input type="hidden" name="id" value="<?php echo $_['id'] ?>"> + <input type="hidden" name="lastmodified" value="<?php echo $_['lastmodified'] ?>"> <?php echo $this->inc("part.eventform"); ?> <div style="width: 100%;text-align: center;color: #FF1D1D;" id="errorbox"></div> <span id="actions"> |