summaryrefslogtreecommitdiff
path: root/vendor/eluceo
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/eluceo')
-rw-r--r--vendor/eluceo/ical/.gitignore3
-rw-r--r--vendor/eluceo/ical/.php_cs26
-rw-r--r--vendor/eluceo/ical/.scrutinizer.yml20
-rw-r--r--vendor/eluceo/ical/.travis.yml19
-rw-r--r--vendor/eluceo/ical/CHANGELOG.md31
-rw-r--r--vendor/eluceo/ical/LICENSE19
-rw-r--r--vendor/eluceo/ical/README.md158
-rw-r--r--vendor/eluceo/ical/UPGRADE.md9
-rw-r--r--vendor/eluceo/ical/composer.json43
-rw-r--r--vendor/eluceo/ical/examples/example1.php30
-rw-r--r--vendor/eluceo/ical/examples/example2.php31
-rw-r--r--vendor/eluceo/ical/examples/example3.php36
-rw-r--r--vendor/eluceo/ical/examples/example4.php35
-rw-r--r--vendor/eluceo/ical/examples/example5.php66
-rw-r--r--vendor/eluceo/ical/examples/example6.php30
-rw-r--r--vendor/eluceo/ical/examples/example7.php33
-rw-r--r--vendor/eluceo/ical/phpunit.xml.dist21
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component.php172
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php151
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php323
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php783
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php57
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php215
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/ParameterBag.php108
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property.php148
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/ArrayValue.php43
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimeProperty.php38
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimesProperty.php41
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Attendees.php102
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Description.php66
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Organizer.php39
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceId.php130
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceRule.php444
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/StringValue.php61
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Property/ValueInterface.php24
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/PropertyBag.php79
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Util/ComponentUtil.php48
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Util/DateUtil.php69
-rw-r--r--vendor/eluceo/ical/src/Eluceo/iCal/Util/PropertyValueUtil.php40
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Component/CalendarIntegrationTest.php64
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/ComponentTest.php45
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/ParameterBagTest.php35
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Property/ArrayValueTest.php26
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/DescriptionTest.php17
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/OrganizerTest.php63
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/RecurrenceRuleTest.php21
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/Property/StringValueTest.php63
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/PropertyBagTest.php18
-rw-r--r--vendor/eluceo/ical/tests/Eluceo/iCal/PropertyTest.php42
49 files changed, 4185 insertions, 0 deletions
diff --git a/vendor/eluceo/ical/.gitignore b/vendor/eluceo/ical/.gitignore
new file mode 100644
index 00000000..4e06e7d4
--- /dev/null
+++ b/vendor/eluceo/ical/.gitignore
@@ -0,0 +1,3 @@
+vendor
+composer.lock
+bin
diff --git a/vendor/eluceo/ical/.php_cs b/vendor/eluceo/ical/.php_cs
new file mode 100644
index 00000000..1d54d34a
--- /dev/null
+++ b/vendor/eluceo/ical/.php_cs
@@ -0,0 +1,26 @@
+<?php
+
+Symfony\CS\Fixer\Contrib\HeaderCommentFixer::setHeader(<<<EOF
+This file is part of the eluceo/iCal package.
+
+(c) Markus Poerschke <markus@eluceo.de>
+
+This source file is subject to the MIT license that is bundled
+with this source code in the file LICENSE.
+EOF
+);
+
+$finder = Symfony\CS\Finder\DefaultFinder::create();
+$finder->in(__DIR__ . '/src');
+
+return Symfony\CS\Config\Config::create()
+ ->fixers(array(
+ 'header_comment',
+ 'concat_with_spaces',
+ 'align_equals',
+ 'align_double_arrow',
+ 'unused_use',
+ 'long_array_syntax',
+ ))
+ ->finder($finder)
+;
diff --git a/vendor/eluceo/ical/.scrutinizer.yml b/vendor/eluceo/ical/.scrutinizer.yml
new file mode 100644
index 00000000..d3b381a2
--- /dev/null
+++ b/vendor/eluceo/ical/.scrutinizer.yml
@@ -0,0 +1,20 @@
+filter:
+ excluded_paths:
+ - tests/*
+
+tools:
+ php_cs_fixer: true
+ php_code_sniffer:
+ config:
+ standard: PSR2
+ php_mess_detector: true
+ php_analyzer: true
+ sensiolabs_security_checker: true
+ external_code_coverage:
+ timeout: 300
+ runs: 1
+
+checks:
+ php:
+ code_rating: true
+ duplication: true
diff --git a/vendor/eluceo/ical/.travis.yml b/vendor/eluceo/ical/.travis.yml
new file mode 100644
index 00000000..cbe31ac9
--- /dev/null
+++ b/vendor/eluceo/ical/.travis.yml
@@ -0,0 +1,19 @@
+language: php
+
+php:
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+
+before_script:
+ - composer self-update
+ - composer install
+
+script: ./bin/phpunit --coverage-clover=coverage.clover
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
diff --git a/vendor/eluceo/ical/CHANGELOG.md b/vendor/eluceo/ical/CHANGELOG.md
new file mode 100644
index 00000000..84320d98
--- /dev/null
+++ b/vendor/eluceo/ical/CHANGELOG.md
@@ -0,0 +1,31 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+## [0.10.1] - 2016-05-09
+### Fixed
+- Problem with GEO property when importing into Google Calendar [#74](https://github.com/markuspoerschke/iCal/pull/74)
+
+## [0.10.0] - 2016-04-26
+### Changed
+- Use 'escapeValue' to escape the new line character. [#60](https://github.com/markuspoerschke/iCal/pull/60)
+- Order components by type when building ical file. [#65](https://github.com/markuspoerschke/iCal/pull/65)
+
+### Added
+- X-ALT-DESC for HTML types with new descriptionHTML field. [#55](https://github.com/markuspoerschke/iCal/pull/55)
+- Added a property and setter for calendar color. [#68](https://github.com/markuspoerschke/iCal/pull/68)
+- Write also GEO property if geo location is given. [#66](https://github.com/markuspoerschke/iCal/pull/66)
+
+## [0.9.0] - 2015-11-13
+### Added
+- CHANGELOG.md based on [’Keep a CHANGELOG’](https://github.com/olivierlacan/keep-a-changelog)
+- Support event properties EXDATE and RECURRENCE-ID [#50](https://github.com/markuspoerschke/iCal/pull/53)
+
+### Changed
+- Allow new lines in event descriptions [#53](https://github.com/markuspoerschke/iCal/pull/53)
+- **Breaking Change:** Changed signature of the ```Event::setOrganizer``` method. Now there is is only one parameter that must be an instance of ```Property\Organizer```.
+- Updated install section in README.md [#54](https://github.com/markuspoerschke/iCal/pull/53)
+
+[Unreleased]: https://github.com/markuspoerschke/iCal/compare/0.10.1...HEAD
+[0.10.1]: https://github.com/markuspoerschke/iCal/compare/0.10.0...0.10.1
+[0.10.0]: https://github.com/markuspoerschke/iCal/compare/0.9.0...0.10.0
+[0.9.0]: https://github.com/markuspoerschke/iCal/compare/0.8.0...0.9.0
diff --git a/vendor/eluceo/ical/LICENSE b/vendor/eluceo/ical/LICENSE
new file mode 100644
index 00000000..92be8d06
--- /dev/null
+++ b/vendor/eluceo/ical/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2012-2015 Markus Poerschke
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/eluceo/ical/README.md b/vendor/eluceo/ical/README.md
new file mode 100644
index 00000000..521d537d
--- /dev/null
+++ b/vendor/eluceo/ical/README.md
@@ -0,0 +1,158 @@
+# eluceo — iCal
+
+[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/markuspoerschke/iCal/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/markuspoerschke/iCal/?branch=master) [![Code Coverage](https://scrutinizer-ci.com/g/markuspoerschke/iCal/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/markuspoerschke/iCal/?branch=master) [![Build Status](https://travis-ci.org/markuspoerschke/iCal.svg?branch=master)](https://travis-ci.org/markuspoerschke/iCal)
+
+This package offers a abstraction layer for creating iCalendars. The output will
+follow [RFC 5545](http://www.ietf.org/rfc/rfc5545.txt) as best as possible.
+
+The following components are supported at this time:
+
+* VCALENDAR
+* VEVENT
+* VALARM
+* VTIMEZONE
+
+## Installation
+
+You can install this package by using [Composer](http://getcomposer.org), running this command:
+
+```sh
+composer require eluceo/ical
+```
+Link to Packagist: https://packagist.org/packages/eluceo/ical
+
+## Usage
+
+### Basic Usage
+
+#### 1. Create a Calendar object
+
+```PHP
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+```
+
+#### 2. Create an Event object
+
+```PHP
+$vEvent = new \Eluceo\iCal\Component\Event();
+```
+
+#### 3. Add your information to the Event
+
+```PHP
+$vEvent
+ ->setDtStart(new \DateTime('2012-12-24'))
+ ->setDtEnd(new \DateTime('2012-12-24'))
+ ->setNoTime(true)
+ ->setSummary('Christmas')
+;
+```
+
+#### 4. Add Event to Calendar
+
+```PHP
+$vCalendar->addComponent($vEvent);
+```
+
+#### 5. Set HTTP-headers
+
+```PHP
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+```
+
+#### 6. Send output
+
+```PHP
+echo $vCalendar->render();
+```
+
+### Timezone support
+
+This package supports three different types of handling timezones:
+
+#### 1. UTC (default)
+
+In the default setting, UTC/GMT will be used as Timezone. The time will be formated as following:
+
+```
+DTSTART:20121224T180000Z
+```
+
+#### 2. Use explicit timezone
+
+You can use an explicit timezone by calling `$vEvent->setUseTimezone(true);`. The timezone of your
+`\DateTime` object will be used. In this case the non-standard field "X-WR-TIMEZONE" will be used.
+Be awre that this is a simple solution which is not supported by all calendar clients.
+The output will be as following:
+
+```
+DTSTART;TZID=Europe/Berlin:20121224T180000
+```
+
+#### 3. Use explicit timezone with definition
+
+You can use an explicit timezone and define it using `Timezone()` and `TimezoneRule()` (see example5.php).
+The timezone of your `\DateTime` object will be used. The output will be as following:
+
+```
+BEGIN:VTIMEZONE
+TZID:Europe/Berlin
+X-LIC-LOCATION:Europe/Berlin
+BEGIN:DAYLIGHT
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+DTSTART:19810329T030000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=3;BYDAY=-1SU
+END:DAYLIGHT
+BEGIN:STANDARD
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+DTSTART:19961027T030000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+END:VTIMEZONE
+...
+DTSTART;TZID=Europe/Berlin:20121224T180000
+```
+
+#### 4. Use locale time
+
+You can use local time by calling `$vEvent->setUseUtc(false);`. The output will be:
+
+```
+DTSTART:20121224T180000
+```
+
+## Running the tests
+
+To setup and run tests:
+
+- go to the root directory of this project
+- download composer: `wget https://getcomposer.org/composer.phar`
+- install dev dependencies: `php composer.phar install --dev`
+- run `./bin/phpunit`
+
+## License
+
+This package is released under the __MIT license__.
+
+Copyright (c) 2012-2015 Markus Poerschke
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/vendor/eluceo/ical/UPGRADE.md b/vendor/eluceo/ical/UPGRADE.md
new file mode 100644
index 00000000..951209dd
--- /dev/null
+++ b/vendor/eluceo/ical/UPGRADE.md
@@ -0,0 +1,9 @@
+# v0.8.0 -> v0.9.0
+
+- The signature of the ```Event::setOrganizer``` method was changed:
+Now there is is only one parameter that must be an instance of ```Property\Organizer```.
+
+# v0.7.0 -> v0.8.0
+
+- The signature of the ```Event::setOrganizer``` method was changed: Now there are
+two parameters name and email instead of an already formatted string.
diff --git a/vendor/eluceo/ical/composer.json b/vendor/eluceo/ical/composer.json
new file mode 100644
index 00000000..b2477c28
--- /dev/null
+++ b/vendor/eluceo/ical/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "eluceo/ical",
+ "description": "The eluceo/iCal package offers a abstraction layer for creating iCalendars. You can easily create iCal files by using PHP object instead of typing your *.ics file by hand. The output will follow RFC 2445 as best as possible.",
+ "license": "MIT",
+ "homepage": "https://github.com/markuspoerschke/iCal",
+ "authors": [
+ {
+ "name": "Markus Poerschke",
+ "email": "markus@eluceo.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Maciej Łebkowski",
+ "email": "m.lebkowski@gmail.com",
+ "role": "Contributor"
+ }
+ ],
+ "keywords": [
+ "ical",
+ "php calendar",
+ "icalendar",
+ "ics",
+ "calendar"
+ ],
+ "support": {
+ "issues": "https://github.com/markuspoerschke/iCal/issues",
+ "source": "https://github.com/markuspoerschke/iCal"
+ },
+ "autoload": {
+ "psr-0": {
+ "Eluceo\\iCal": "src/"
+ }
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.3"
+ },
+ "config": {
+ "bin-dir": "bin"
+ }
+}
diff --git a/vendor/eluceo/ical/examples/example1.php b/vendor/eluceo/ical/examples/example1.php
new file mode 100644
index 00000000..4d1d32c4
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example1.php
@@ -0,0 +1,30 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-24'));
+$vEvent->setDtEnd(new \DateTime('2012-12-24'));
+$vEvent->setNoTime(true);
+$vEvent->setSummary('Christmas');
+
+// Adding Timezone (optional)
+$vEvent->setUseTimezone(true);
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example2.php b/vendor/eluceo/ical/examples/example2.php
new file mode 100644
index 00000000..bafcf033
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example2.php
@@ -0,0 +1,31 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-24'));
+$vEvent->setDtEnd(new \DateTime('2012-12-24'));
+$vEvent->setNoTime(true);
+$vEvent->setSummary('Summary with some german "umlauten" and a backslash \\: Kinder mögen Äpfel pflücken.');
+$vEvent->setCategories(['holidays']);
+
+// Adding Timezone (optional)
+$vEvent->setUseTimezone(true);
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example3.php b/vendor/eluceo/ical/examples/example3.php
new file mode 100644
index 00000000..290ff2dc
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example3.php
@@ -0,0 +1,36 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-31'));
+$vEvent->setDtEnd(new \DateTime('2012-12-31'));
+$vEvent->setNoTime(true);
+$vEvent->setSummary('New Year’s Eve');
+
+// Set recurrence rule
+$recurrenceRule = new \Eluceo\iCal\Property\Event\RecurrenceRule();
+$recurrenceRule->setFreq(\Eluceo\iCal\Property\Event\RecurrenceRule::FREQ_YEARLY);
+$recurrenceRule->setInterval(1);
+$vEvent->setRecurrenceRule($recurrenceRule);
+
+// Adding Timezone (optional)
+$vEvent->setUseTimezone(true);
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example4.php b/vendor/eluceo/ical/examples/example4.php
new file mode 100644
index 00000000..7b87144c
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example4.php
@@ -0,0 +1,35 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-11-11 13:00:00'));
+$vEvent->setDtEnd(new \DateTime('2012-11-11 14:30:00'));
+$vEvent->setSummary('Weekly lunch with Markus');
+
+// Set recurrence rule
+$recurrenceRule = new \Eluceo\iCal\Property\Event\RecurrenceRule();
+$recurrenceRule->setFreq(\Eluceo\iCal\Property\Event\RecurrenceRule::FREQ_WEEKLY);
+$recurrenceRule->setInterval(1);
+$vEvent->setRecurrenceRule($recurrenceRule);
+
+// Adding Timezone (optional)
+$vEvent->setUseTimezone(true);
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example5.php b/vendor/eluceo/ical/examples/example5.php
new file mode 100644
index 00000000..a7da6e27
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example5.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * example to show how to create an ICal calendar which
+ * provides a full timezone definition
+ */
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+$tz = 'Europe/Berlin';
+$dtz = new \DateTimeZone($tz);
+date_default_timezone_set($tz);
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create timezone rule object for Daylight Saving Time
+$vTimezoneRuleDst = new \Eluceo\iCal\Component\TimezoneRule(\Eluceo\iCal\Component\TimezoneRule::TYPE_DAYLIGHT);
+$vTimezoneRuleDst->setTzName('CEST');
+$vTimezoneRuleDst->setDtStart(new \DateTime('1981-03-29 02:00:00', $dtz));
+$vTimezoneRuleDst->setTzOffsetFrom('+0100');
+$vTimezoneRuleDst->setTzOffsetTo('+0200');
+$dstRecurrenceRule = new \Eluceo\iCal\Property\Event\RecurrenceRule();
+$dstRecurrenceRule->setFreq(\Eluceo\iCal\Property\Event\RecurrenceRule::FREQ_YEARLY);
+$dstRecurrenceRule->setByMonth(3);
+$dstRecurrenceRule->setByDay('-1SU');
+$vTimezoneRuleDst->setRecurrenceRule($dstRecurrenceRule);
+
+// 3. Create timezone rule object for Standard Time
+$vTimezoneRuleStd = new \Eluceo\iCal\Component\TimezoneRule(\Eluceo\iCal\Component\TimezoneRule::TYPE_STANDARD);
+$vTimezoneRuleStd->setTzName('CET');
+$vTimezoneRuleStd->setDtStart(new \DateTime('1996-10-27 03:00:00', $dtz));
+$vTimezoneRuleStd->setTzOffsetFrom('+0200');
+$vTimezoneRuleStd->setTzOffsetTo('+0100');
+$stdRecurrenceRule = new \Eluceo\iCal\Property\Event\RecurrenceRule();
+$stdRecurrenceRule->setFreq(\Eluceo\iCal\Property\Event\RecurrenceRule::FREQ_YEARLY);
+$stdRecurrenceRule->setByMonth(10);
+$stdRecurrenceRule->setByDay('-1SU');
+$vTimezoneRuleStd->setRecurrenceRule($stdRecurrenceRule);
+
+// 4. Create timezone definition and add rules
+$vTimezone = new \Eluceo\iCal\Component\Timezone($tz);
+$vTimezone->addComponent($vTimezoneRuleDst);
+$vTimezone->addComponent($vTimezoneRuleStd);
+$vCalendar->setTimezone($vTimezone);
+
+// 5. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-24', $dtz));
+$vEvent->setDtEnd(new \DateTime('2012-12-24', $dtz));
+$vEvent->setSummary('Summary with some german "umlauten" and a backslash \\: Kinder mögen Äpfel pflücken.');
+
+// 6. Adding Timezone
+$vEvent->setUseTimezone(true);
+
+// 7. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 8. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 9. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example6.php b/vendor/eluceo/ical/examples/example6.php
new file mode 100644
index 00000000..10400993
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example6.php
@@ -0,0 +1,30 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-24'));
+$vEvent->setDtEnd(new \DateTime('2012-12-24'));
+$vEvent->setNoTime(true);
+$vEvent->setSummary('Christmas');
+
+// add some location information for apple devices
+$vEvent->setLocation("Infinite Loop\nCupertino CA 95014", 'Infinite Loop', '37.332095,-122.030743');
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/examples/example7.php b/vendor/eluceo/ical/examples/example7.php
new file mode 100644
index 00000000..1f8013e7
--- /dev/null
+++ b/vendor/eluceo/ical/examples/example7.php
@@ -0,0 +1,33 @@
+<?php
+
+// use composer autoloader
+require_once __DIR__ . '/../vendor/autoload.php';
+
+// set default timezone (PHP 5.4)
+date_default_timezone_set('Europe/Berlin');
+
+// 1. Create new calendar
+$vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+// 2. Create an event
+$vEvent = new \Eluceo\iCal\Component\Event();
+$vEvent->setDtStart(new \DateTime('2012-12-24'));
+$vEvent->setDtEnd(new \DateTime('2012-12-24'));
+$vEvent->setNoTime(true);
+$vEvent->setSummary('Christmas');
+$vEvent->setDescription('Happy Christmas!');
+$vEvent->setDescriptionHTML('<b>Happy Christmas!</b>');
+
+
+// add some location information for apple devices
+$vEvent->setLocation("Infinite Loop\nCupertino CA 95014", 'Infinite Loop', '37.332095,-122.030743');
+
+// 3. Add event to calendar
+$vCalendar->addComponent($vEvent);
+
+// 4. Set headers
+header('Content-Type: text/calendar; charset=utf-8');
+header('Content-Disposition: attachment; filename="cal.ics"');
+
+// 5. Output
+echo $vCalendar->render();
diff --git a/vendor/eluceo/ical/phpunit.xml.dist b/vendor/eluceo/ical/phpunit.xml.dist
new file mode 100644
index 00000000..13e18c0e
--- /dev/null
+++ b/vendor/eluceo/ical/phpunit.xml.dist
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+ backupStaticAttributes="false"
+ colors="true"
+ convertErrorsToExceptions="true"
+ convertNoticesToExceptions="true"
+ convertWarningsToExceptions="true"
+ processIsolation="false"
+ stopOnFailure="false"
+ syntaxCheck="false"
+ bootstrap="./vendor/autoload.php">
+ <logging>
+ <log type="coverage-text" target="php://stdout" showUncoveredFiles="true" showOnlySummary="true"/>
+ </logging>
+ <testsuites>
+ <testsuite name="eluceo iCal Test Suite">
+ <directory suffix="Test.php">./tests/Eluceo/iCal/</directory>
+ </testsuite>
+ </testsuites>
+</phpunit>
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component.php
new file mode 100644
index 00000000..76c9b2d9
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component.php
@@ -0,0 +1,172 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal;
+
+use Eluceo\iCal\Util\ComponentUtil;
+
+/**
+ * Abstract Calender Component.
+ */
+abstract class Component
+{
+ /**
+ * Array of Components.
+ *
+ * @var Component[]
+ */
+ protected $components = array();
+
+ /**
+ * The order in which the components will be rendered during build.
+ *
+ * Not defined components will be appended at the end.
+ *
+ * @var array
+ */
+ private $componentsBuildOrder = array('VTIMEZONE', 'DAYLIGHT', 'STANDARD');
+
+ /**
+ * The type of the concrete Component.
+ *
+ * @abstract
+ *
+ * @return string
+ */
+ abstract public function getType();
+
+ /**
+ * Building the PropertyBag.
+ *
+ * @abstract
+ *
+ * @return PropertyBag
+ */
+ abstract public function buildPropertyBag();
+
+ /**
+ * Adds a Component.
+ *
+ * If $key is given, the component at $key will be replaced else the component will be append.
+ *
+ * @param Component $component The Component that will be added
+ * @param null $key The key of the Component
+ */
+ public function addComponent(Component $component, $key = null)
+ {
+ if (null == $key) {
+ $this->components[] = $component;
+ } else {
+ $this->components[$key] = $component;
+ }
+ }
+
+ /**
+ * Renders an array containing the lines of the iCal file.
+ *
+ * @return array
+ */
+ public function build()
+ {
+ $lines = array();
+
+ $lines[] = sprintf('BEGIN:%s', $this->getType());
+
+ /** @var $property Property */
+ foreach ($this->buildPropertyBag() as $property) {
+ foreach ($property->toLines() as $l) {
+ $lines[] = $l;
+ }
+ }
+
+ $this->buildComponents($lines);
+
+ $lines[] = sprintf('END:%s', $this->getType());
+
+ $ret = array();
+
+ foreach ($lines as $line) {
+ foreach (ComponentUtil::fold($line) as $l) {
+ $ret[] = $l;
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Renders the output.
+ *
+ * @return string
+ */
+ public function render()
+ {
+ return implode("\r\n", $this->build());
+ }
+
+ /**
+ * Renders the output when treating the class as a string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->render();
+ }
+
+ /**
+ * @param $lines
+ *
+ * @return array
+ */
+ private function buildComponents(array &$lines)
+ {
+ $componentsByType = array();
+
+ /** @var $component Component */
+ foreach ($this->components as $component) {
+ $type = $component->getType();
+ if (!isset($componentsByType[$type])) {
+ $componentsByType[$type] = array();
+ }
+ $componentsByType[$type][] = $component;
+ }
+
+ // render ordered components
+ foreach ($this->componentsBuildOrder as $type) {
+ if (!isset($componentsByType[$type])) {
+ continue;
+ }
+ foreach ($componentsByType[$type] as $component) {
+ $this->addComponentLines($lines, $component);
+ }
+ unset($componentsByType[$type]);
+ }
+
+ // render all other
+ foreach ($componentsByType as $components) {
+ foreach ($components as $component) {
+ $this->addComponentLines($lines, $component);
+ }
+ }
+ }
+
+ /**
+ * @param array $lines
+ * @param Component $component
+ */
+ private function addComponentLines(array &$lines, Component $component)
+ {
+ foreach ($component->build() as $l) {
+ $lines[] = $l;
+ }
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php
new file mode 100644
index 00000000..9e0f0c1b
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Alarm.php
@@ -0,0 +1,151 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Component;
+
+use Eluceo\iCal\Component;
+use Eluceo\iCal\PropertyBag;
+use Eluceo\iCal\Property;
+
+/**
+ * Implementation of the VALARM component.
+ */
+class Alarm extends Component
+{
+ /**
+ * Alarm ACTION property.
+ *
+ * According to RFC 5545: 3.8.6.1. Action
+ *
+ * @link http://tools.ietf.org/html/rfc5545#section-3.8.6.1
+ */
+ const ACTION_AUDIO = 'AUDIO';
+ const ACTION_DISPLAY = 'DISPLAY';
+ const ACTION_EMAIL = 'EMAIL';
+
+ protected $action;
+ protected $repeat;
+ protected $duration;
+ protected $description;
+ protected $attendee;
+ protected $trigger;
+
+ public function getType()
+ {
+ return 'VALARM';
+ }
+
+ public function getAction()
+ {
+ return $this->action;
+ }
+
+ public function getRepeat()
+ {
+ return $this->repeat;
+ }
+
+ public function getDuration()
+ {
+ return $this->duration;
+ }
+
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ public function getAttendee()
+ {
+ return $this->attendee;
+ }
+
+ public function getTrigger()
+ {
+ return $this->trigger;
+ }
+
+ public function setAction($action)
+ {
+ $this->action = $action;
+
+ return $this;
+ }
+
+ public function setRepeat($repeat)
+ {
+ $this->repeat = $repeat;
+
+ return $this;
+ }
+
+ public function setDuration($duration)
+ {
+ $this->duration = $duration;
+
+ return $this;
+ }
+
+ public function setDescription($description)
+ {
+ $this->description = $description;
+
+ return $this;
+ }
+
+ public function setAttendee($attendee)
+ {
+ $this->attendee = $attendee;
+
+ return $this;
+ }
+
+ public function setTrigger($trigger)
+ {
+ $this->trigger = $trigger;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildPropertyBag()
+ {
+ $propertyBag = new PropertyBag();
+
+ if (null != $this->trigger) {
+ $propertyBag->set('TRIGGER', $this->trigger);
+ }
+
+ if (null != $this->action) {
+ $propertyBag->set('ACTION', $this->action);
+ }
+
+ if (null != $this->repeat) {
+ $propertyBag->set('REPEAT', $this->repeat);
+ }
+
+ if (null != $this->duration) {
+ $propertyBag->set('DURATION', $this->duration);
+ }
+
+ if (null != $this->description) {
+ $propertyBag->set('DESCRIPTION', $this->description);
+ }
+
+ if (null != $this->attendee) {
+ $propertyBag->set('ATTENDEE', $this->attendee);
+ }
+
+ return $propertyBag;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php
new file mode 100644
index 00000000..db3dd98d
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Calendar.php
@@ -0,0 +1,323 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Component;
+
+use Eluceo\iCal\Component;
+use Eluceo\iCal\PropertyBag;
+
+class Calendar extends Component
+{
+ /**
+ * Methods for calendar components.
+ *
+ * According to RFP 5545: 3.7.2. Method
+ *
+ * @link http://tools.ietf.org/html/rfc5545#section-3.7.2
+ *
+ * And then according to RFC 2446: 3 APPLICATION PROTOCOL ELEMENTS
+ * @link https://www.ietf.org/rfc/rfc2446.txt
+ */
+ const METHOD_PUBLISH = 'PUBLISH';
+ const METHOD_REQUEST = 'REQUEST';
+ const METHOD_REPLY = 'REPLY';
+ const METHOD_ADD = 'ADD';
+ const METHOD_CANCEL = 'CANCEL';
+ const METHOD_REFRESH = 'REFRESH';
+ const METHOD_COUNTER = 'COUNTER';
+ const METHOD_DECLINECOUNTER = 'DECLINECOUNTER';
+
+ /**
+ * This property defines the calendar scale used for the calendar information specified in the iCalendar object.
+ *
+ * According to RFC 5545: 3.7.1. Calendar Scale
+ *
+ * @link http://tools.ietf.org/html/rfc5545#section-3.7
+ */
+ const CALSCALE_GREGORIAN = 'GREGORIAN';
+
+ /**
+ * The Product Identifier.
+ *
+ * According to RFC 2445: 4.7.3 Product Identifier
+ *
+ * This property specifies the identifier for the product that created the Calendar object.
+ *
+ * @link http://www.ietf.org/rfc/rfc2445.txt
+ *
+ * @var string
+ */
+ protected $prodId = null;
+ protected $method = null;
+ protected $name = null;
+ protected $description = null;
+ protected $timezone = null;
+
+ /**
+ * This property defines the calendar scale used for the
+ * calendar information specified in the iCalendar object.
+ *
+ * Also identifies the calendar type of a non-Gregorian recurring appointment.
+ *
+ * @var string
+ *
+ * @see http://tools.ietf.org/html/rfc5545#section-3.7
+ * @see http://msdn.microsoft.com/en-us/library/ee237520(v=exchg.80).aspx
+ */
+ protected $calendarScale = null;
+
+ /**
+ * Specifies whether or not the iCalendar file only contains one appointment.
+ *
+ * @var bool
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ee203486(v=exchg.80).aspx
+ */
+ protected $forceInspectOrOpen = false;
+
+ /**
+ * Specifies a globally unique identifier for the calendar.
+ *
+ * @var string
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ee179588(v=exchg.80).aspx
+ */
+ protected $calId = null;
+
+ /**
+ * Specifies a suggested iCalendar file download frequency for clients and
+ * servers with sync capabilities.
+ *
+ * @var string
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ee178699(v=exchg.80).aspx
+ */
+ protected $publishedTTL = 'P1W';
+
+ /**
+ * Specifies a color for the calendar in calendar for Apple/Outlook.
+ *
+ * @var string
+ *
+ * @see http://msdn.microsoft.com/en-us/library/ee179588(v=exchg.80).aspx
+ */
+ protected $calendarColor = null;
+
+ public function __construct($prodId)
+ {
+ if (empty($prodId)) {
+ throw new \UnexpectedValueException('PRODID cannot be empty');
+ }
+
+ $this->prodId = $prodId;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return 'VCALENDAR';
+ }
+
+ /**
+ * @param $method
+ *
+ * @return $this
+ */
+ public function setMethod($method)
+ {
+ $this->method = $method;
+
+ return $this;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return $this
+ */
+ public function setName($name)
+ {
+ $this->name = $name;
+
+ return $this;
+ }
+
+ /**
+ * @param $description
+ *
+ * @return $this
+ */
+ public function setDescription($description)
+ {
+ $this->description = $description;
+
+ return $this;
+ }
+
+ /**
+ * @param $timezone
+ *
+ * @return $this
+ */
+ public function setTimezone($timezone)
+ {
+ $this->timezone = $timezone;
+
+ return $this;
+ }
+
+ /**
+ * @param $calendarColor
+ *
+ * @return $this
+ */
+ public function setCalendarColor($calendarColor)
+ {
+ $this->calendarColor = $calendarColor;
+
+ return $this;
+ }
+
+ /**
+ * @param $calendarScale
+ *
+ * @return $this
+ */
+ public function setCalendarScale($calendarScale)
+ {
+ $this->calendarScale = $calendarScale;
+
+ return $this;
+ }
+
+ /**
+ * @param bool $forceInspectOrOpen
+ *
+ * @return $this
+ */
+ public function setForceInspectOrOpen($forceInspectOrOpen)
+ {
+ $this->forceInspectOrOpen = $forceInspectOrOpen;
+
+ return $this;
+ }
+
+ /**
+ * @param string $calId
+ *
+ * @return $this
+ */
+ public function setCalId($calId)
+ {
+ $this->calId = $calId;
+
+ return $this;
+ }
+
+ /**
+ * @param string $ttl
+ *
+ * @return $this
+ */
+ public function setPublishedTTL($ttl)
+ {
+ $this->publishedTTL = $ttl;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildPropertyBag()
+ {
+ $propertyBag = new PropertyBag();
+ $propertyBag->set('VERSION', '2.0');
+ $propertyBag->set('PRODID', $this->prodId);
+
+ if ($this->method) {
+ $propertyBag->set('METHOD', $this->method);
+ }
+
+ if ($this->calendarColor) {
+ $propertyBag->set('X-APPLE-CALENDAR-COLOR', $this->calendarColor);
+ $propertyBag->set('X-OUTLOOK-COLOR', $this->calendarColor);
+ $propertyBag->set('X-FUNAMBOL-COLOR', $this->calendarColor);
+ }
+
+ if ($this->calendarScale) {
+ $propertyBag->set('CALSCALE', $this->calendarScale);
+ $propertyBag->set('X-MICROSOFT-CALSCALE', $this->calendarScale);
+ }
+
+ if ($this->name) {
+ $propertyBag->set('X-WR-CALNAME', $this->name);
+ }
+
+ if ($this->description) {
+ $propertyBag->set('X-WR-CALDESC', $this->description);
+ }
+
+ if ($this->timezone) {
+ if ($this->timezone instanceof Timezone) {
+ $propertyBag->set('X-WR-TIMEZONE', $this->timezone->getZoneIdentifier());
+ $this->addComponent($this->timezone);
+ } else {
+ $propertyBag->set('X-WR-TIMEZONE', $this->timezone);
+ $this->addComponent(new Timezone($this->timezone));
+ }
+ }
+
+ if ($this->forceInspectOrOpen) {
+ $propertyBag->set('X-MS-OLK-FORCEINSPECTOROPEN', $this->forceInspectOrOpen);
+ }
+
+ if ($this->calId) {
+ $propertyBag->set('X-WR-RELCALID', $this->calId);
+ }
+
+ if ($this->publishedTTL) {
+ $propertyBag->set('X-PUBLISHED-TTL', $this->publishedTTL);
+ }
+
+ return $propertyBag;
+ }
+
+ /**
+ * Adds an Event to the Calendar.
+ *
+ * Wrapper for addComponent()
+ *
+ * @see Eluceo\iCal::addComponent
+ * @deprecated Please, use public method addComponent() from abstract Component class
+ *
+ * @param Event $event
+ */
+ public function addEvent(Event $event)
+ {
+ $this->addComponent($event);
+ }
+
+ /**
+ * @return null|string
+ */
+ public function getProdId()
+ {
+ return $this->prodId;
+ }
+
+ public function getMethod()
+ {
+ return $this->method;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php
new file mode 100644
index 00000000..e93d506c
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Event.php
@@ -0,0 +1,783 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Component;
+
+use Eluceo\iCal\Component;
+use Eluceo\iCal\Property;
+use Eluceo\iCal\Property\DateTimeProperty;
+use Eluceo\iCal\Property\Event\Attendees;
+use Eluceo\iCal\Property\Event\Organizer;
+use Eluceo\iCal\Property\Event\RecurrenceRule;
+use Eluceo\iCal\Property\Event\Description;
+use Eluceo\iCal\PropertyBag;
+use Eluceo\iCal\Property\Event\RecurrenceId;
+use Eluceo\iCal\Property\DateTimesProperty;
+
+/**
+ * Implementation of the EVENT component.
+ */
+class Event extends Component
+{
+ const TIME_TRANSPARENCY_OPAQUE = 'OPAQUE';
+ const TIME_TRANSPARENCY_TRANSPARENT = 'TRANSPARENT';
+
+ const STATUS_TENTATIVE = 'TENTATIVE';
+ const STATUS_CONFIRMED = 'CONFIRMED';
+ const STATUS_CANCELLED = 'CANCELLED';
+
+ /**
+ * @var string
+ */
+ protected $uniqueId;
+
+ /**
+ * The property indicates the date/time that the instance of
+ * the iCalendar object was created.
+ *
+ * The value MUST be specified in the UTC time format.
+ *
+ * @var \DateTime
+ */
+ protected $dtStamp;
+
+ /**
+ * @var \DateTime
+ */
+ protected $dtStart;
+
+ /**
+ * Preferentially chosen over the duration if both are set.
+ *
+ * @var \DateTime
+ */
+ protected $dtEnd;
+
+ /**
+ * @var \DateInterval
+ */
+ protected $duration;
+
+ /**
+ * @var bool
+ */
+ protected $noTime = false;
+
+ /**
+ * @var string
+ */
+ protected $url;
+
+ /**
+ * @var string
+ */
+ protected $location;
+
+ /**
+ * @var string
+ */
+ protected $locationTitle;
+
+ /**
+ * @var string
+ */
+ protected $locationGeo;
+
+ /**
+ * @var string
+ */
+ protected $summary;
+
+ /**
+ * @var Organizer
+ */
+ protected $organizer;
+
+ /**
+ * @see http://www.ietf.org/rfc/rfc2445.txt 4.8.2.7 Time Transparency
+ *
+ * @var string
+ */
+ protected $transparency = self::TIME_TRANSPARENCY_OPAQUE;
+
+ /**
+ * If set to true the timezone will be added to the event.
+ *
+ * @var bool
+ */
+ protected $useTimezone = false;
+
+ /**
+ * @var int
+ */
+ protected $sequence = 0;
+
+ /**
+ * @var Attendees
+ */
+ protected $attendees;
+
+ /**
+ * @var string
+ */
+ protected $description;
+
+ /**
+ * @var string
+ */
+ protected $descriptionHTML;
+
+ /**
+ * @var string
+ */
+ protected $status;
+
+ /**
+ * @var RecurrenceRule
+ */
+ protected $recurrenceRule;
+
+ /**
+ * This property specifies the date and time that the calendar
+ * information was created.
+ *
+ * The value MUST be specified in the UTC time format.
+ *
+ * @var \DateTime
+ */
+ protected $created;
+
+ /**
+ * The property specifies the date and time that the information
+ * associated with the calendar component was last revised.
+ *
+ * The value MUST be specified in the UTC time format.
+ *
+ * @var \DateTime
+ */
+ protected $modified;
+
+ /**
+ * Indicates if the UTC time should be used or not.
+ *
+ * @var bool
+ */
+ protected $useUtc = true;
+
+ /**
+ * @var bool
+ */
+ protected $cancelled;
+
+ /**
+ * This property is used to specify categories or subtypes
+ * of the calendar component. The categories are useful in searching
+ * for a calendar component of a particular type and category.
+ *
+ * @see https://tools.ietf.org/html/rfc5545#section-3.8.1.2
+ *
+ * @var array
+ */
+ protected $categories;
+
+ /**
+ * https://tools.ietf.org/html/rfc5545#section-3.8.1.3.
+ *
+ * @var bool
+ */
+ protected $isPrivate = false;
+
+ /**
+ * Dates to be excluded from a series of events.
+ *
+ * @var \DateTime[]
+ */
+ protected $exDates = array();
+
+ /**
+ * @var RecurrenceId
+ */
+ protected $recurrenceId;
+
+ public function __construct($uniqueId = null)
+ {
+ if (null == $uniqueId) {
+ $uniqueId = uniqid();
+ }
+
+ $this->uniqueId = $uniqueId;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return 'VEVENT';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildPropertyBag()
+ {
+ $propertyBag = new PropertyBag();
+
+ // mandatory information
+ $propertyBag->set('UID', $this->uniqueId);
+
+ $propertyBag->add(new DateTimeProperty('DTSTART', $this->dtStart, $this->noTime, $this->useTimezone, $this->useUtc));
+ $propertyBag->set('SEQUENCE', $this->sequence);
+ $propertyBag->set('TRANSP', $this->transparency);
+
+ if ($this->status) {
+ $propertyBag->set('STATUS', $this->status);
+ }
+
+ // An event can have a 'dtend' or 'duration', but not both.
+ if (null != $this->dtEnd) {
+ $propertyBag->add(new DateTimeProperty('DTEND', $this->dtEnd, $this->noTime, $this->useTimezone, $this->useUtc));
+ } elseif (null != $this->duration) {
+ $propertyBag->set('DURATION', $this->duration->format('P%dDT%hH%iM%sS'));
+ }
+
+ // optional information
+ if (null != $this->url) {
+ $propertyBag->set('URL', $this->url);
+ }
+
+ if (null != $this->location) {
+ $propertyBag->set('LOCATION', $this->location);
+
+ if (null != $this->locationGeo) {
+ $propertyBag->add(
+ new Property(
+ 'X-APPLE-STRUCTURED-LOCATION',
+ 'geo:' . $this->locationGeo,
+ array(
+ 'VALUE' => 'URI',
+ 'X-ADDRESS' => $this->location,
+ 'X-APPLE-RADIUS' => 49,
+ 'X-TITLE' => $this->locationTitle,
+ )
+ )
+ );
+ $propertyBag->set('GEO', str_replace(',', ';', $this->locationGeo));
+ }
+ }
+
+ if (null != $this->summary) {
+ $propertyBag->set('SUMMARY', $this->summary);
+ }
+
+ if (null != $this->attendees) {
+ $propertyBag->add($this->attendees);
+ }
+
+ $propertyBag->set('CLASS', $this->isPrivate ? 'PRIVATE' : 'PUBLIC');
+
+ if (null != $this->description) {
+ $propertyBag->set('DESCRIPTION', new Description($this->description));
+ }
+
+ if (null != $this->descriptionHTML) {
+ $propertyBag->add(
+ new Property(
+ 'X-ALT-DESC',
+ $this->descriptionHTML,
+ array(
+ 'FMTTYPE' => 'text/html',
+ )
+ )
+ );
+ }
+
+ if (null != $this->recurrenceRule) {
+ $propertyBag->set('RRULE', $this->recurrenceRule);
+ }
+
+ if (null != $this->recurrenceId) {
+ $this->recurrenceId->applyTimeSettings($this->noTime, $this->useTimezone, $this->useUtc);
+ $propertyBag->add($this->recurrenceId);
+ }
+
+ if (!empty($this->exDates)) {
+ $propertyBag->add(new DateTimesProperty('EXDATE', $this->exDates, $this->noTime, $this->useTimezone, $this->useUtc));
+ }
+
+ if ($this->cancelled) {
+ $propertyBag->set('STATUS', 'CANCELLED');
+ }
+
+ if (null != $this->organizer) {
+ $propertyBag->add($this->organizer);
+ }
+
+ if ($this->noTime) {
+ $propertyBag->set('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE');
+ }
+
+ if (null != $this->categories) {
+ $propertyBag->set('CATEGORIES', $this->categories);
+ }
+
+ $propertyBag->add(
+ new DateTimeProperty('DTSTAMP', $this->dtStamp ?: new \DateTime(), false, false, true)
+ );
+
+ if ($this->created) {
+ $propertyBag->add(new DateTimeProperty('CREATED', $this->created, false, false, true));
+ }
+
+ if ($this->modified) {
+ $propertyBag->add(new DateTimeProperty('LAST-MODIFIED', $this->modified, false, false, true));
+ }
+
+ return $propertyBag;
+ }
+
+ /**
+ * @param $dtEnd
+ *
+ * @return $this
+ */
+ public function setDtEnd($dtEnd)
+ {
+ $this->dtEnd = $dtEnd;
+
+ return $this;
+ }
+
+ public function getDtEnd()
+ {
+ return $this->dtEnd;
+ }
+
+ public function setDtStart($dtStart)
+ {
+ $this->dtStart = $dtStart;
+
+ return $this;
+ }
+
+ /**
+ * @param $dtStamp
+ *
+ * @return $this
+ */
+ public function setDtStamp($dtStamp)
+ {
+ $this->dtStamp = $dtStamp;
+
+ return $this;
+ }
+
+ /**
+ * @param $duration
+ *
+ * @return $this
+ */
+ public function setDuration($duration)
+ {
+ $this->duration = $duration;
+
+ return $this;
+ }
+
+ /**
+ * @param $location
+ * @param string $title
+ * @param null $geo
+ *
+ * @return $this
+ */
+ public function setLocation($location, $title = '', $geo = null)
+ {
+ $this->location = $location;
+ $this->locationTitle = $title;
+ $this->locationGeo = $geo;
+
+ return $this;
+ }
+
+ /**
+ * @param $noTime
+ *
+ * @return $this
+ */
+ public function setNoTime($noTime)
+ {
+ $this->noTime = $noTime;
+
+ return $this;
+ }
+
+ /**
+ * @param int $sequence
+ *
+ * @return $this
+ */
+ public function setSequence($sequence)
+ {
+ $this->sequence = $sequence;
+
+ return $this;
+ }
+
+ /**
+ * @return int
+ */
+ public function getSequence()
+ {
+ return $this->sequence;
+ }
+
+ /**
+ * @param Organizer $organizer
+ *
+ * @return $this
+ */
+ public function setOrganizer(Organizer $organizer)
+ {
+ $this->organizer = $organizer;
+
+ return $this;
+ }
+
+ /**
+ * @param $summary
+ *
+ * @return $this
+ */
+ public function setSummary($summary)
+ {
+ $this->summary = $summary;
+
+ return $this;
+ }
+
+ /**
+ * @param $uniqueId
+ *
+ * @return $this
+ */
+ public function setUniqueId($uniqueId)
+ {
+ $this->uniqueId = $uniqueId;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getUniqueId()
+ {
+ return $this->uniqueId;
+ }
+
+ /**
+ * @param $url
+ *
+ * @return $this
+ */
+ public function setUrl($url)
+ {
+ $this->url = $url;
+
+ return $this;
+ }
+
+ /**
+ * @param $useTimezone
+ *
+ * @return $this
+ */
+ public function setUseTimezone($useTimezone)
+ {
+ $this->useTimezone = $useTimezone;
+
+ return $this;
+ }
+
+ /**
+ * @return bool
+ */
+ public function getUseTimezone()
+ {
+ return $this->useTimezone;
+ }
+
+ /**
+ * @param Attendees $attendees
+ *
+ * @return $this
+ */
+ public function setAttendees(Attendees $attendees)
+ {
+ $this->attendees = $attendees;
+
+ return $this;
+ }
+
+ /**
+ * @param string $attendee
+ * @param array $params
+ *
+ * @return $this
+ */
+ public function addAttendee($attendee, $params = array())
+ {
+ if (!isset($this->attendees)) {
+ $this->attendees = new Attendees();
+ }
+ $this->attendees->add($attendee, $params);
+
+ return $this;
+ }
+
+ /**
+ * @return Attendees
+ */
+ public function getAttendees()
+ {
+ return $this->attendees;
+ }
+
+ /**
+ * @param $description
+ *
+ * @return $this
+ */
+ public function setDescription($description)
+ {
+ $this->description = $description;
+
+ return $this;
+ }
+
+ /**
+ * @param $descriptionHTML
+ *
+ * @return $this
+ */
+ public function setDescriptionHTML($descriptionHTML)
+ {
+ $this->descriptionHTML = $descriptionHTML;
+
+ return $this;
+ }
+
+ /**
+ * @param bool $useUtc
+ *
+ * @return $this
+ */
+ public function setUseUtc($useUtc = true)
+ {
+ $this->useUtc = $useUtc;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * @return string
+ */
+ public function getDescriptionHTML()
+ {
+ return $this->descriptionHTML;
+ }
+
+ /**
+ * @param $status
+ *
+ * @return $this
+ */
+ public function setCancelled($status)
+ {
+ $this->cancelled = (bool) $status;
+
+ return $this;
+ }
+
+ /**
+ * @param $transparency
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setTimeTransparency($transparency)
+ {
+ $transparency = strtoupper($transparency);
+ if ($transparency === self::TIME_TRANSPARENCY_OPAQUE
+ || $transparency === self::TIME_TRANSPARENCY_TRANSPARENT
+ ) {
+ $this->transparency = $transparency;
+ } else {
+ throw new \InvalidArgumentException('Invalid value for transparancy');
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param $status
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setStatus($status)
+ {
+ $status = strtoupper($status);
+ if ($status == self::STATUS_CANCELLED
+ || $status == self::STATUS_CONFIRMED
+ || $status == self::STATUS_TENTATIVE
+ ) {
+ $this->status = $status;
+ } else {
+ throw new \InvalidArgumentException('Invalid value for status');
+ }
+
+ return $this;
+ }
+
+ /**
+ * @param RecurrenceRule $recurrenceRule
+ *
+ * @return $this
+ */
+ public function setRecurrenceRule(RecurrenceRule $recurrenceRule)
+ {
+ $this->recurrenceRule = $recurrenceRule;
+
+ return $this;
+ }
+
+ /**
+ * @return RecurrenceRule
+ */
+ public function getRecurrenceRule()
+ {
+ return $this->recurrenceRule;
+ }
+
+ /**
+ * @param $dtStamp
+ *
+ * @return $this
+ */
+ public function setCreated($dtStamp)
+ {
+ $this->created = $dtStamp;
+
+ return $this;
+ }
+
+ /**
+ * @param $dtStamp
+ *
+ * @return $this
+ */
+ public function setModified($dtStamp)
+ {
+ $this->modified = $dtStamp;
+
+ return $this;
+ }
+
+ /**
+ * @param $categories
+ *
+ * @return $this
+ */
+ public function setCategories($categories)
+ {
+ $this->categories = $categories;
+
+ return $this;
+ }
+
+ /**
+ * Sets the event privacy.
+ *
+ * @param bool $flag
+ *
+ * @return $this
+ */
+ public function setIsPrivate($flag)
+ {
+ $this->isPrivate = (bool) $flag;
+
+ return $this;
+ }
+
+ /**
+ * @param \DateTime $dateTime
+ *
+ * @return \Eluceo\iCal\Component\Event
+ */
+ public function addExDate(\DateTime $dateTime)
+ {
+ $this->exDates[] = $dateTime;
+
+ return $this;
+ }
+
+ /**
+ * @return \DateTime[]
+ */
+ public function getExDates()
+ {
+ return $this->exDates;
+ }
+
+ /**
+ * @param \DateTime[]
+ *
+ * @return \Eluceo\iCal\Component\Event
+ */
+ public function setExDates(array $exDates)
+ {
+ $this->exDates = $exDates;
+
+ return $this;
+ }
+
+ /**
+ * @return \Eluceo\iCal\Property\Event\RecurrenceId
+ */
+ public function getRecurrenceId()
+ {
+ return $this->recurrenceId;
+ }
+
+ /**
+ * @param RecurrenceId $recurrenceId
+ *
+ * @return \Eluceo\iCal\Component\Event
+ */
+ public function setRecurrenceId(RecurrenceId $recurrenceId)
+ {
+ $this->recurrenceId = $recurrenceId;
+
+ return $this;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php
new file mode 100644
index 00000000..c820d75b
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/Timezone.php
@@ -0,0 +1,57 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Component;
+
+use Eluceo\iCal\Component;
+use Eluceo\iCal\PropertyBag;
+
+/**
+ * Implementation of the TIMEZONE component.
+ */
+class Timezone extends Component
+{
+ /**
+ * @var string
+ */
+ protected $timezone;
+
+ public function __construct($timezone)
+ {
+ $this->timezone = $timezone;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return 'VTIMEZONE';
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildPropertyBag()
+ {
+ $propertyBag = new PropertyBag();
+
+ $propertyBag->set('TZID', $this->timezone);
+ $propertyBag->set('X-LIC-LOCATION', $this->timezone);
+
+ return $propertyBag;
+ }
+
+ public function getZoneIdentifier()
+ {
+ return $this->timezone;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php b/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php
new file mode 100644
index 00000000..97da4911
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Component/TimezoneRule.php
@@ -0,0 +1,215 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Component;
+
+use Eluceo\iCal\Component;
+use Eluceo\iCal\PropertyBag;
+use Eluceo\iCal\Property\Event\RecurrenceRule;
+
+/**
+ * Implementation of Standard Time and Daylight Saving Time observances (or rules)
+ * which define the TIMEZONE component.
+ */
+class TimezoneRule extends Component
+{
+ const TYPE_DAYLIGHT = 'DAYLIGHT';
+ const TYPE_STANDARD = 'STANDARD';
+
+ /**
+ * @var string
+ */
+ protected $type;
+
+ /**
+ * @var string
+ */
+ protected $tzOffsetFrom;
+
+ /**
+ * @var string
+ */
+ protected $tzOffsetTo;
+
+ /**
+ * @var string
+ */
+ protected $tzName;
+
+ /**
+ * @var \DateTime
+ */
+ protected $dtStart;
+
+ /**
+ * @var RecurrenceRule
+ */
+ protected $recurrenceRule;
+
+ /**
+ * create new Timezone Rule object by giving a rule type identifier.
+ *
+ * @param string $ruleType one of DAYLIGHT or STANDARD
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function __construct($ruleType)
+ {
+ $ruleType = strtoupper($ruleType);
+ if ($ruleType === self::TYPE_DAYLIGHT || $ruleType === self::TYPE_STANDARD) {
+ $this->type = $ruleType;
+ } else {
+ throw new \InvalidArgumentException('Invalid value for timezone rule type');
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function buildPropertyBag()
+ {
+ $propertyBag = new PropertyBag();
+
+ if ($this->getTzName()) {
+ $propertyBag->set('TZNAME', $this->getTzName());
+ }
+
+ if ($this->getTzOffsetFrom()) {
+ $propertyBag->set('TZOFFSETFROM', $this->getTzOffsetFrom());
+ }
+
+ if ($this->getTzOffsetTo()) {
+ $propertyBag->set('TZOFFSETTO', $this->getTzOffsetTo());
+ }
+
+ if ($this->getDtStart()) {
+ $propertyBag->set('DTSTART', $this->getDtStart());
+ }
+
+ if ($this->recurrenceRule) {
+ $propertyBag->set('RRULE', $this->recurrenceRule);
+ }
+
+ return $propertyBag;
+ }
+
+ /**
+ * @param $offset
+ *
+ * @return $this
+ */
+ public function setTzOffsetFrom($offset)
+ {
+ $this->tzOffsetFrom = $offset;
+
+ return $this;
+ }
+
+ /**
+ * @param $offset
+ *
+ * @return $this
+ */
+ public function setTzOffsetTo($offset)
+ {
+ $this->tzOffsetTo = $offset;
+
+ return $this;
+ }
+
+ /**
+ * @param $name
+ *
+ * @return $this
+ */
+ public function setTzName($name)
+ {
+ $this->tzName = $name;
+
+ return $this;
+ }
+
+ /**
+ * @param \DateTime $dtStart
+ *
+ * @return $this
+ */
+ public function setDtStart(\DateTime $dtStart)
+ {
+ $this->dtStart = $dtStart;
+
+ return $this;
+ }
+
+ /**
+ * @param RecurrenceRule $recurrenceRule
+ *
+ * @return $this
+ */
+ public function setRecurrenceRule(RecurrenceRule $recurrenceRule)
+ {
+ $this->recurrenceRule = $recurrenceRule;
+
+ return $this;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTzOffsetFrom()
+ {
+ return $this->tzOffsetFrom;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTzOffsetTo()
+ {
+ return $this->tzOffsetTo;
+ }
+
+ /**
+ * @return string
+ */
+ public function getTzName()
+ {
+ return $this->tzName;
+ }
+
+ /**
+ * @return RecurrenceRule
+ */
+ public function getRecurrenceRule()
+ {
+ return $this->recurrenceRule;
+ }
+
+ /**
+ * @return mixed return string representation of start date or NULL if no date was given
+ */
+ public function getDtStart()
+ {
+ if ($this->dtStart) {
+ return $this->dtStart->format('Ymd\THis');
+ }
+
+ return;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/ParameterBag.php b/vendor/eluceo/ical/src/Eluceo/iCal/ParameterBag.php
new file mode 100644
index 00000000..9b0c24a1
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/ParameterBag.php
@@ -0,0 +1,108 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal;
+
+class ParameterBag
+{
+ /**
+ * The params.
+ *
+ * @var array
+ */
+ protected $params;
+
+ public function __construct($params = array())
+ {
+ $this->params = $params;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ */
+ public function setParam($name, $value)
+ {
+ $this->params[$name] = $value;
+ }
+
+ /**
+ * @param $name
+ */
+ public function getParam($name)
+ {
+ if (array_key_exists($name, $this->params)) {
+ return $this->params[$name];
+ }
+ }
+
+ /**
+ * Checks if there are any params.
+ *
+ * @return bool
+ */
+ public function hasParams()
+ {
+ return count($this->params) > 0;
+ }
+
+ /**
+ * @return string
+ */
+ public function toString()
+ {
+ $line = '';
+ foreach ($this->params as $param => $paramValues) {
+ if (!is_array($paramValues)) {
+ $paramValues = array($paramValues);
+ }
+ foreach ($paramValues as $k => $v) {
+ $paramValues[$k] = $this->escapeParamValue($v);
+ }
+
+ if ('' != $line) {
+ $line .= ';';
+ }
+
+ $line .= $param . '=' . implode(',', $paramValues);
+ }
+
+ return $line;
+ }
+
+ /**
+ * Returns an escaped string for a param value.
+ *
+ * @param string $value
+ *
+ * @return string
+ */
+ public function escapeParamValue($value)
+ {
+ $count = 0;
+ $value = str_replace('\\', '\\\\', $value);
+ $value = str_replace('"', '\"', $value, $count);
+ $value = str_replace("\n", '\\n', $value);
+ if (false !== strpos($value, ';') || false !== strpos($value, ',') || false !== strpos($value, ':') || $count) {
+ $value = '"' . $value . '"';
+ }
+
+ return $value;
+ }
+
+ /**
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->toString();
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property.php
new file mode 100644
index 00000000..1bf2c3f0
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property.php
@@ -0,0 +1,148 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal;
+
+use Eluceo\iCal\Property\ArrayValue;
+use Eluceo\iCal\Property\StringValue;
+use Eluceo\iCal\Property\ValueInterface;
+
+/**
+ * The Property Class represents a property as defined in RFC 2445.
+ *
+ * The content of a line (unfolded) will be rendered in this class
+ */
+class Property
+{
+ /**
+ * The value of the Property.
+ *
+ * @var ValueInterface
+ */
+ protected $value;
+
+ /**
+ * The params of the Property.
+ *
+ * @var ParameterBag
+ */
+ protected $parameterBag;
+
+ /**
+ * @var string
+ */
+ protected $name;
+
+ /**
+ * @param $name
+ * @param $value
+ * @param array $params
+ */
+ public function __construct($name, $value, $params = array())
+ {
+ $this->name = $name;
+ $this->setValue($value);
+ $this->parameterBag = new ParameterBag($params);
+ }
+
+ /**
+ * Renders an unfolded line.
+ *
+ * @return string
+ */
+ public function toLine()
+ {
+ // Property-name
+ $line = $this->getName();
+
+ // Adding params
+ //@todo added check for $this->parameterBag because doctrine/orm proxies won't execute constructor - ok?
+ if ($this->parameterBag && $this->parameterBag->hasParams()) {
+ $line .= ';' . $this->parameterBag->toString();
+ }
+
+ // Property value
+ $line .= ':' . $this->value->getEscapedValue();
+
+ return $line;
+ }
+
+ /**
+ * Get all unfolded lines.
+ *
+ * @return array
+ */
+ public function toLines()
+ {
+ return array($this->toLine());
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return $this
+ */
+ public function setParam($name, $value)
+ {
+ $this->parameterBag->setParam($name, $value);
+
+ return $this;
+ }
+
+ /**
+ * @param $name
+ */
+ public function getParam($name)
+ {
+ return $this->parameterBag->getParam($name);
+ }
+
+ /**
+ * @param mixed $value
+ *
+ * @return $this
+ *
+ * @throws \Exception
+ */
+ public function setValue($value)
+ {
+ if (is_scalar($value)) {
+ $this->value = new StringValue($value);
+ } elseif (is_array($value)) {
+ $this->value = new ArrayValue($value);
+ } else {
+ if (!$value instanceof ValueInterface) {
+ throw new \Exception('The value must implement the ValueInterface.');
+ } else {
+ $this->value = $value;
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/ArrayValue.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/ArrayValue.php
new file mode 100644
index 00000000..314787a0
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/ArrayValue.php
@@ -0,0 +1,43 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property;
+
+use Eluceo\iCal\Util\PropertyValueUtil;
+
+class ArrayValue implements ValueInterface
+{
+ /**
+ * The value.
+ *
+ * @var array
+ */
+ protected $values;
+
+ public function __construct(array $values)
+ {
+ $this->values = $values;
+ }
+
+ public function setValues(array $values)
+ {
+ $this->values = $values;
+
+ return $this;
+ }
+
+ public function getEscapedValue()
+ {
+ return implode(',', array_map(function ($value) {
+ return PropertyValueUtil::escapeValue((string) $value);
+ }, $this->values));
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimeProperty.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimeProperty.php
new file mode 100644
index 00000000..d0fd495e
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimeProperty.php
@@ -0,0 +1,38 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property;
+
+use Eluceo\iCal\Property;
+use Eluceo\iCal\Util\DateUtil;
+
+class DateTimeProperty extends Property
+{
+ /**
+ * @param string $name
+ * @param \DateTime $dateTime
+ * @param bool $noTime
+ * @param bool $useTimezone
+ * @param bool $useUtc
+ */
+ public function __construct(
+ $name,
+ \DateTime $dateTime = null,
+ $noTime = false,
+ $useTimezone = false,
+ $useUtc = false
+ ) {
+ $dateString = DateUtil::getDateString($dateTime, $noTime, $useTimezone, $useUtc);
+ $params = DateUtil::getDefaultParams($dateTime, $noTime, $useTimezone);
+
+ parent::__construct($name, $dateString, $params);
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimesProperty.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimesProperty.php
new file mode 100644
index 00000000..6242f285
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/DateTimesProperty.php
@@ -0,0 +1,41 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property;
+
+use Eluceo\iCal\Property;
+use Eluceo\iCal\Util\DateUtil;
+
+class DateTimesProperty extends Property
+{
+ /**
+ * @param string $name
+ * @param \DateTime[] $dateTimes
+ * @param bool $noTime
+ * @param bool $useTimezone
+ * @param bool $useUtc
+ */
+ public function __construct(
+ $name,
+ $dateTimes = array(),
+ $noTime = false,
+ $useTimezone = false,
+ $useUtc = false
+ ) {
+ $dates = array();
+ foreach ($dateTimes as $dateTime) {
+ $dates[] = DateUtil::getDateString($dateTime, $noTime, $useTimezone, $useUtc);
+ }
+ $params = DateUtil::getDefaultParams($dateTime, $noTime, $useTimezone);
+
+ parent::__construct($name, $dates, $params);
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Attendees.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Attendees.php
new file mode 100644
index 00000000..dbb36e7d
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Attendees.php
@@ -0,0 +1,102 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+use Eluceo\iCal\Property;
+
+class Attendees extends Property
+{
+ /** @var Property[] */
+ protected $attendees = array();
+
+ const PROPERTY_NAME = 'ATTENDEES';
+
+ public function __construct()
+ {
+ // Overwrites constructor functionality of Property
+ }
+
+ /**
+ * @param $value
+ * @param array $params
+ *
+ * @return $this
+ */
+ public function add($value, $params = array())
+ {
+ $this->attendees[] = new Property('ATTENDEE', $value, $params);
+
+ return $this;
+ }
+
+ /**
+ * @param Property[] $value
+ *
+ * @return $this
+ */
+ public function setValue($value)
+ {
+ $this->attendees = $value;
+
+ return $this;
+ }
+
+ /**
+ * @return Property[]
+ */
+ public function getValue()
+ {
+ return $this->attendees;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function toLines()
+ {
+ $lines = array();
+ foreach ($this->attendees as $attendee) {
+ $lines[] = $attendee->toLine();
+ }
+
+ return $lines;
+ }
+
+ /**
+ * @param string $name
+ * @param mixed $value
+ *
+ * @throws \BadMethodCallException
+ */
+ public function setParam($name, $value)
+ {
+ throw new \BadMethodCallException('Cannot call setParam on Attendees Property');
+ }
+
+ /**
+ * @param $name
+ *
+ * @throws \BadMethodCallException
+ */
+ public function getParam($name)
+ {
+ throw new \BadMethodCallException('Cannot call getParam on Attendees Property');
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return self::PROPERTY_NAME;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Description.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Description.php
new file mode 100644
index 00000000..b0dbb3c1
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Description.php
@@ -0,0 +1,66 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+use Eluceo\iCal\Property\ValueInterface;
+use Eluceo\iCal\Util\PropertyValueUtil;
+
+/**
+ * Class Description
+ * Alows new line charectars to be in the description.
+ */
+class Description implements ValueInterface
+{
+ /**
+ * The value.
+ *
+ * @var string
+ */
+ protected $value;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * Return the value of the Property as an escaped string.
+ *
+ * Escape values as per RFC 2445. See http://www.kanzaki.com/docs/ical/text.html
+ *
+ * @return string
+ */
+ public function getEscapedValue()
+ {
+ return PropertyValueUtil::escapeValue((string) $this->value);
+ }
+
+ /**
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function setValue($value)
+ {
+ $this->value = $value;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Organizer.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Organizer.php
new file mode 100644
index 00000000..a91a75d2
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/Organizer.php
@@ -0,0 +1,39 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+use Eluceo\iCal\Property;
+
+/**
+ * Class Organizer.
+ */
+class Organizer extends Property
+{
+ const PROPERTY_NAME = 'ORGANIZER';
+
+ /**
+ * @param string $value
+ * @param array $params
+ */
+ public function __construct($value, $params = array())
+ {
+ parent::__construct(self::PROPERTY_NAME, $value, $params);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return self::PROPERTY_NAME;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceId.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceId.php
new file mode 100644
index 00000000..2a684dda
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceId.php
@@ -0,0 +1,130 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+use Eluceo\iCal\ParameterBag;
+use Eluceo\iCal\Property;
+use Eluceo\iCal\Util\DateUtil;
+use Eluceo\iCal\Property\ValueInterface;
+
+/**
+ * Implementation of Recurrence Id.
+ *
+ * @see http://www.ietf.org/rfc/rfc2445.txt 4.8.4.4 Recurrence ID
+ */
+class RecurrenceId extends Property
+{
+ const PROPERTY_NAME = 'RECURRENCE-ID';
+
+ /**
+ * The effective range of recurrence instances from the instance
+ * specified by the recurrence identifier specified by the property.
+ */
+ const RANGE_THISANDPRIOR = 'THISANDPRIOR';
+ const RANGE_THISANDFUTURE = 'THISANDFUTURE';
+
+ /**
+ * The dateTime to identify a particular instance of a recurring event which is getting modified.
+ *
+ * @var \DateTime
+ */
+ protected $dateTime;
+
+ /**
+ * Specify the effective range of recurrence instances from the instance.
+ *
+ * @var string
+ */
+ protected $range;
+
+ public function __construct(\DateTime $dateTime = null)
+ {
+ $this->parameterBag = new ParameterBag();
+ if (isset($dateTime)) {
+ $this->dateTime = $dateTime;
+ }
+ }
+
+ public function applyTimeSettings($noTime = false, $useTimezone = false, $useUtc = false)
+ {
+ $params = DateUtil::getDefaultParams($this->dateTime, $noTime, $useTimezone, $useUtc);
+ foreach ($params as $name => $value) {
+ $this->parameterBag->setParam($name, $value);
+ }
+
+ if ($this->range) {
+ $this->parameterBag->setParam('RANGE', $this->range);
+ }
+
+ $this->setValue(DateUtil::getDateString($this->dateTime, $noTime, $useTimezone, $useUtc));
+ }
+
+ /**
+ * @return DateTime
+ */
+ public function getDatetime()
+ {
+ return $this->dateTime;
+ }
+
+ /**
+ * @param \DateTime $dateTime
+ *
+ * @return \Eluceo\iCal\Property\Event\RecurrenceId
+ */
+ public function setDatetime(\DateTime $dateTime)
+ {
+ $this->dateTime = $dateTime;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getRange()
+ {
+ return $this->range;
+ }
+
+ /**
+ * @param string $range
+ *
+ * @return \Eluceo\iCal\Property\Event\RecurrenceId
+ */
+ public function setRange($range)
+ {
+ $this->range = $range;
+ }
+
+ /**
+ * Get all unfolded lines.
+ *
+ * @return array
+ */
+ public function toLines()
+ {
+ if (!$this->value instanceof ValueInterface) {
+ throw new \Exception('The value must implement the ValueInterface. Call RecurrenceId::applyTimeSettings() before adding RecurrenceId.');
+ } else {
+ return parent::toLines();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getName()
+ {
+ return self::PROPERTY_NAME;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceRule.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceRule.php
new file mode 100644
index 00000000..32533449
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/Event/RecurrenceRule.php
@@ -0,0 +1,444 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+use Eluceo\iCal\Property\ValueInterface;
+use Eluceo\iCal\ParameterBag;
+use InvalidArgumentException;
+
+/**
+ * Implementation of Recurrence Rule.
+ *
+ * @see http://www.ietf.org/rfc/rfc2445.txt 3.3.10. Recurrence Rule
+ */
+class RecurrenceRule implements ValueInterface
+{
+ const FREQ_YEARLY = 'YEARLY';
+ const FREQ_MONTHLY = 'MONTHLY';
+ const FREQ_WEEKLY = 'WEEKLY';
+ const FREQ_DAILY = 'DAILY';
+
+ const WEEKDAY_SUNDAY = 'SU';
+ const WEEKDAY_MONDAY = 'MO';
+ const WEEKDAY_TUESDAY = 'TU';
+ const WEEKDAY_WEDNESDAY = 'WE';
+ const WEEKDAY_THURSDAY = 'TH';
+ const WEEKDAY_FRIDAY = 'FR';
+ const WEEKDAY_SATURDAY = 'SA';
+
+ /**
+ * The frequency of an Event.
+ *
+ * @var string
+ */
+ protected $freq = self::FREQ_YEARLY;
+
+ /**
+ * @var null|int
+ */
+ protected $interval = 1;
+
+ /**
+ * @var null|int
+ */
+ protected $count = null;
+
+ /**
+ * @var null|\DateTime
+ */
+ protected $until = null;
+
+ /**
+ * @var null|string
+ */
+ protected $wkst;
+
+ /**
+ * @var null|string
+ */
+ protected $byMonth;
+
+ /**
+ * @var null|string
+ */
+ protected $byWeekNo;
+
+ /**
+ * @var null|string
+ */
+ protected $byYearDay;
+
+ /**
+ * @var null|string
+ */
+ protected $byMonthDay;
+
+ /**
+ * @var null|string
+ */
+ protected $byDay;
+
+ /**
+ * @var null|string
+ */
+ protected $byHour;
+
+ /**
+ * @var null|string
+ */
+ protected $byMinute;
+
+ /**
+ * @var null|string
+ */
+ protected $bySecond;
+
+ /**
+ * Return the value of the Property as an escaped string.
+ *
+ * Escape values as per RFC 2445. See http://www.kanzaki.com/docs/ical/text.html
+ *
+ * @return string
+ */
+ public function getEscapedValue()
+ {
+ return $this->buildParameterBag()->toString();
+ }
+
+ /**
+ * @return ParameterBag
+ */
+ protected function buildParameterBag()
+ {
+ $parameterBag = new ParameterBag();
+
+ $parameterBag->setParam('FREQ', $this->freq);
+
+ if (null !== $this->interval) {
+ $parameterBag->setParam('INTERVAL', $this->interval);
+ }
+
+ if (null !== $this->count) {
+ $parameterBag->setParam('COUNT', $this->count);
+ }
+
+ if (null != $this->until) {
+ $parameterBag->setParam('UNTIL', $this->until->format('Ymd\THis\Z'));
+ }
+
+ if (null !== $this->wkst) {
+ $parameterBag->setParam('WKST', $this->wkst);
+ }
+
+ if (null !== $this->byMonth) {
+ $parameterBag->setParam('BYMONTH', $this->byMonth);
+ }
+
+ if (null !== $this->byWeekNo) {
+ $parameterBag->setParam('BYWEEKNO', $this->byWeekNo);
+ }
+
+ if (null !== $this->byYearDay) {
+ $parameterBag->setParam('BYYEARDAY', $this->byYearDay);
+ }
+
+ if (null !== $this->byMonthDay) {
+ $parameterBag->setParam('BYMONTHDAY', $this->byMonthDay);
+ }
+
+ if (null !== $this->byDay) {
+ $parameterBag->setParam('BYDAY', $this->byDay);
+ }
+
+ if (null !== $this->byHour) {
+ $parameterBag->setParam('BYHOUR', $this->byHour);
+ }
+
+ if (null !== $this->byMinute) {
+ $parameterBag->setParam('BYMINUTE', $this->byMinute);
+ }
+
+ if (null !== $this->bySecond) {
+ $parameterBag->setParam('BYSECOND', $this->bySecond);
+ }
+
+ return $parameterBag;
+ }
+
+ /**
+ * @param int|null $count
+ *
+ * @return $this
+ */
+ public function setCount($count)
+ {
+ $this->count = $count;
+
+ return $this;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getCount()
+ {
+ return $this->count;
+ }
+
+ /**
+ * @param \DateTime|null $until
+ *
+ * @return $this
+ */
+ public function setUntil(\DateTime $until = null)
+ {
+ $this->until = $until;
+
+ return $this;
+ }
+
+ /**
+ * @return \DateTime|null
+ */
+ public function getUntil()
+ {
+ return $this->until;
+ }
+
+ /**
+ * The FREQ rule part identifies the type of recurrence rule. This
+ * rule part MUST be specified in the recurrence rule. Valid values
+ * include.
+ *
+ * SECONDLY, to specify repeating events based on an interval of a second or more;
+ * MINUTELY, to specify repeating events based on an interval of a minute or more;
+ * HOURLY, to specify repeating events based on an interval of an hour or more;
+ * DAILY, to specify repeating events based on an interval of a day or more;
+ * WEEKLY, to specify repeating events based on an interval of a week or more;
+ * MONTHLY, to specify repeating events based on an interval of a month or more;
+ * YEARLY, to specify repeating events based on an interval of a year or more.
+ *
+ * @param string $freq
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setFreq($freq)
+ {
+ if (self::FREQ_YEARLY === $freq || self::FREQ_MONTHLY === $freq
+ || self::FREQ_WEEKLY === $freq
+ || self::FREQ_DAILY === $freq
+ ) {
+ $this->freq = $freq;
+ } else {
+ throw new \InvalidArgumentException("The Frequency {$freq} is not supported.");
+ }
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getFreq()
+ {
+ return $this->freq;
+ }
+
+ /**
+ * The INTERVAL rule part contains a positive integer representing at
+ * which intervals the recurrence rule repeats.
+ *
+ * @param int|null $interval
+ *
+ * @return $this
+ */
+ public function setInterval($interval)
+ {
+ $this->interval = $interval;
+
+ return $this;
+ }
+
+ /**
+ * @return int|null
+ */
+ public function getInterval()
+ {
+ return $this->interval;
+ }
+
+ /**
+ * The WKST rule part specifies the day on which the workweek starts.
+ * Valid values are MO, TU, WE, TH, FR, SA, and SU.
+ *
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function setWkst($value)
+ {
+ $this->wkst = $value;
+
+ return $this;
+ }
+
+ /**
+ * The BYMONTH rule part specifies a COMMA-separated list of months of the year.
+ * Valid values are 1 to 12.
+ *
+ * @param int $month
+ *
+ * @throws InvalidArgumentException
+ *
+ * @return $this
+ */
+ public function setByMonth($month)
+ {
+ if (!is_integer($month) || $month < 0 || $month > 12) {
+ throw new InvalidArgumentException('Invalid value for BYMONTH');
+ }
+
+ $this->byMonth = $month;
+
+ return $this;
+ }
+
+ /**
+ * The BYWEEKNO rule part specifies a COMMA-separated list of ordinals specifying weeks of the year.
+ * Valid values are 1 to 53 or -53 to -1.
+ *
+ * @param int $value
+ *
+ * @return $this
+ */
+ public function setByWeekNo($value)
+ {
+ $this->byWeekNo = $value;
+
+ return $this;
+ }
+
+ /**
+ * The BYYEARDAY rule part specifies a COMMA-separated list of days of the year.
+ * Valid values are 1 to 366 or -366 to -1.
+ *
+ * @param int $day
+ *
+ * @return $this
+ */
+ public function setByYearDay($day)
+ {
+ $this->byYearDay = $day;
+
+ return $this;
+ }
+
+ /**
+ * The BYMONTHDAY rule part specifies a COMMA-separated list of days of the month.
+ * Valid values are 1 to 31 or -31 to -1.
+ *
+ * @param int $day
+ *
+ * @return $this
+ */
+ public function setByMonthDay($day)
+ {
+ $this->byMonthDay = $day;
+
+ return $this;
+ }
+
+ /**
+ * The BYDAY rule part specifies a COMMA-separated list of days of the week;.
+ *
+ * SU indicates Sunday; MO indicates Monday; TU indicates Tuesday;
+ * WE indicates Wednesday; TH indicates Thursday; FR indicates Friday; and SA indicates Saturday.
+ *
+ * Each BYDAY value can also be preceded by a positive (+n) or negative (-n) integer.
+ * If present, this indicates the nth occurrence of a specific day within the MONTHLY or YEARLY "RRULE".
+ *
+ * @param string $day
+ *
+ * @return $this
+ */
+ public function setByDay($day)
+ {
+ $this->byDay = $day;
+
+ return $this;
+ }
+
+ /**
+ * The BYHOUR rule part specifies a COMMA-separated list of hours of the day.
+ * Valid values are 0 to 23.
+ *
+ * @param int $value
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setByHour($value)
+ {
+ if (!is_integer($value) || $value < 0 || $value > 23) {
+ throw new \InvalidArgumentException('Invalid value for BYHOUR');
+ }
+
+ $this->byHour = $value;
+
+ return $this;
+ }
+
+ /**
+ * The BYMINUTE rule part specifies a COMMA-separated list of minutes within an hour.
+ * Valid values are 0 to 59.
+ *
+ * @param int $value
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setByMinute($value)
+ {
+ if (!is_integer($value) || $value < 0 || $value > 59) {
+ throw new \InvalidArgumentException('Invalid value for BYMINUTE');
+ }
+
+ $this->byMinute = $value;
+
+ return $this;
+ }
+
+ /**
+ * The BYSECOND rule part specifies a COMMA-separated list of seconds within a minute.
+ * Valid values are 0 to 60.
+ *
+ * @param int $value
+ *
+ * @return $this
+ *
+ * @throws \InvalidArgumentException
+ */
+ public function setBySecond($value)
+ {
+ if (!is_integer($value) || $value < 0 || $value > 60) {
+ throw new \InvalidArgumentException('Invalid value for BYSECOND');
+ }
+
+ $this->bySecond = $value;
+
+ return $this;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/StringValue.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/StringValue.php
new file mode 100644
index 00000000..4995723b
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/StringValue.php
@@ -0,0 +1,61 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property;
+
+use Eluceo\iCal\Util\PropertyValueUtil;
+
+class StringValue implements ValueInterface
+{
+ /**
+ * The value.
+ *
+ * @var string
+ */
+ protected $value;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ /**
+ * Return the value of the Property as an escaped string.
+ *
+ * Escape values as per RFC 2445. See http://www.kanzaki.com/docs/ical/text.html
+ *
+ * @return string
+ */
+ public function getEscapedValue()
+ {
+ return PropertyValueUtil::escapeValue((string) $this->value);
+ }
+
+ /**
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function setValue($value)
+ {
+ $this->value = $value;
+
+ return $this;
+ }
+
+ /**
+ * @return string
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Property/ValueInterface.php b/vendor/eluceo/ical/src/Eluceo/iCal/Property/ValueInterface.php
new file mode 100644
index 00000000..cc3d885c
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Property/ValueInterface.php
@@ -0,0 +1,24 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Property;
+
+interface ValueInterface
+{
+ /**
+ * Return the value of the Property as an escaped string.
+ *
+ * Escape values as per RFC 2445. See http://www.kanzaki.com/docs/ical/text.html
+ *
+ * @return string
+ */
+ public function getEscapedValue();
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/PropertyBag.php b/vendor/eluceo/ical/src/Eluceo/iCal/PropertyBag.php
new file mode 100644
index 00000000..7032360b
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/PropertyBag.php
@@ -0,0 +1,79 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal;
+
+class PropertyBag implements \IteratorAggregate
+{
+ /**
+ * @var array
+ */
+ protected $elements = array();
+
+ /**
+ * Creates a new Property with $name, $value and $params.
+ *
+ * @param $name
+ * @param $value
+ * @param array $params
+ *
+ * @return $this
+ */
+ public function set($name, $value, $params = array())
+ {
+ $property = new Property($name, $value, $params);
+ $this->elements[] = $property;
+
+ return $this;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return null|Property
+ */
+ public function get($name)
+ {
+ // Searching Property in elements-array
+ /** @var $property Property */
+ foreach ($this->elements as $property) {
+ if ($property->getName() == $name) {
+ return $property;
+ }
+ }
+ }
+
+ /**
+ * Adds a Property. If Property already exists an Exception will be thrown.
+ *
+ * @param Property $property
+ *
+ * @return $this
+ *
+ * @throws \Exception
+ */
+ public function add(Property $property)
+ {
+ // Property already exists?
+ if (null !== $this->get($property->getName())) {
+ throw new \Exception("Property with name '{$property->getName()}' already exists");
+ }
+
+ $this->elements[] = $property;
+
+ return $this;
+ }
+
+ public function getIterator()
+ {
+ return new \ArrayObject($this->elements);
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Util/ComponentUtil.php b/vendor/eluceo/ical/src/Eluceo/iCal/Util/ComponentUtil.php
new file mode 100644
index 00000000..ca6a2be0
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Util/ComponentUtil.php
@@ -0,0 +1,48 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Util;
+
+class ComponentUtil
+{
+ /**
+ * Folds a single line.
+ *
+ * According to RFC 2445, all lines longer than 75 characters will be folded
+ *
+ * @link http://www.ietf.org/rfc/rfc2445.txt
+ *
+ * @param $string
+ *
+ * @return array
+ */
+ public static function fold($string)
+ {
+ $lines = array();
+ $array = preg_split('/(?<!^)(?!$)/u', $string);
+
+ $line = '';
+ $lineNo = 0;
+ foreach ($array as $char) {
+ $charLen = strlen($char);
+ $lineLen = strlen($line);
+ if ($lineLen + $charLen > 75) {
+ $line = ' ' . $char;
+ ++$lineNo;
+ } else {
+ $line .= $char;
+ }
+ $lines[$lineNo] = $line;
+ }
+
+ return $lines;
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Util/DateUtil.php b/vendor/eluceo/ical/src/Eluceo/iCal/Util/DateUtil.php
new file mode 100644
index 00000000..3bd3367f
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Util/DateUtil.php
@@ -0,0 +1,69 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Util;
+
+class DateUtil
+{
+ public static function getDefaultParams(\DateTime $dateTime = null, $noTime = false, $useTimezone = false)
+ {
+ $params = array();
+
+ if ($useTimezone) {
+ $timeZone = $dateTime->getTimezone()->getName();
+ $params['TZID'] = $timeZone;
+ }
+
+ if ($noTime) {
+ $params['VALUE'] = 'DATE';
+ }
+
+ return $params;
+ }
+
+ /**
+ * Returns a formatted date string.
+ *
+ * @param \DateTime|null $dateTime The DateTime object
+ * @param bool $noTime Indicates if the time will be added
+ * @param bool $useTimezone
+ * @param bool $useUtc
+ *
+ * @return mixed
+ */
+ public static function getDateString(\DateTime $dateTime = null, $noTime = false, $useTimezone = false, $useUtc = false)
+ {
+ if (empty($dateTime)) {
+ $dateTime = new \DateTime();
+ }
+
+ return $dateTime->format(self::getDateFormat($noTime, $useTimezone, $useUtc));
+ }
+
+ /**
+ * Returns the date format that can be passed to DateTime::format().
+ *
+ * @param bool $noTime Indicates if the time will be added
+ * @param bool $useTimezone
+ * @param bool $useUtc
+ *
+ * @return string
+ */
+ public static function getDateFormat($noTime = false, $useTimezone = false, $useUtc = false)
+ {
+ // Do not use UTC time (Z) if timezone support is enabled.
+ if ($useTimezone || !$useUtc) {
+ return $noTime ? 'Ymd' : 'Ymd\THis';
+ }
+
+ return $noTime ? 'Ymd' : 'Ymd\THis\Z';
+ }
+}
diff --git a/vendor/eluceo/ical/src/Eluceo/iCal/Util/PropertyValueUtil.php b/vendor/eluceo/ical/src/Eluceo/iCal/Util/PropertyValueUtil.php
new file mode 100644
index 00000000..40538589
--- /dev/null
+++ b/vendor/eluceo/ical/src/Eluceo/iCal/Util/PropertyValueUtil.php
@@ -0,0 +1,40 @@
+<?php
+
+/*
+ * This file is part of the eluceo/iCal package.
+ *
+ * (c) Markus Poerschke <markus@eluceo.de>
+ *
+ * This source file is subject to the MIT license that is bundled
+ * with this source code in the file LICENSE.
+ */
+
+namespace Eluceo\iCal\Util;
+
+class PropertyValueUtil
+{
+ public static function escapeValue($value)
+ {
+ $value = self::escapeValueAllowNewLine($value);
+ $value = str_replace("\n", '\\n', $value);
+
+ return $value;
+ }
+
+ public static function escapeValueAllowNewLine($value)
+ {
+ $value = str_replace('\\', '\\\\', $value);
+ $value = str_replace('"', '\\"', $value);
+ $value = str_replace(',', '\\,', $value);
+ $value = str_replace(';', '\\;', $value);
+ $value = str_replace(array(
+ "\x00", "\x01", "\x02", "\x03", "\x04", "\x05", "\x06", "\x07",
+ "\x08", "\x09", /* \n*/ "\x0B", "\x0C", "\x0D", "\x0E", "\x0F",
+ "\x10", "\x11", "\x12", "\x13", "\x14", "\x15", "\x16", "\x17",
+ "\x18", "\x19", "\x1A", "\x1B", "\x1C", "\x1D", "\x1E", "\x1F",
+ "\x7F",
+ ), '', $value);
+
+ return $value;
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Component/CalendarIntegrationTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Component/CalendarIntegrationTest.php
new file mode 100644
index 00000000..eb869af8
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Component/CalendarIntegrationTest.php
@@ -0,0 +1,64 @@
+<?php
+
+namespace Eluceo\iCal\Component;
+
+class CalendarIntegrationTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @coversNothing
+ */
+ public function testExample3()
+ {
+ $timeZone = new \DateTimeZone('Europe/Berlin');
+
+ // 1. Create new calendar
+ $vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+
+ // 2. Create an event
+ $vEvent = new \Eluceo\iCal\Component\Event('123456');
+ $vEvent->setDtStart(new \DateTime('2012-12-31', $timeZone));
+ $vEvent->setDtEnd(new \DateTime('2012-12-31', $timeZone));
+ $vEvent->setNoTime(true);
+ $vEvent->setIsPrivate(true);
+ $vEvent->setSummary('New Year’s Eve');
+
+ // Set recurrence rule
+ $recurrenceRule = new \Eluceo\iCal\Property\Event\RecurrenceRule();
+ $recurrenceRule->setFreq(\Eluceo\iCal\Property\Event\RecurrenceRule::FREQ_YEARLY);
+ $recurrenceRule->setInterval(1);
+ $vEvent->setRecurrenceRule($recurrenceRule);
+
+ // Adding Timezone (optional)
+ $vEvent->setUseTimezone(true);
+
+ // 3. Add event to calendar
+ $vCalendar->addComponent($vEvent);
+
+ $lines = array(
+ '/BEGIN:VCALENDAR/',
+ '/VERSION:2\.0/',
+ '/PRODID:www\.example\.com/',
+ '/X-PUBLISHED-TTL:P1W/',
+ '/BEGIN:VEVENT/',
+ '/UID:123456/',
+ '/DTSTART;TZID=Europe\/Berlin;VALUE=DATE:20121231/',
+ '/SEQUENCE:0/',
+ '/TRANSP:OPAQUE/',
+ '/DTEND;TZID=Europe\/Berlin;VALUE=DATE:20121231/',
+ '/SUMMARY:New Year’s Eve/',
+ '/CLASS:PRIVATE/',
+ '/RRULE:FREQ=YEARLY;INTERVAL=1/',
+ '/X-MICROSOFT-CDO-ALLDAYEVENT:TRUE/',
+ '/DTSTAMP:20\d{6}T\d{6}Z/',
+ '/END:VEVENT/',
+ '/END:VCALENDAR/',
+ );
+
+ foreach (explode("\n", $vCalendar->render()) as $key => $line)
+ {
+ $this->assertTrue(isset($lines[$key]), 'Too many lines... ' . $line);
+
+ $this->assertRegExp($lines[$key], $line);
+ }
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/ComponentTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/ComponentTest.php
new file mode 100644
index 00000000..5cac7c5d
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/ComponentTest.php
@@ -0,0 +1,45 @@
+<?php
+
+namespace Eluceo\iCal;
+
+class ComponentTest extends \PHPUnit_Framework_TestCase
+{
+ public function testFoldWithMultibyte()
+ {
+ $input = "x" . str_repeat("あいうえお", 5);
+
+ $vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+ $vEvent = new \Eluceo\iCal\Component\Event();
+ $vEvent->setDtStart(new \DateTime('2014-12-24'));
+ $vEvent->setDtEnd(new \DateTime('2014-12-24'));
+ $vEvent->setDescription($input);
+
+ $vAlarm = new \Eluceo\iCal\Component\Alarm;
+ $vAlarm->setAction(\Eluceo\iCal\Component\Alarm::ACTION_DISPLAY);
+ $vAlarm->setDescription($input);
+ $vAlarm->setTrigger('PT0S', true);
+ $vEvent->addComponent($vAlarm);
+
+ $vCalendar->addComponent($vEvent);
+
+ $output = $vCalendar->render();
+ $output = preg_replace('/\r\n /u', '', $output);
+ $this->assertContains($input, $output);
+ }
+
+ public function testDescriptionWithNewLines()
+ {
+ $input = "new string \n new line \n new line \n new string";
+
+ $vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+ $vEvent = new \Eluceo\iCal\Component\Event();
+ $vEvent->setDtStart(new \DateTime('2014-12-24'));
+ $vEvent->setDtEnd(new \DateTime('2014-12-24'));
+ $vEvent->setDescription($input);
+
+ $vCalendar->addComponent($vEvent);
+
+ $output = $vCalendar->render();
+ $this->assertContains(str_replace("\n", "\\n", $input), $output);
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/ParameterBagTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/ParameterBagTest.php
new file mode 100644
index 00000000..0fb6e84c
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/ParameterBagTest.php
@@ -0,0 +1,35 @@
+<?php
+
+namespace Eluceo\iCal;
+
+class ParameterBagTest extends \PHPUnit_Framework_TestCase
+{
+ public function testEscapeParamValue()
+ {
+ $propertyObject = new ParameterBag;
+
+ $this->assertEquals(
+ 'test string',
+ $propertyObject->escapeParamValue('test string'),
+ 'No escaping necessary'
+ );
+
+ $this->assertEquals(
+ '"Containing \\"double-quotes\\""',
+ $propertyObject->escapeParamValue('Containing "double-quotes"'),
+ 'Text contains double quotes'
+ );
+
+ $this->assertEquals(
+ '"Containing forbidden chars like a ;"',
+ $propertyObject->escapeParamValue('Containing forbidden chars like a ;'),
+ 'Text with semicolon'
+ );
+
+ $this->assertEquals(
+ '"Containing forbidden chars like a :"',
+ $propertyObject->escapeParamValue('Containing forbidden chars like a :'),
+ 'Text with colon'
+ );
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Property/ArrayValueTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/ArrayValueTest.php
new file mode 100644
index 00000000..1d1b3331
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/ArrayValueTest.php
@@ -0,0 +1,26 @@
+<?php
+
+namespace Eluceo\iCal\Property;
+
+class ArrayValueTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @dataProvider arrayValuesProvider
+ */
+ public function testArrayValue($values, $expectedOutput)
+ {
+ $arrayValue = new ArrayValue($values);
+
+ $this->assertEquals($expectedOutput, $arrayValue->getEscapedValue());
+ }
+
+ public function arrayValuesProvider()
+ {
+ return array(
+ array(array(), ''),
+ array(array('Lorem'), 'Lorem'),
+ array(array('Lorem', 'Ipsum'), 'Lorem,Ipsum'),
+ array(array('Lorem', '"doublequotes"'), 'Lorem,\"doublequotes\"'),
+ );
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/DescriptionTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/DescriptionTest.php
new file mode 100644
index 00000000..0ad16bcc
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/DescriptionTest.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Eluceo\iCal\Property\Event;
+
+class DescriptionTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAllowsNewLines()
+ {
+ $testString = "New String \n New Line";
+ $description = new Description($testString);
+
+ $this->assertEquals(
+ str_replace("\n", "\\n", $testString),
+ $description->getEscapedValue()
+ );
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/OrganizerTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/OrganizerTest.php
new file mode 100644
index 00000000..71acdce9
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/OrganizerTest.php
@@ -0,0 +1,63 @@
+<?php
+/**
+ * Eluceo\iCal\Property\Event\OrganizerTest
+ *
+ * @author Giulio Troccoli <giulio@troccoli.it>
+ */
+
+namespace Eluceo\iCal\Property\Event;
+
+/**
+ * OrganizerTest
+ */
+class OrganizerTest extends \PHPUnit_Framework_TestCase
+{
+ public function testOrganizerValueOnly()
+ {
+ $value = "MAILTO:name.lastname@example.com";
+ $expected = "ORGANIZER:$value";
+
+ $vCalendar = $this->createCalendarWithOrganizer(
+ new \Eluceo\iCal\Property\Event\Organizer($value)
+ );
+
+ foreach (explode("\n", $vCalendar->render()) as $line)
+ {
+ if (preg_match('/^ORGANIZER[:;](.*)$/', $line)) {
+ $this->assertEquals($expected, trim($line));
+ }
+ }
+ }
+
+ public function testOrganizerValueAndParameter()
+ {
+ $value = "MAILTO:name.lastname@example.com";
+ $param = "Name LastName";
+ $expected = "ORGANIZER;CN=$param:$value";
+
+ $vCalendar = $this->createCalendarWithOrganizer(
+ new \Eluceo\iCal\Property\Event\Organizer($value, array('CN' => $param))
+ );
+
+ foreach (explode("\n", $vCalendar->render()) as $line)
+ {
+ if (preg_match('/^ORGANIZER[:;](.*)$/', $line)) {
+ $this->assertEquals($expected, trim($line));
+ }
+ }
+
+ }
+
+ /**
+ * @param Organizer $vOrganizer
+ * @return \Eluceo\iCal\Component\Calendar
+ */
+ private function createCalendarWithOrganizer(\Eluceo\iCal\Property\Event\Organizer $vOrganizer)
+ {
+ $vCalendar = new \Eluceo\iCal\Component\Calendar('www.example.com');
+ $vEvent = new \Eluceo\iCal\Component\Event('123456');
+ $vEvent->setOrganizer($vOrganizer);
+ $vCalendar->addComponent($vEvent);
+ return $vCalendar;
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/RecurrenceRuleTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/RecurrenceRuleTest.php
new file mode 100644
index 00000000..a44b2580
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/Event/RecurrenceRuleTest.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Eluceo\iCal\Property\Event;
+
+class RecurrenceRuleTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Example taken from http://www.kanzaki.com/docs/ical/rrule.html
+ */
+ public function testUntil()
+ {
+ $rule = new RecurrenceRule();
+ $rule->setFreq(RecurrenceRule::FREQ_DAILY);
+ $rule->setInterval(null);
+ $rule->setUntil(new \DateTime('1997-12-24'));
+ $this->assertEquals(
+ 'FREQ=DAILY;UNTIL=19971224T000000Z',
+ $rule->getEscapedValue()
+ );
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/Property/StringValueTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/StringValueTest.php
new file mode 100644
index 00000000..afa70df1
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/Property/StringValueTest.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Eluceo\iCal\Property;
+
+use Eluceo\iCal\Property\StringValue;
+
+class StringValueTest extends \PHPUnit_Framework_TestCase
+{
+ public function testNoEscapeNeeded()
+ {
+ $stringValue = new StringValue('LOREM');
+
+ $this->assertEquals(
+ 'LOREM',
+ $stringValue->getEscapedValue(),
+ 'No escaping necessary'
+ );
+ }
+
+ public function testValueContainsBackslash()
+ {
+ $stringValue = new StringValue('text contains backslash: \\');
+
+ $this->assertEquals(
+ 'text contains backslash: \\\\',
+ $stringValue->getEscapedValue(),
+ 'Text contains backslash'
+ );
+ }
+
+ public function testEscapingDoubleQuotes()
+ {
+ $stringValue = new StringValue('text with "doublequotes" will be escaped');
+
+ $this->assertEquals(
+ 'text with \\"doublequotes\\" will be escaped',
+ $stringValue->getEscapedValue(),
+ 'Escaping double quotes'
+ );
+ }
+
+ public function testEscapingSemicolonAndComma()
+ {
+ $stringValue = new StringValue('text with , and ; will also be escaped');
+
+ $this->assertEquals(
+ 'text with \\, and \\; will also be escaped',
+ $stringValue->getEscapedValue(),
+ 'Escaping ; and ,'
+ );
+ }
+
+ public function testNewLineEscaping()
+ {
+ $stringValue = new StringValue("Text with new\n line");
+
+ $this->assertEquals(
+ 'Text with new\\n line',
+ $stringValue->getEscapedValue(),
+ 'Escape new line to text'
+ );
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyBagTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyBagTest.php
new file mode 100644
index 00000000..a7f8d8ce
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyBagTest.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace Eluceo\iCal;
+
+class PropertyBagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @todo Use Mocks instead of a real object!
+ */
+ public function testPropertyAlreadyExistsOnAddingProperty()
+ {
+ $this->setExpectedException('\\Exception', "Property with name 'propName' already exists");
+
+ $propertyBag = new PropertyBag();
+ $propertyBag->add(new Property('propName', ''));
+ $propertyBag->add(new Property('propName', ''));
+ }
+}
diff --git a/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyTest.php b/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyTest.php
new file mode 100644
index 00000000..b30f5a3a
--- /dev/null
+++ b/vendor/eluceo/ical/tests/Eluceo/iCal/PropertyTest.php
@@ -0,0 +1,42 @@
+<?php
+
+namespace Eluceo\iCal;
+
+class PropertyTest extends \PHPUnit_Framework_TestCase
+{
+ public function testPropertyWithSingleValue()
+ {
+ $property = new Property('DTSTAMP', '20131020T153112');
+ $this->assertEquals(
+ 'DTSTAMP:20131020T153112',
+ $property->toLine()
+ );
+ }
+
+ public function testPropertyWithValueAndParams()
+ {
+ $property = new Property('DTSTAMP', '20131020T153112', array('TZID' => 'Europe/Berlin'));
+ $this->assertEquals(
+ 'DTSTAMP;TZID=Europe/Berlin:20131020T153112',
+ $property->toLine()
+ );
+ }
+
+ public function testPropertyWithEscapedSingleValue()
+ {
+ $property = new Property('SOMEPROP', 'Escape me!"');
+ $this->assertEquals(
+ 'SOMEPROP:Escape me!\\"',
+ $property->toLine()
+ );
+ }
+
+ public function testPropertyWithEscapedValues()
+ {
+ $property = new Property('SOMEPROP', 'Escape me!"', array('TEST' => 'Lorem "test" ipsum'));
+ $this->assertEquals(
+ 'SOMEPROP;TEST="Lorem \\"test\\" ipsum":Escape me!\\"',
+ $property->toLine()
+ );
+ }
+}