aboutsummaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorBart Visscher <bartv@thisnet.nl>2011-11-23 21:08:26 +0100
committerBart Visscher <bartv@thisnet.nl>2011-11-23 21:08:26 +0100
commitbae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb (patch)
treef077558d240d660abb4c75e0e5ef2848b9585107 /apps
parent5e037bfd5458436e8f6d83d4fe53f62b53cd8ae9 (diff)
parentee549dfb3802e98156e96a4cf549854b9d4f791a (diff)
downloadnextcloud-server-bae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb.tar.gz
nextcloud-server-bae6c1167cbe47280c24d8aa9ad7ee048c8ab4eb.zip
Merge branch 'fullcalendar'
Diffstat (limited to 'apps')
-rw-r--r--apps/calendar/ajax/activation.php7
-rw-r--r--apps/calendar/ajax/changeview.php5
-rw-r--r--apps/calendar/ajax/createcalendar.php5
-rw-r--r--apps/calendar/ajax/editevent.php9
-rw-r--r--apps/calendar/ajax/editeventform.php9
-rw-r--r--apps/calendar/ajax/events.php84
-rw-r--r--apps/calendar/ajax/getcal.php70
-rwxr-xr-xapps/calendar/ajax/guesstimezone.php39
-rw-r--r--apps/calendar/ajax/moveevent.php118
-rw-r--r--apps/calendar/ajax/neweventform.php52
-rw-r--r--apps/calendar/ajax/resizeevent.php49
-rw-r--r--apps/calendar/ajax/updatecalendar.php5
-rw-r--r--apps/calendar/appinfo/app.php2
-rw-r--r--apps/calendar/css/style.css83
-rw-r--r--apps/calendar/index.php39
-rw-r--r--apps/calendar/js/calendar.js1123
-rwxr-xr-xapps/calendar/js/geo.js20
-rw-r--r--apps/calendar/l10n/xgettextfiles10
-rw-r--r--apps/calendar/lib/calendar.php8
-rw-r--r--apps/calendar/lib/object.php37
-rw-r--r--apps/calendar/lib/search.php26
-rwxr-xr-x[-rw-r--r--]apps/calendar/templates/calendar.php223
-rw-r--r--apps/calendar/templates/part.choosecalendar.rowfields.php2
-rw-r--r--apps/calendar/templates/part.editevent.php1
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>&nbsp;</td>' +
+ '<td class="fc-list-time">' +
+ time +
+ '</td>' +
+ '<td>&nbsp;</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="&nbsp;&lt;&nbsp;" id="datecontrol_left" onclick="Calendar.UI.updateDate('backward');"/>
- <input id="datecontrol_date" type="button" value=""/>
- <input type="button" value="&nbsp;&gt;&nbsp;" id="datecontrol_right" onclick="Calendar.UI.updateDate('forward');"/>
+ <input type="button" value="&nbsp;&lt;&nbsp;" id="datecontrol_left"/>
+ <span class="button" id="datecontrol_date"></span>
+ <input type="button" value="&nbsp;&gt;&nbsp;" 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">