diff --git a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php
index 4bcd32cdf8..8f674840e8 100755
--- a/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php
+++ b/3rdparty/Sabre/CalDAV/CalendarQueryValidator.php
@@ -304,28 +304,29 @@ class Sabre_CalDAV_CalendarQueryValidator {
// one is the first to trigger. Based on this, we can
// determine if we can 'give up' expanding events.
$firstAlarm = null;
- foreach($expandedEvent->VALARM as $expandedAlarm) {
+ if ($expandedEvent->VALARM !== null) {
+ foreach($expandedEvent->VALARM as $expandedAlarm) {
- $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime();
- if ($expandedAlarm->isInTimeRange($start, $end)) {
- return true;
- }
+ $effectiveTrigger = $expandedAlarm->getEffectiveTriggerTime();
+ if ($expandedAlarm->isInTimeRange($start, $end)) {
+ return true;
+ }
- if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') {
- // This is an alarm with a non-relative trigger
- // time, likely created by a buggy client. The
- // implication is that every alarm in this
- // recurring event trigger at the exact same
- // time. It doesn't make sense to traverse
- // further.
- } else {
- // We store the first alarm as a means to
- // figure out when we can stop traversing.
- if (!$firstAlarm || $effectiveTrigger < $firstAlarm) {
- $firstAlarm = $effectiveTrigger;
+ if ((string)$expandedAlarm->TRIGGER['VALUE'] === 'DATE-TIME') {
+ // This is an alarm with a non-relative trigger
+ // time, likely created by a buggy client. The
+ // implication is that every alarm in this
+ // recurring event trigger at the exact same
+ // time. It doesn't make sense to traverse
+ // further.
+ } else {
+ // We store the first alarm as a means to
+ // figure out when we can stop traversing.
+ if (!$firstAlarm || $effectiveTrigger < $firstAlarm) {
+ $firstAlarm = $effectiveTrigger;
+ }
}
}
-
}
if (is_null($firstAlarm)) {
// No alarm was found.
diff --git a/3rdparty/Sabre/CalDAV/Plugin.php b/3rdparty/Sabre/CalDAV/Plugin.php
index 5903968c00..c56ab38484 100755
--- a/3rdparty/Sabre/CalDAV/Plugin.php
+++ b/3rdparty/Sabre/CalDAV/Plugin.php
@@ -49,23 +49,23 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
/**
* The email handler for invites and other scheduling messages.
- *
- * @var Sabre_CalDAV_Schedule_IMip
+ *
+ * @var Sabre_CalDAV_Schedule_IMip
*/
protected $imipHandler;
/**
* Sets the iMIP handler.
*
- * iMIP = The email transport of iCalendar scheduling messages. Setting
- * this is optional, but if you want the server to allow invites to be sent
+ * iMIP = The email transport of iCalendar scheduling messages. Setting
+ * this is optional, but if you want the server to allow invites to be sent
* out, you must set a handler.
*
- * Specifically iCal will plain assume that the server supports this. If
- * the server doesn't, iCal will display errors when inviting people to
+ * Specifically iCal will plain assume that the server supports this. If
+ * the server doesn't, iCal will display errors when inviting people to
* events.
*
- * @param Sabre_CalDAV_Schedule_IMip $imipHandler
+ * @param Sabre_CalDAV_Schedule_IMip $imipHandler
* @return void
*/
public function setIMipHandler(Sabre_CalDAV_Schedule_IMip $imipHandler) {
@@ -723,12 +723,12 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
if (!$originator) {
throw new Sabre_DAV_Exception_BadRequest('The Originator: header must be specified when making POST requests');
- }
+ }
if (!$recipients) {
throw new Sabre_DAV_Exception_BadRequest('The Recipient: header must be specified when making POST requests');
- }
+ }
- if (!preg_match('/^mailto:(.*)@(.*)$/', $originator)) {
+ if (!preg_match('/^mailto:(.*)@(.*)$/i', $originator)) {
throw new Sabre_DAV_Exception_BadRequest('Originator must start with mailto: and must be valid email address');
}
$originator = substr($originator,7);
@@ -737,14 +737,14 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
foreach($recipients as $k=>$recipient) {
$recipient = trim($recipient);
- if (!preg_match('/^mailto:(.*)@(.*)$/', $recipient)) {
+ if (!preg_match('/^mailto:(.*)@(.*)$/i', $recipient)) {
throw new Sabre_DAV_Exception_BadRequest('Recipients must start with mailto: and must be valid email address');
}
$recipient = substr($recipient, 7);
$recipients[$k] = $recipient;
}
- // We need to make sure that 'originator' matches one of the email
+ // We need to make sure that 'originator' matches one of the email
// addresses of the selected principal.
$principal = $outboxNode->getOwner();
$props = $this->server->getProperties($principal,array(
@@ -760,7 +760,7 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
throw new Sabre_DAV_Exception_Forbidden('The addresses specified in the Originator header did not match any addresses in the owners calendar-user-address-set header');
}
- try {
+ try {
$vObject = Sabre_VObject_Reader::read($this->server->httpRequest->getBody(true));
} catch (Sabre_VObject_ParseException $e) {
throw new Sabre_DAV_Exception_BadRequest('The request body must be a valid iCalendar object. Parse error: ' . $e->getMessage());
@@ -785,9 +785,10 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
}
if (in_array($method, array('REQUEST','REPLY','ADD','CANCEL')) && $componentType==='VEVENT') {
- $this->iMIPMessage($originator, $recipients, $vObject);
+ $result = $this->iMIPMessage($originator, $recipients, $vObject);
$this->server->httpResponse->sendStatus(200);
- $this->server->httpResponse->sendBody('Messages sent');
+ $this->server->httpResponse->setHeader('Content-Type','application/xml');
+ $this->server->httpResponse->sendBody($this->generateScheduleResponse($result));
} else {
throw new Sabre_DAV_Exception_NotImplemented('This iTIP method is currently not implemented');
}
@@ -796,18 +797,83 @@ class Sabre_CalDAV_Plugin extends Sabre_DAV_ServerPlugin {
/**
* Sends an iMIP message by email.
- *
- * @param string $originator
- * @param array $recipients
- * @param Sabre_VObject_Component $vObject
- * @return void
+ *
+ * This method must return an array with status codes per recipient.
+ * This should look something like:
+ *
+ * array(
+ * 'user1@example.org' => '2.0;Success'
+ * )
+ *
+ * Formatting for this status code can be found at:
+ * https://tools.ietf.org/html/rfc5545#section-3.8.8.3
+ *
+ * A list of valid status codes can be found at:
+ * https://tools.ietf.org/html/rfc5546#section-3.6
+ *
+ * @param string $originator
+ * @param array $recipients
+ * @param Sabre_VObject_Component $vObject
+ * @return array
*/
protected function iMIPMessage($originator, array $recipients, Sabre_VObject_Component $vObject) {
if (!$this->imipHandler) {
- throw new Sabre_DAV_Exception_NotImplemented('No iMIP handler is setup on this server.');
+ $resultStatus = '5.2;This server does not support this operation';
+ } else {
+ $this->imipHandler->sendMessage($originator, $recipients, $vObject);
+ $resultStatus = '2.0;Success';
}
- $this->imipHandler->sendMessage($originator, $recipients, $vObject);
+
+ $result = array();
+ foreach($recipients as $recipient) {
+ $result[$recipient] = $resultStatus;
+ }
+
+ return $result;
+
+
+ }
+
+ /**
+ * Generates a schedule-response XML body
+ *
+ * The recipients array is a key->value list, containing email addresses
+ * and iTip status codes. See the iMIPMessage method for a description of
+ * the value.
+ *
+ * @param array $recipients
+ * @return string
+ */
+ public function generateScheduleResponse(array $recipients) {
+
+ $dom = new DOMDocument('1.0','utf-8');
+ $dom->formatOutput = true;
+ $xscheduleResponse = $dom->createElement('cal:schedule-response');
+ $dom->appendChild($xscheduleResponse);
+
+ foreach($this->server->xmlNamespaces as $namespace=>$prefix) {
+
+ $xscheduleResponse->setAttribute('xmlns:' . $prefix, $namespace);
+
+ }
+
+ foreach($recipients as $recipient=>$status) {
+ $xresponse = $dom->createElement('cal:response');
+
+ $xrecipient = $dom->createElement('cal:recipient');
+ $xrecipient->appendChild($dom->createTextNode($recipient));
+ $xresponse->appendChild($xrecipient);
+
+ $xrequestStatus = $dom->createElement('cal:request-status');
+ $xrequestStatus->appendChild($dom->createTextNode($status));
+ $xresponse->appendChild($xrequestStatus);
+
+ $xscheduleResponse->appendChild($xresponse);
+
+ }
+
+ return $dom->saveXML();
}
diff --git a/3rdparty/Sabre/CalDAV/Version.php b/3rdparty/Sabre/CalDAV/Version.php
index 289a0c83a3..ace9901c08 100755
--- a/3rdparty/Sabre/CalDAV/Version.php
+++ b/3rdparty/Sabre/CalDAV/Version.php
@@ -14,7 +14,7 @@ class Sabre_CalDAV_Version {
/**
* Full version number
*/
- const VERSION = '1.6.3';
+ const VERSION = '1.6.4';
/**
* Stability : alpha, beta, stable
diff --git a/3rdparty/Sabre/CardDAV/Plugin.php b/3rdparty/Sabre/CardDAV/Plugin.php
index ca20e46849..96def6dd96 100755
--- a/3rdparty/Sabre/CardDAV/Plugin.php
+++ b/3rdparty/Sabre/CardDAV/Plugin.php
@@ -154,7 +154,10 @@ class Sabre_CardDAV_Plugin extends Sabre_DAV_ServerPlugin {
$val = stream_get_contents($val);
// Taking out \r to not screw up the xml output
- $returnedProperties[200][$addressDataProp] = str_replace("\r","", $val);
+ //$returnedProperties[200][$addressDataProp] = str_replace("\r","", $val);
+ // The stripping of \r breaks the Mail App in OSX Mountain Lion
+ // this is fixed in master, but not backported. /Tanghus
+ $returnedProperties[200][$addressDataProp] = $val;
}
}
diff --git a/3rdparty/Sabre/DAV/Locks/Plugin.php b/3rdparty/Sabre/DAV/Locks/Plugin.php
index fd956950b8..035b3a6386 100755
--- a/3rdparty/Sabre/DAV/Locks/Plugin.php
+++ b/3rdparty/Sabre/DAV/Locks/Plugin.php
@@ -292,7 +292,10 @@ class Sabre_DAV_Locks_Plugin extends Sabre_DAV_ServerPlugin {
$this->server->tree->getNodeForPath($uri);
// We need to call the beforeWriteContent event for RFC3744
- $this->server->broadcastEvent('beforeWriteContent',array($uri));
+ // Edit: looks like this is not used, and causing problems now.
+ //
+ // See Issue 222
+ // $this->server->broadcastEvent('beforeWriteContent',array($uri));
} catch (Sabre_DAV_Exception_NotFound $e) {
diff --git a/3rdparty/Sabre/DAV/Version.php b/3rdparty/Sabre/DAV/Version.php
index 40cfe81b34..274646240a 100755
--- a/3rdparty/Sabre/DAV/Version.php
+++ b/3rdparty/Sabre/DAV/Version.php
@@ -14,7 +14,7 @@ class Sabre_DAV_Version {
/**
* Full version number
*/
- const VERSION = '1.6.3';
+ const VERSION = '1.6.4';
/**
* Stability : alpha, beta, stable
diff --git a/3rdparty/Sabre/HTTP/BasicAuth.php b/3rdparty/Sabre/HTTP/BasicAuth.php
index a747cc6a31..f90ed24f5d 100755
--- a/3rdparty/Sabre/HTTP/BasicAuth.php
+++ b/3rdparty/Sabre/HTTP/BasicAuth.php
@@ -46,7 +46,7 @@ class Sabre_HTTP_BasicAuth extends Sabre_HTTP_AbstractAuth {
if (strpos(strtolower($auth),'basic')!==0) return false;
- return explode(':', base64_decode(substr($auth, 6)));
+ return explode(':', base64_decode(substr($auth, 6)),2);
}
diff --git a/3rdparty/Sabre/HTTP/Version.php b/3rdparty/Sabre/HTTP/Version.php
index 23dc7f8a7a..e6b4f7e535 100755
--- a/3rdparty/Sabre/HTTP/Version.php
+++ b/3rdparty/Sabre/HTTP/Version.php
@@ -14,7 +14,7 @@ class Sabre_HTTP_Version {
/**
* Full version number
*/
- const VERSION = '1.6.2';
+ const VERSION = '1.6.4';
/**
* Stability : alpha, beta, stable
diff --git a/3rdparty/Sabre/VObject/Component/VEvent.php b/3rdparty/Sabre/VObject/Component/VEvent.php
index 4cc1e36d7d..d6b910874d 100755
--- a/3rdparty/Sabre/VObject/Component/VEvent.php
+++ b/3rdparty/Sabre/VObject/Component/VEvent.php
@@ -42,14 +42,15 @@ class Sabre_VObject_Component_VEvent extends Sabre_VObject_Component {
$effectiveStart = $this->DTSTART->getDateTime();
if (isset($this->DTEND)) {
+
+ // The DTEND property is considered non inclusive. So for a 3 day
+ // event in july, dtstart and dtend would have to be July 1st and
+ // July 4th respectively.
+ //
+ // See:
+ // http://tools.ietf.org/html/rfc5545#page-54
$effectiveEnd = $this->DTEND->getDateTime();
- // If this was an all-day event, we should just increase the
- // end-date by 1. Otherwise the event will last until the second
- // the date changed, by increasing this by 1 day the event lasts
- // all of the last day as well.
- if ($this->DTSTART->getDateType() == Sabre_VObject_Element_DateTime::DATE) {
- $effectiveEnd->modify('+1 day');
- }
+
} elseif (isset($this->DURATION)) {
$effectiveEnd = clone $effectiveStart;
$effectiveEnd->add( Sabre_VObject_DateTimeParser::parseDuration($this->DURATION) );
diff --git a/3rdparty/Sabre/VObject/RecurrenceIterator.php b/3rdparty/Sabre/VObject/RecurrenceIterator.php
index 833aa091ab..740270dd8f 100755
--- a/3rdparty/Sabre/VObject/RecurrenceIterator.php
+++ b/3rdparty/Sabre/VObject/RecurrenceIterator.php
@@ -337,6 +337,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator {
$this->endDate = clone $this->startDate;
if (isset($this->baseEvent->DURATION)) {
$this->endDate->add(Sabre_VObject_DateTimeParser::parse($this->baseEvent->DURATION->value));
+ } elseif ($this->baseEvent->DTSTART->getDateType()===Sabre_VObject_Property_DateTime::DATE) {
+ $this->endDate->modify('+1 day');
}
}
$this->currentDate = clone $this->startDate;
@@ -561,7 +563,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator {
*/
public function fastForward(DateTime $dt) {
- while($this->valid() && $this->getDTEnd() < $dt) {
+ while($this->valid() && $this->getDTEnd() <= $dt) {
$this->next();
}
@@ -823,9 +825,40 @@ class Sabre_VObject_RecurrenceIterator implements Iterator {
*/
protected function nextYearly() {
+ $currentMonth = $this->currentDate->format('n');
+ $currentYear = $this->currentDate->format('Y');
+ $currentDayOfMonth = $this->currentDate->format('j');
+
+ // No sub-rules, so we just advance by year
if (!$this->byMonth) {
+
+ // Unless it was a leap day!
+ if ($currentMonth==2 && $currentDayOfMonth==29) {
+
+ $counter = 0;
+ do {
+ $counter++;
+ // Here we increase the year count by the interval, until
+ // we hit a date that's also in a leap year.
+ //
+ // We could just find the next interval that's dividable by
+ // 4, but that would ignore the rule that there's no leap
+ // year every year that's dividable by a 100, but not by
+ // 400. (1800, 1900, 2100). So we just rely on the datetime
+ // functions instead.
+ $nextDate = clone $this->currentDate;
+ $nextDate->modify('+ ' . ($this->interval*$counter) . ' years');
+ } while ($nextDate->format('n')!=2);
+ $this->currentDate = $nextDate;
+
+ return;
+
+ }
+
+ // The easiest form
$this->currentDate->modify('+' . $this->interval . ' years');
return;
+
}
$currentMonth = $this->currentDate->format('n');
@@ -877,8 +910,8 @@ class Sabre_VObject_RecurrenceIterator implements Iterator {
} else {
- // no byDay or byMonthDay, so we can just loop through the
- // months.
+ // These are the 'byMonth' rules, if there are no byDay or
+ // byMonthDay sub-rules.
do {
$currentMonth++;
@@ -888,6 +921,7 @@ class Sabre_VObject_RecurrenceIterator implements Iterator {
}
} while (!in_array($currentMonth, $this->byMonth));
$this->currentDate->setDate($currentYear, $currentMonth, $currentDayOfMonth);
+
return;
}
diff --git a/3rdparty/Sabre/VObject/Version.php b/3rdparty/Sabre/VObject/Version.php
index 2617c7b129..9ee03d8711 100755
--- a/3rdparty/Sabre/VObject/Version.php
+++ b/3rdparty/Sabre/VObject/Version.php
@@ -14,7 +14,7 @@ class Sabre_VObject_Version {
/**
* Full version number
*/
- const VERSION = '1.3.3';
+ const VERSION = '1.3.4';
/**
* Stability : alpha, beta, stable
diff --git a/apps/admin_audit/appinfo/info.xml b/apps/admin_audit/appinfo/info.xml
index 6eb62fbbd1..4fa013162f 100644
--- a/apps/admin_audit/appinfo/info.xml
+++ b/apps/admin_audit/appinfo/info.xml
@@ -5,6 +5,7 @@
" => "Бутон за отметки
"
+);
diff --git a/apps/bookmarks/l10n/ca.php b/apps/bookmarks/l10n/ca.php
new file mode 100644
index 0000000000..cf90d9a887
--- /dev/null
+++ b/apps/bookmarks/l10n/ca.php
@@ -0,0 +1,12 @@
+ "Adreces d'interès",
+"unnamed" => "sense nom",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrossegueu-ho al navegador i feu-hi un clic quan volgueu marcar ràpidament una adreça d'interès:",
+"Read later" => "Llegeix més tard",
+"Address" => "Adreça",
+"Title" => "Títol",
+"Tags" => "Etiquetes",
+"Save bookmark" => "Desa l'adreça d'interès",
+"You have no bookmarks" => "No teniu adreces d'interès",
+"Bookmarklet
" => "Bookmarklet
"
+);
diff --git a/apps/bookmarks/l10n/de.php b/apps/bookmarks/l10n/de.php
new file mode 100644
index 0000000000..9e0f137382
--- /dev/null
+++ b/apps/bookmarks/l10n/de.php
@@ -0,0 +1,12 @@
+ "Lesezeichen",
+"unnamed" => "unbenannt",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ziehe dies zu deinen Browser-Lesezeichen und klicke es, wenn du eine Website schnell den Lesezeichen hinzufügen willst.",
+"Read later" => "Später lesen",
+"Address" => "Adresse",
+"Title" => "Title",
+"Tags" => "Tags",
+"Save bookmark" => "Lesezeichen speichern",
+"You have no bookmarks" => "Du hast keine Lesezeichen",
+"Bookmarklet
" => "Bookmarklet
"
+);
diff --git a/apps/bookmarks/l10n/el.php b/apps/bookmarks/l10n/el.php
new file mode 100644
index 0000000000..f282a1bbf8
--- /dev/null
+++ b/apps/bookmarks/l10n/el.php
@@ -0,0 +1,12 @@
+ "Σελιδοδείκτες",
+"unnamed" => "ανώνυμο",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Σύρετε αυτό στους σελιδοδείκτες του περιηγητή σας και κάντε κλικ επάνω του, όταν θέλετε να προσθέσετε σύντομα μια ιστοσελίδα ως σελιδοδείκτη:",
+"Read later" => "Ανάγνωση αργότερα",
+"Address" => "Διεύθυνση",
+"Title" => "Τίτλος",
+"Tags" => "Ετικέτες",
+"Save bookmark" => "Αποθήκευση σελιδοδείκτη",
+"You have no bookmarks" => "Δεν έχετε σελιδοδείκτες",
+"Bookmarklet
" => "Εφαρμογίδιο Σελιδοδεικτών
"
+);
diff --git a/apps/bookmarks/l10n/eo.php b/apps/bookmarks/l10n/eo.php
new file mode 100644
index 0000000000..808cda8a04
--- /dev/null
+++ b/apps/bookmarks/l10n/eo.php
@@ -0,0 +1,11 @@
+ "Legosignoj",
+"unnamed" => "nenomita",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Ŝovu tion ĉi al la legosignoj de via TTT-legilo kaj klaku ĝin, se vi volas rapide legosignigi TTT-paĝon:",
+"Read later" => "Legi poste",
+"Address" => "Adreso",
+"Title" => "Titolo",
+"Tags" => "Etikedoj",
+"Save bookmark" => "Konservi legosignon",
+"You have no bookmarks" => "Vi havas neniun legosignon"
+);
diff --git a/apps/bookmarks/l10n/es.php b/apps/bookmarks/l10n/es.php
new file mode 100644
index 0000000000..071b0dda70
--- /dev/null
+++ b/apps/bookmarks/l10n/es.php
@@ -0,0 +1,12 @@
+ "Marcadores",
+"unnamed" => "sin nombre",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Arrastra desde aquí a los marcadores de tu navegador, y haz clic cuando quieras marcar una página web rápidamente:",
+"Read later" => "Leer después",
+"Address" => "Dirección",
+"Title" => "Título",
+"Tags" => "Etiquetas",
+"Save bookmark" => "Guardar marcador",
+"You have no bookmarks" => "No tienes marcadores",
+"Bookmarklet
" => "Bookmarklet
"
+);
diff --git a/apps/bookmarks/l10n/et_EE.php b/apps/bookmarks/l10n/et_EE.php
new file mode 100644
index 0000000000..da9e4d92a6
--- /dev/null
+++ b/apps/bookmarks/l10n/et_EE.php
@@ -0,0 +1,10 @@
+ "Järjehoidjad",
+"unnamed" => "nimetu",
+"Read later" => "Loe hiljem",
+"Address" => "Aadress",
+"Title" => "Pealkiri",
+"Tags" => "Sildid",
+"Save bookmark" => "Salvesta järjehoidja",
+"You have no bookmarks" => "Sul pole järjehoidjaid"
+);
diff --git a/apps/bookmarks/l10n/fi_FI.php b/apps/bookmarks/l10n/fi_FI.php
new file mode 100644
index 0000000000..c814747411
--- /dev/null
+++ b/apps/bookmarks/l10n/fi_FI.php
@@ -0,0 +1,12 @@
+ "Kirjanmerkit",
+"unnamed" => "nimetön",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Vedä tämä selaimesi kirjanmerkkipalkkiin ja napsauta sitä, kun haluat lisätä kirjanmerkin nopeasti:",
+"Read later" => "Lue myöhemmin",
+"Address" => "Osoite",
+"Title" => "Otsikko",
+"Tags" => "Tunnisteet",
+"Save bookmark" => "Tallenna kirjanmerkki",
+"You have no bookmarks" => "Sinulla ei ole kirjanmerkkejä",
+"Bookmarklet
" => "Kirjanmerkitsin
"
+);
diff --git a/apps/bookmarks/l10n/fr.php b/apps/bookmarks/l10n/fr.php
new file mode 100644
index 0000000000..508c82369f
--- /dev/null
+++ b/apps/bookmarks/l10n/fr.php
@@ -0,0 +1,12 @@
+ "Favoris",
+"unnamed" => "sans titre",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Glissez ceci dans les favoris de votre navigateur, et cliquer dessus lorsque vous souhaitez ajouter la page en cours à vos marques-pages :",
+"Read later" => "Lire plus tard",
+"Address" => "Adresse",
+"Title" => "Titre",
+"Tags" => "Étiquettes",
+"Save bookmark" => "Sauvegarder le favori",
+"You have no bookmarks" => "Vous n'avez aucun favori",
+"Bookmarklet
" => "Gestionnaire de favoris
"
+);
diff --git a/apps/bookmarks/l10n/it.php b/apps/bookmarks/l10n/it.php
new file mode 100644
index 0000000000..862d75bde4
--- /dev/null
+++ b/apps/bookmarks/l10n/it.php
@@ -0,0 +1,12 @@
+ "Segnalibri",
+"unnamed" => "senza nome",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Quando vuoi creare rapidamente un segnalibro, trascinalo sui segnalibri del browser e fai clic su di esso:",
+"Read later" => "Leggi dopo",
+"Address" => "Indirizzo",
+"Title" => "Titolo",
+"Tags" => "Tag",
+"Save bookmark" => "Salva segnalibro",
+"You have no bookmarks" => "Non hai segnalibri",
+"Bookmarklet
" => "Bookmarklet
"
+);
diff --git a/apps/bookmarks/l10n/sl.php b/apps/bookmarks/l10n/sl.php
new file mode 100644
index 0000000000..32a4162908
--- /dev/null
+++ b/apps/bookmarks/l10n/sl.php
@@ -0,0 +1,12 @@
+ "Zaznamki",
+"unnamed" => "neimenovano",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Povlecite to povezavo med zaznamke v vašem brskalniku in jo, ko želite ustvariti zaznamek trenutne strani, preprosto kliknite:",
+"Read later" => "Preberi kasneje",
+"Address" => "Naslov",
+"Title" => "Ime",
+"Tags" => "Oznake",
+"Save bookmark" => "Shrani zaznamek",
+"You have no bookmarks" => "Nimate zaznamkov",
+"Bookmarklet
" => "Bookmarklet
"
+);
diff --git a/apps/bookmarks/l10n/sv.php b/apps/bookmarks/l10n/sv.php
new file mode 100644
index 0000000000..689bd452f1
--- /dev/null
+++ b/apps/bookmarks/l10n/sv.php
@@ -0,0 +1,12 @@
+ "Bokmärken",
+"unnamed" => "namnlös",
+"Drag this to your browser bookmarks and click it, when you want to bookmark a webpage quickly:" => "Dra till din webbläsares bokmärken och klicka på det när du vill bokmärka en webbsida snabbt:",
+"Read later" => "Läs senare",
+"Address" => "Adress",
+"Title" => "Titel",
+"Tags" => "Taggar",
+"Save bookmark" => "Spara bokmärke",
+"You have no bookmarks" => "Du har inga bokmärken",
+"Bookmarklet
" => "Skriptbokmärke
"
+);
diff --git a/apps/calendar/ajax/calendar/overview.php b/apps/calendar/ajax/calendar/overview.php
index 9d43364ffb..1d8e49ea5f 100644
--- a/apps/calendar/ajax/calendar/overview.php
+++ b/apps/calendar/ajax/calendar/overview.php
@@ -4,9 +4,7 @@
* This file is licensed under the Affero General Public License version 3 or
* later.
* See the COPYING-README file.
- */
-
-
+ */
$l10n = OC_L10N::get('calendar');
OCP\JSON::checkLoggedIn();
OCP\JSON::checkAppEnabled('calendar');
diff --git a/apps/calendar/appinfo/app.php b/apps/calendar/appinfo/app.php
index 4fdba29126..5c05c57bca 100644
--- a/apps/calendar/appinfo/app.php
+++ b/apps/calendar/appinfo/app.php
@@ -33,5 +33,4 @@ OCP\App::addNavigationEntry( array(
'href' => OCP\Util::linkTo( 'calendar', 'index.php' ),
'icon' => OCP\Util::imagePath( 'calendar', 'icon.svg' ),
'name' => $l->t('Calendar')));
-OCP\App::registerPersonal('calendar', 'settings');
OC_Search::registerProvider('OC_Search_Provider_Calendar');
diff --git a/apps/calendar/appinfo/remote.php b/apps/calendar/appinfo/remote.php
index e8f9e80c7a..6669d7ce2c 100644
--- a/apps/calendar/appinfo/remote.php
+++ b/apps/calendar/appinfo/remote.php
@@ -21,10 +21,13 @@ $principalBackend = new OC_Connector_Sabre_Principal();
$caldavBackend = new OC_Connector_Sabre_CalDAV();
// Root nodes
-$nodes = array(
- new Sabre_CalDAV_Principal_Collection($principalBackend),
+$collection = new Sabre_CalDAV_Principal_Collection($principalBackend);
+$collection->disableListing = true; // Disable listening
+
+$nodes = array(
+ $collection,
new Sabre_CalDAV_CalendarRootNode($principalBackend, $caldavBackend),
-);
+ );
// Fire up server
$server = new Sabre_DAV_Server($nodes);
@@ -35,5 +38,6 @@ $server->addPlugin(new Sabre_CalDAV_Plugin());
$server->addPlugin(new Sabre_DAVACL_Plugin());
$server->addPlugin(new Sabre_DAV_Browser_Plugin(false)); // Show something in the Browser, but no upload
$server->addPlugin(new Sabre_CalDAV_ICSExportPlugin());
+
// And off we go!
$server->exec();
diff --git a/apps/calendar/calendar.php b/apps/calendar/calendar.php
new file mode 100644
index 0000000000..2c0bee9d23
--- /dev/null
+++ b/apps/calendar/calendar.php
@@ -0,0 +1,12 @@
+
+ * This file is licensed under the Affero General Public License version 3 or
+ * later.
+ * See the COPYING-README file.
+ */
+$l10n = OC_L10N::get('calendar');
+OCP\JSON::checkLoggedIn();
+OCP\JSON::checkAppEnabled('calendar');
+$tmpl = new OCP\Template('calendar', 'part.choosecalendar');
+$tmpl->printpage();
\ No newline at end of file
diff --git a/apps/calendar/css/style.css b/apps/calendar/css/style.css
index 373a456563..5cda4b1bef 100644
--- a/apps/calendar/css/style.css
+++ b/apps/calendar/css/style.css
@@ -19,7 +19,7 @@
#loading { display: none;margin: 0;padding:0;margin-top:5px;}
-#calendar_holder {position: relative;bottom: 0; right: 0; left: 0; top: 3em;}
+#fullcalendar {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;}
@@ -133,3 +133,12 @@ padding:0 8px 2px;
line-height:1.2;
margin-bottom:4px;
}
+
+#choosecalendar a.settings{
+ margin-top: 25px;
+ margin-right: 10px;
+}
+
+#fullcalendar{
+ overflow: scroll;
+}
\ No newline at end of file
diff --git a/apps/calendar/index.php b/apps/calendar/index.php
index 4b87119592..a8ad4ab335 100644
--- a/apps/calendar/index.php
+++ b/apps/calendar/index.php
@@ -5,8 +5,6 @@
* later.
* See the COPYING-README file.
*/
-
-
OCP\User::checkLoggedIn();
OCP\App::checkAppEnabled('calendar');
@@ -24,8 +22,17 @@ foreach($calendars as $calendar){
}
}
-$eventSources[] = array('url' => '?app=calendar&getfile=ajax/events.php?calendar_id=shared_rw', 'backgroundColor' => '#1D2D44', 'borderColor' => '#888', 'textColor' => 'white', 'editable'=>'true');
-$eventSources[] = array('url' => '?app=calendar&getfile=ajax/events.php?calendar_id=shared_r', 'backgroundColor' => '#1D2D44', 'borderColor' => '#888', 'textColor' => 'white', 'editable' => 'false');
+$events_baseURL = OCP\Util::linkTo('calendar', 'ajax/events.php');
+$eventSources[] = array('url' => $events_baseURL.'?calendar_id=shared_rw',
+ 'backgroundColor' => '#1D2D44',
+ 'borderColor' => '#888',
+ 'textColor' => 'white',
+ 'editable'=>'true');
+$eventSources[] = array('url' => $events_baseURL.'?calendar_id=shared_r',
+ 'backgroundColor' => '#1D2D44',
+ 'borderColor' => '#888',
+ 'textColor' => 'white',
+ 'editable' => 'false');
OCP\Util::emitHook('OC_Calendar', 'getSources', array('sources' => &$eventSources));
$categories = OC_Calendar_App::getCategoryOptions();
diff --git a/apps/calendar/js/calendar.js b/apps/calendar/js/calendar.js
index 25311fa0df..23846c89b8 100644
--- a/apps/calendar/js/calendar.js
+++ b/apps/calendar/js/calendar.js
@@ -18,7 +18,7 @@ Calendar={
startEventDialog:function(){
Calendar.UI.loading(false);
$('.tipsy').remove();
- $('#calendar_holder').fullCalendar('unselect');
+ $('#fullcalendar').fullCalendar('unselect');
Calendar.UI.lockTime();
$( "#from" ).datepicker({
dateFormat : 'dd-mm-yy'
@@ -88,7 +88,7 @@ Calendar={
$.post(url, post, function(data){
Calendar.UI.loading(false);
if(data.status == 'success'){
- $('#calendar_holder').fullCalendar('removeEvents', $('#event_form input[name=id]').val());
+ $('#fullcalendar').fullCalendar('removeEvents', $('#event_form input[name=id]').val());
$('#event').dialog('destroy').remove();
} else {
$('#errorbox').html(t('calendar', 'Deletion failed'));
@@ -133,7 +133,7 @@ Calendar={
} else
if(data.status == 'success'){
$('#event').dialog('destroy').remove();
- $('#calendar_holder').fullCalendar('refetchEvents');
+ $('#fullcalendar').fullCalendar('refetchEvents');
}
},"json");
},
@@ -148,7 +148,7 @@ Calendar={
console.log("Event moved successfully");
}else{
revertFunc();
- $('#calendar_holder').fullCalendar('refetchEvents');
+ $('#fullcalendar').fullCalendar('refetchEvents');
}
});
},
@@ -163,7 +163,7 @@ Calendar={
console.log("Event resized successfully");
}else{
revertFunc();
- $('#calendar_holder').fullCalendar('refetchEvents');
+ $('#fullcalendar').fullCalendar('refetchEvents');
}
});
},
@@ -239,11 +239,11 @@ Calendar={
doc_height = $(document).height(),
win_height = $(window).height();
if(direction == 'down' && win_height == (doc_height - scroll)){
- $('#calendar_holder').fullCalendar('next');
+ $('#fullcalendar').fullCalendar('next');
$(document).scrollTop(0);
event.preventDefault();
}else if (direction == 'top' && scroll == 0) {
- $('#calendar_holder').fullCalendar('prev');
+ $('#fullcalendar').fullCalendar('prev');
$(document).scrollTop(win_height);
event.preventDefault();
}
@@ -398,9 +398,9 @@ Calendar={
if (data.status == 'success'){
checkbox.checked = data.active == 1;
if (data.active == 1){
- $('#calendar_holder').fullCalendar('addEventSource', data.eventSource);
+ $('#fullcalendar').fullCalendar('addEventSource', data.eventSource);
}else{
- $('#calendar_holder').fullCalendar('removeEventSource', data.eventSource.url);
+ $('#fullcalendar').fullCalendar('removeEventSource', data.eventSource.url);
}
}
});
@@ -426,10 +426,10 @@ Calendar={
function(data) {
if (data.status == 'success'){
var url = 'ajax/events.php?calendar_id='+calid;
- $('#calendar_holder').fullCalendar('removeEventSource', url);
+ $('#fullcalendar').fullCalendar('removeEventSource', url);
$('#choosecalendar_dialog').dialog('destroy').remove();
Calendar.UI.Calendar.overview();
- $('#calendar_holder').fullCalendar('refetchEvents');
+ $('#fullcalendar').fullCalendar('refetchEvents');
}
});
}
@@ -456,8 +456,8 @@ Calendar={
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);
+ $('#fullcalendar').fullCalendar('removeEventSource', data.eventSource.url);
+ $('#fullcalendar').fullCalendar('addEventSource', data.eventSource);
if (calendarid == 'new'){
$('#choosecalendar_dialog > table:first').append('
t('Your calendars'); ?>:
-t('Shared calendars'); ?>:
+