Convert Icalendar to H4.
authorMichael M Slusarz <slusarz@curecanti.org>
Tue, 3 Aug 2010 07:04:53 +0000 (01:04 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Tue, 3 Aug 2010 21:28:39 +0000 (15:28 -0600)
This removes the last use of PEAR_Errors in IMP.  Yay.

I've tried to go through framework, turba, and kronolith and convert to
using Exceptions, but there is no guarantee that I caught all the
locations we are using Icalendar objects.

147 files changed:
framework/Data/lib/Horde/Data/Imc.php
framework/Data/lib/Horde/Data/Vcard.php
framework/Data/lib/Horde/Data/Vnote.php
framework/Data/package.xml
framework/Date/lib/Horde/Date/Recurrence.php
framework/Date/test/Horde/Date/RecurrenceTest.php
framework/Icalendar/examples/Horde/Icalendar/exchange.ics [new file with mode: 0644]
framework/Icalendar/examples/Horde/Icalendar/exdate.ics [new file with mode: 0644]
framework/Icalendar/examples/Horde/Icalendar/ical.ics [new file with mode: 0644]
framework/Icalendar/examples/Horde/Icalendar/parser.php [new file with mode: 0755]
framework/Icalendar/examples/Horde/Icalendar/test_recurring.vcs [new file with mode: 0644]
framework/Icalendar/examples/Horde/Icalendar/vnote.txt [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Daylight.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Exception.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Standard.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Valarm.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vcard.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vevent.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vfreebusy.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vjournal.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vnote.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vtimezone.php [new file with mode: 0644]
framework/Icalendar/lib/Horde/Icalendar/Vtodo.php [new file with mode: 0644]
framework/Icalendar/package.xml [new file with mode: 0644]
framework/Icalendar/test/.cvsignore [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/bug_7423.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/charset1.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/empty_data.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/AuthorChats.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/MMMPseminar.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/Moon_Days.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/ProjectCalendar.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/SpanishHolidays.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/allcategories.vcs [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/arsenal32FC.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/events.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exchange.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exdate.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/iscw.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/meeting.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/privacy_events.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/rfc2445.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test.vcs [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test4.vcs [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test_recurring.vcs [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/wicca.ics [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/geo.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/iCalendar.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/line-folding.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/quoted-params.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/read-escapes.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/read-vcard-org.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/read-write-escapes.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/timezones.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/vcal20.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/vfreebusy.phpt [new file with mode: 0644]
framework/Icalendar/test/Horde/Icalendar/write-escapes.phpt [new file with mode: 0644]
framework/Kolab_Filter/lib/Horde/Kolab/Filter/Outlook.php
framework/Kolab_Filter/package.xml
framework/Kolab_Filter/test/Horde/Kolab/Filter/ResourceTest.php
framework/Kolab_FreeBusy/lib/Horde/Kolab/FreeBusy/Cache.php
framework/Kolab_FreeBusy/lib/Horde/Kolab/FreeBusy/Driver/Freebusy/Base.php
framework/Kolab_FreeBusy/lib/Horde/Kolab/FreeBusy/Imap.php
framework/Kolab_FreeBusy/lib/Horde/Kolab/FreeBusy/View.php
framework/Kolab_FreeBusy/package.xml
framework/Kolab_Resource/lib/Horde/Kolab/Resource.php
framework/Kolab_Resource/lib/Horde/Kolab/Resource/Freebusy.php
framework/Kolab_Resource/lib/Horde/Kolab/Resource/Freebusy/Kolab.php
framework/Kolab_Resource/lib/Horde/Kolab/Resource/Freebusy/Mock.php
framework/Kolab_Resource/lib/Horde/Kolab/Resource/Itip.php
framework/Kolab_Resource/package.xml
framework/Mime_Viewer/lib/Horde/Mime/Viewer/Vcard.php
framework/Mime_Viewer/package.xml
framework/SyncML/SyncML/Device.php
framework/SyncML/SyncML/Device/Sync4j.php
framework/SyncML/SyncML/Device/Synthesis.php
framework/SyncML/tests/sif.phpt
framework/iCalendar/docs/examples/exchange.ics [deleted file]
framework/iCalendar/docs/examples/exdate.ics [deleted file]
framework/iCalendar/docs/examples/ical.ics [deleted file]
framework/iCalendar/docs/examples/parser.php [deleted file]
framework/iCalendar/docs/examples/test_recurring.vcs [deleted file]
framework/iCalendar/docs/examples/vnote.txt [deleted file]
framework/iCalendar/iCalendar.php [deleted file]
framework/iCalendar/iCalendar/valarm.php [deleted file]
framework/iCalendar/iCalendar/vcard.php [deleted file]
framework/iCalendar/iCalendar/vevent.php [deleted file]
framework/iCalendar/iCalendar/vfreebusy.php [deleted file]
framework/iCalendar/iCalendar/vjournal.php [deleted file]
framework/iCalendar/iCalendar/vnote.php [deleted file]
framework/iCalendar/iCalendar/vtimezone.php [deleted file]
framework/iCalendar/iCalendar/vtodo.php [deleted file]
framework/iCalendar/package.xml [deleted file]
framework/iCalendar/tests/.cvsignore [deleted file]
framework/iCalendar/tests/bug_7423.phpt [deleted file]
framework/iCalendar/tests/charset1.phpt [deleted file]
framework/iCalendar/tests/empty_data.phpt [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/AuthorChats.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/MMMPseminar.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/Moon_Days.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/ProjectCalendar.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/SpanishHolidays.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/allcategories.vcs [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/arsenal32FC.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/events.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/exchange.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/exdate.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/iscw.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/meeting.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/privacy_events.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/rfc2445.ics [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/test.vcs [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/test4.vcs [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/test_recurring.vcs [deleted file]
framework/iCalendar/tests/fixtures/vTimezone/wicca.ics [deleted file]
framework/iCalendar/tests/geo.phpt [deleted file]
framework/iCalendar/tests/iCalendar.phpt [deleted file]
framework/iCalendar/tests/line-folding.phpt [deleted file]
framework/iCalendar/tests/quoted-params.phpt [deleted file]
framework/iCalendar/tests/read-escapes.phpt [deleted file]
framework/iCalendar/tests/read-vcard-org.phpt [deleted file]
framework/iCalendar/tests/read-write-escapes.phpt [deleted file]
framework/iCalendar/tests/timezones.phpt [deleted file]
framework/iCalendar/tests/vcal20.phpt [deleted file]
framework/iCalendar/tests/vfreebusy.phpt [deleted file]
framework/iCalendar/tests/write-escapes.phpt [deleted file]
imp/lib/Mime/Viewer/Itip.php
kronolith/data.php
kronolith/lib/Api.php
kronolith/lib/Driver/Ical.php
kronolith/lib/Event.php
kronolith/lib/Event/Ical.php
kronolith/lib/FreeBusy.php
kronolith/lib/FreeBusy/View.php
kronolith/lib/Kronolith.php
kronolith/lib/Storage/kolab.php
kronolith/lib/Storage/sql.php
kronolith/lib/View/ExportEvent.php
kronolith/lib/tests/allday.phpt
kronolith/lib/tests/bug7068.phpt
kronolith/lib/tests/toicalendar.phpt
kronolith/scripts/import_squirrelmail_calendar.php
turba/data.php
turba/lib/Api.php
turba/lib/Driver.php
turba/lib/tests/tohash.phpt

index ab2f6b9..c4729c5 100644 (file)
@@ -27,7 +27,7 @@ class Horde_Data_Imc extends Horde_Data_Base
      */
     public function importData($text)
     {
-        $this->_iCal = new Horde_iCalendar();
+        $this->_iCal = new Horde_Icalendar();
         if (!$this->_iCal->parsevCalendar($text)) {
             throw new Horde_Data_Exception('There was an error importing the iCalendar data.');
         }
@@ -39,7 +39,7 @@ class Horde_Data_Imc extends Horde_Data_Base
      * Builds an iCalendar file from a given data structure and
      * returns it as a string.
      *
-     * @param array $data     An array containing Horde_iCalendar_vevent
+     * @param array $data     An array containing Horde_Icalendar_Vevent
      *                        objects
      * @param string $method  The iTip method to use.
      *
@@ -47,7 +47,7 @@ class Horde_Data_Imc extends Horde_Data_Base
      */
     public function exportData($data, $method = 'REQUEST')
     {
-        $this->_iCal = new Horde_iCalendar();
+        $this->_iCal = new Horde_Icalendar();
         $this->_iCal->setAttribute('METHOD', $method);
 
         foreach ($data as $event) {
@@ -63,7 +63,7 @@ class Horde_Data_Imc extends Horde_Data_Base
      * only outputs the correct headers and data.
      *
      * @param string $filename   The name of the file to be downloaded.
-     * @param array $data        An array containing Horde_iCalendar_vevents
+     * @param array $data        An array containing Horde_Icalendar_Vevents
      */
     public function exportFile($filename, $data)
     {
index 89f6b8d..143a973 100644 (file)
@@ -17,7 +17,7 @@ class Horde_Data_Vcard extends Horde_Data_Imc {
      * Exports vcalendar data as a string. Unlike vEvent, vCard data
      * is not enclosed in BEGIN|END:vCalendar.
      *
-     * @param array $data     An array containing Horde_iCalendar_Vcard
+     * @param array $data     An array containing Horde_Icalendar_Vcard
      *                        objects.
      * @param string $method  The iTip method to use.
      *
index 068ce15..6966543 100644 (file)
@@ -18,7 +18,7 @@ class Horde_Data_Vnote extends Horde_Data_Imc
      * Exports vcalendar data as a string. Unlike vEvent, vNote data
      * is not enclosed in BEGIN|END:vCalendar.
      *
-     * @param array $data     An array containing Horde_iCalendar_Vnote
+     * @param array $data     An array containing Horde_Icalendar_Vnote
      *                        objects.
      * @param string $method  The iTip method to use.
      *
@@ -26,7 +26,7 @@ class Horde_Data_Vnote extends Horde_Data_Imc
      */
     public function exportData($data, $method = 'REQUEST')
     {
-        $this->_iCal = new Horde_iCalendar();
+        $this->_iCal = new Horde_Icalendar();
         $this->_iCal->setAttribute('METHOD', $method);
 
         $s = '';
index 65f6161..21a7f9a 100644 (file)
@@ -89,15 +89,15 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>Mime</name>
+    <name>Icalendar</name>
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>Util</name>
+    <name>Mime</name>
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>iCalendar</name>
+    <name>Util</name>
     <channel>pear.horde.org</channel>
    </package>
   </required>
index 1d475a9..86476e3 100644 (file)
@@ -958,7 +958,7 @@ class Horde_Date_Recurrence
      * @link http://www.imc.org/pdi/vcal-10.txt
      * @link http://www.shuchow.com/vCalAddendum.html
      *
-     * @param Horde_iCalendar $calendar  A Horde_iCalendar object instance.
+     * @param Horde_Icalendar $calendar  A Horde_Icalendar object instance.
      *
      * @return string  A vCalendar 1.0 conform RRULE value.
      */
@@ -1124,7 +1124,7 @@ class Horde_Date_Recurrence
      * @link http://rfc.net/rfc2445.html#s4.8.5
      * @link http://www.shuchow.com/vCalAddendum.html
      *
-     * @param Horde_iCalendar $calendar  A Horde_iCalendar object instance.
+     * @param Horde_Icalendar $calendar  A Horde_Icalendar object instance.
      *
      * @return string  An iCalendar 2.0 conform RRULE value.
      */
index e9eaefd..85d2cf2 100644 (file)
@@ -7,7 +7,7 @@
 
 require_once 'Horde/String.php';
 require_once 'Horde/Util.php';
-require_once 'Horde/iCalendar.php';
+require_once 'Horde/Icalendar.php';
 require_once dirname(__FILE__) . '/../../../lib/Horde/Date.php';
 require_once dirname(__FILE__) . '/../../../lib/Horde/Date/Recurrence.php';
 require_once dirname(__FILE__) . '/../../../lib/Horde/Date/Utils.php';
@@ -22,7 +22,7 @@ class Horde_Date_RecurrenceTest extends PHPUnit_Framework_TestCase
     protected function setUp()
     {
         Horde_String::setDefaultCharset('UTF-8');
-        $this->ical = new Horde_iCalendar();
+        $this->ical = new Horde_Icalendar();
         $this->_oldTimezone = date_default_timezone_get();
         date_default_timezone_set('Europe/Berlin');
     }
@@ -911,14 +911,14 @@ class Horde_Date_RecurrenceTest extends PHPUnit_Framework_TestCase
     {
         require_once 'PEAR.php';
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->parsevCalendar(file_get_contents(dirname(__FILE__) . '/fixtures/bug2813.ics'));
         $components = $iCal->getComponents();
 
         date_default_timezone_set('US/Eastern');
 
         foreach ($components as $content) {
-            if ($content instanceof Horde_iCalendar_vevent) {
+            if ($content instanceof Horde_Icalendar_Vevent) {
                 $start = new Horde_Date($content->getAttribute('DTSTART'));
                 $end = new Horde_Date($content->getAttribute('DTEND'));
                 $rrule = $content->getAttribute('RRULE');
@@ -946,8 +946,8 @@ class Horde_Date_RecurrenceTest extends PHPUnit_Framework_TestCase
         $rrule->setRecurType(Horde_Date_Recurrence::RECUR_MONTHLY_WEEKDAY);
         $rrule->setRecurOnDay(Horde_Date::MASK_SATURDAY);
 
-        $this->assertEquals('MP1 1+ SA #0', $rrule->toRRule10(new Horde_iCalendar()));
-        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;BYDAY=1SA', $rrule->toRRule20(new Horde_iCalendar()));
+        $this->assertEquals('MP1 1+ SA #0', $rrule->toRRule10(new Horde_Icalendar()));
+        $this->assertEquals('FREQ=MONTHLY;INTERVAL=1;BYDAY=1SA', $rrule->toRRule20(new Horde_Icalendar()));
     }
 
 }
diff --git a/framework/Icalendar/examples/Horde/Icalendar/exchange.ics b/framework/Icalendar/examples/Horde/Icalendar/exchange.ics
new file mode 100644 (file)
index 0000000..b714cfb
--- /dev/null
@@ -0,0 +1,53 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:Microsoft CDO for Microsoft Exchange
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Eastern Time (US & Canada)
+X-MICROSOFT-CDO-TZID:10
+BEGIN:STANDARD
+DTSTART:16010101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20011115T211047Z
+DTSTART;TZID="Eastern Time (US & Canada)":20011116T140000
+SUMMARY:internal final review of mmc site changes
+UID:040000008200E00074C5B7101A82E00800000000B0549C15F06DC101000000000000000
+  0100000008BF784046BEC174CA6706A51BE3E8B33
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="MHMN002"
+:
+  MAILTO:MHMN002@bitgroup.com
+ORGANIZER;CN="Ann Cave":MAILTO:acave@bitgroup.com
+LOCATION:metcalfe
+DTEND;TZID="Eastern Time (US & Canada)":20011116T143000
+DESCRIPTION:Let's get together to finalize. Way to go team in the final hom
+  estretch!\N
+SEQUENCE:0
+PRIORITY:5
+CLASS:
+CREATED:20011115T212414Z
+LAST-MODIFIED:20011115T212414Z
+STATUS:CONFIRMED
+TRANSP:OPAQUE
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+X-MICROSOFT-CDO-INSTTYPE:0
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-IMPORTANCE:1
+BEGIN:VALARM
+ACTION:DISPLAY
+DESCRIPTION:REMINDER
+TRIGGER;RELATED=START:-PT00H15M00S
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/examples/Horde/Icalendar/exdate.ics b/framework/Icalendar/examples/Horde/Icalendar/exdate.ics
new file mode 100644 (file)
index 0000000..1b7644c
--- /dev/null
@@ -0,0 +1,16 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:Nasa History\r
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
+X-WR-RELCALID:7A58AF63-46A0-11D7-BCDE-000A95673266-CALP\r
+X-WR-TIMEZONE;VALUE=TEXT:US/Central\r
+CALSCALE:GREGORIAN\r
+BEGIN:VEVENT\r
+DURATION:P1D\r
+EXDATE;VALUE=DATE:20030428\r
+DTSTAMP:20030926T233021Z\r
+UID:D2924923-RID\r
+DTSTART;VALUE=DATE:20020428\r
+SUMMARY:(1961) Little Joe 5B\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4\r
+END:VEVENT\r
diff --git a/framework/Icalendar/examples/Horde/Icalendar/ical.ics b/framework/Icalendar/examples/Horde/Icalendar/ical.ics
new file mode 100644 (file)
index 0000000..6ed057e
--- /dev/null
@@ -0,0 +1,40 @@
+BEGIN:VCALENDAR\r
+BEGIN:VEVENT\r
+DTSTART:19970714T170000Z\r
+DTEND:19970715T035959Z\r
+SUMMARY:Bastille Day Party\r
+END:VEVENT\r
+\r
+BEGIN:VEVENT\r
+DTSTAMP:19980309T231000Z\r
+UID:guid-1.host1.com\r
+ORGANIZER;ROLE=CHAIR:MAILTO:<EMAIL: PROTECTED>\r
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:<EMAIL: PROTECTED>\r
+DESCRIPTION:Project XYZ Review Meeting\r
+CATEGORIES:MEETING\r
+CLASS:PUBLIC\r
+CREATED:19980309T130000Z\r
+SUMMARY:XYZ Project Review\r
+DTSTART;TZID=US-Eastern:19980312T083000\r
+DTEND;TZID=US-Eastern:19980312T093000\r
+LOCATION:1CP Conference Room 4350\r
+END:VEVENT\r
+\r
+BEGIN:VTODO\r
+DTSTAMP:19980130T134500Z\r
+SEQUENCE:2\r
+UID:<EMAIL: PROTECTED>\r
+ORGANIZER:MAILTO:<EMAIL: PROTECTED>\r
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:<EMAIL: PROTECTED>\r
+DUE:19980415T235959\r
+STATUS:NEEDS-ACTION\r
+SUMMARY:Submit Income Taxes\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER;VALUE=DATE-TIME:19980403T120000\r
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud\r
+REPEAT:4\r
+DURATION:PT1H\r
+END:VALARM\r
+END:VTODO\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/examples/Horde/Icalendar/parser.php b/framework/Icalendar/examples/Horde/Icalendar/parser.php
new file mode 100755 (executable)
index 0000000..6f69c45
--- /dev/null
@@ -0,0 +1,49 @@
+#!/usr/bin/php
+<?php
+/**
+ * Takes a filename on the command line and parses it, displaying what it
+ * finds. Intended for use in debugging the iCalendar parser's behavior with
+ * problem files or for adding new features.
+ *
+ * @category Horde
+ * @package  Icalendar
+ */
+
+require_once 'Horde/Cli.php';
+require_once 'Horde/Icalendar.php';
+
+// This only works on the command line.
+if (!Horde_Cli::runningFromCLI()) {
+    exit("Must be run from the command line\n");
+}
+
+// Load the CLI environment - make sure there's no time limit, init
+// some variables, etc.
+$cli = Horde_Cli::init();
+
+if (empty($argv[1])) {
+    $cli->fatal('No file specified on the command line.');
+}
+
+$input_file = $argv[1];
+if (!file_exists($input_file)) {
+    $cli->fatal($input_file . ' does not exist.');
+}
+if (!is_readable($input_file)) {
+    $cli->fatal($input_file . ' is not readable.');
+}
+
+$cli->writeln($cli->blue('Parsing ' . $input_file . ' ...'));
+
+$data = file_get_contents($input_file);
+$ical = new Horde_Icalendar();
+if (!$ical->parseVCalendar($data)) {
+    $cli->fatal('iCalendar parsing failed.');
+}
+
+$cli->writeln($cli->green('Parsing successful, found ' . $ical->getComponentCount() . ' component(s).'));
+
+$components = $ical->getComponents();
+foreach ($components as $component) {
+    var_dump($component->toHash(true));
+}
diff --git a/framework/Icalendar/examples/Horde/Icalendar/test_recurring.vcs b/framework/Icalendar/examples/Horde/Icalendar/test_recurring.vcs
new file mode 100644 (file)
index 0000000..8d01f59
--- /dev/null
@@ -0,0 +1,50 @@
+BEGIN:VCALENDAR
+X-LOTUS-CHARSET:UTF-8
+VERSION:2.0
+PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Central European
+BEGIN:STANDARD
+DTSTART:19501029T020000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500326T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID="Central European":20040417T110000
+DTEND;TZID="Central European":20040417T113000
+TRANSP:OPAQUE
+DTSTAMP:20040416T075254Z
+SEQUENCE:0
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="XXXX/UNSA"
+ ;RSVP=FALSE:mailto:XXXX@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:XXXX1@XXXX.com
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="XXXX2";RSVP=TRUE:mailto:XXXX2@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="XXXX3";RSVP=TRUE:mailto:XXXX3@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:XXXX4@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:vljubovic@smartnet.ba
+CLASS:PUBLIC
+SUMMARY:XXXStriked out XXX
+ORGANIZER;CN="XXXX/UNSA":mailto:XXXX@XXXX.ba
+UID:59A47452891243FCC1256E78002B082C-Lotus_Notes_Generated
+X-LOTUS-BROADCAST:FALSE
+X-LOTUS-UPDATE-SEQ:1
+X-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1
+X-LOTUS-NOTESVERSION:2
+X-LOTUS-NOTICETYPE:I
+X-LOTUS-CHILD_UID:59A47452891243FCC1256E78002B082C
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/examples/Horde/Icalendar/vnote.txt b/framework/Icalendar/examples/Horde/Icalendar/vnote.txt
new file mode 100644 (file)
index 0000000..6bd5fd5
--- /dev/null
@@ -0,0 +1,7 @@
+BEGIN:VNOTE\r
+VERSION:1.1\r
+DCREATED:20030523T192529Z\r
+LAST-MODIFIED:20030523T211027Z\r
+BODY;ENCODING=QUOTED-PRINTABLE:\r
+             food=0D=0Asoup=20540=0D=0Aduck=201690=0D=0Abeer=20590=0D=0A\r
+END:VNOTE\r
diff --git a/framework/Icalendar/lib/Horde/Icalendar.php b/framework/Icalendar/lib/Horde/Icalendar.php
new file mode 100644 (file)
index 0000000..8ee462f
--- /dev/null
@@ -0,0 +1,1490 @@
+<?php
+/**
+ * @category Horde
+ * @package  Icalendar
+ */
+
+/**
+ * Class representing iCalendar files.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vcalendar';
+
+    /**
+     * The parent (containing) iCalendar object.
+     *
+     * @var Horde_Icalendar
+     */
+    protected $_container = false;
+
+    /**
+     * The name/value pairs of attributes for this object (UID,
+     * DTSTART, etc.). Which are present depends on the object and on
+     * what kind of component it is.
+     *
+     * @var array
+     */
+    protected $_attributes = array();
+
+    /**
+     * Any children (contained) iCalendar components of this object.
+     *
+     * @var array
+     */
+    protected $_components = array();
+
+    /**
+     * According to RFC 2425, we should always use CRLF-terminated lines.
+     *
+     * @var string
+     */
+    protected $_newline = "\r\n";
+
+    /**
+     * iCalendar format version (different behavior for 1.0 and 2.0 especially
+     * with recurring events).
+     *
+     * @var string
+     */
+    protected $version;
+
+    /**
+     * Whether entry is vcalendar 1.0, vcard 2.1 or vnote 1.1.
+     *
+     * These 'old' formats are defined by www.imc.org. The 'new' (non-old)
+     * formats icalendar 2.0 and vcard 3.0 are defined in rfc2426 and rfc2445
+     * respectively.
+     */
+    protected $oldFormat = true;
+
+    /**
+     * Constructor.
+     *
+     * @var string $version  Version.
+     */
+    public function __construct($version = '2.0')
+    {
+        $this->setAttribute('VERSION', $version);
+    }
+
+    /**
+     * Return a reference to a new component.
+     *
+     * @param string $type                The type of component to return
+     * @param Horde_Icalendar $container  A container that this component
+     *                                    will be associated with.
+     *
+     * @return object  Reference to a Horde_Icalendar_* object as specified.
+     */
+    static public function newComponent($type, $container)
+    {
+        $type = Horde_String::lower($type);
+        $class = __CLASS__ . '_' . Horde_String::ucfirst($type);
+
+        if (class_exists($class)) {
+            $component = new $class();
+            if ($container !== false) {
+                $component->_container = $container;
+                // Use version of container, not default set by component
+                // constructor.
+                $component->setVersion($container->version);
+            }
+        } else {
+            // Should return an dummy x-unknown type class here.
+            $component = false;
+        }
+
+        return $component;
+    }
+
+    /**
+     * Sets the version of this component.
+     *
+     * @see $version
+     * @see $oldFormat
+     *
+     * @param string $version  A float-like version string.
+     */
+    public function setVersion($version)
+    {
+        $this->oldFormat = $version < 2;
+        $this->version = $version;
+    }
+
+    /**
+     * Sets the value of an attribute.
+     *
+     * @param string $name     The name of the attribute.
+     * @param string $value    The value of the attribute.
+     * @param array $params    Array containing any addition parameters for
+     *                         this attribute.
+     * @param boolean $append  True to append the attribute, False to replace
+     *                         the first matching attribute found.
+     * @param array $values    Array representation of $value.  For
+     *                         comma/semicolon seperated lists of values.  If
+     *                         not set use $value as single array element.
+     */
+    public function setAttribute($name, $value, $params = array(),
+                                 $append = true, $values = false)
+    {
+        // Make sure we update the internal format version if
+        // setAttribute('VERSION', ...) is called.
+        if ($name == 'VERSION') {
+            $this->setVersion($value);
+            if ($this->_container !== false) {
+                $this->_container->setVersion($value);
+            }
+        }
+
+        if (!$values) {
+            $values = array($value);
+        }
+        $found = false;
+
+        if (!$append) {
+            foreach (array_keys($this->_attributes) as $key) {
+                if ($this->_attributes[$key]['name'] == Horde_String::upper($name)) {
+                    $this->_attributes[$key]['params'] = $params;
+                    $this->_attributes[$key]['value'] = $value;
+                    $this->_attributes[$key]['values'] = $values;
+                    $found = true;
+                    break;
+                }
+            }
+        }
+
+        if ($append || !$found) {
+            $this->_attributes[] = array(
+                'name'      => Horde_String::upper($name),
+                'params'    => $params,
+                'value'     => $value,
+                'values'    => $values
+            );
+        }
+    }
+
+    /**
+     * Sets parameter(s) for an (already existing) attribute.  The
+     * parameter set is merged into the existing set.
+     *
+     * @param string $name   The name of the attribute.
+     * @param array $params  Array containing any additional parameters for
+     *                       this attribute.
+     *
+     * @return boolean  True on success, false if no attribute $name exists.
+     */
+    public function setParameter($name, $params = array())
+    {
+        $keys = array_keys($this->_attributes);
+        foreach ($keys as $key) {
+            if ($this->_attributes[$key]['name'] == $name) {
+                $this->_attributes[$key]['params'] = array_merge($this->_attributes[$key]['params'], $params);
+                return true;
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Get the value of an attribute.
+     *
+     * @param string $name     The name of the attribute.
+     * @param boolean $params  Return the parameters for this attribute instead
+     *                         of its value.
+     *
+     * @return mixed (string)  The value of the attribute.
+     *               (array)   The parameters for the attribute or
+     *                         multiple values for an attribute.
+     * @throws Horde_Icalendar_Exception
+     */
+    public function getAttribute($name, $params = false)
+    {
+        $result = array();
+        foreach ($this->_attributes as $attribute) {
+            if ($attribute['name'] == $name) {
+                $result[] = $params
+                    ? $attribute['params']
+                    : $attribute['value'];
+            }
+        }
+
+        if (!count($result)) {
+            throw new Horde_Icalendar_Exception('Attribute "' . $name . '" Not Found');
+        } elseif (count($result) == 1 && !$params) {
+            return $result[0];
+        }
+
+        return $result;
+    }
+
+    /**
+     * Gets the values of an attribute as an array.  Multiple values
+     * are possible due to:
+     *
+     *  a) multiple occurences of 'name'
+     *  b) (unsecapd) comma seperated lists.
+     *
+     * So for a vcard like "KEY:a,b\nKEY:c" getAttributesValues('KEY')
+     * will return array('a', 'b', 'c').
+     *
+     * @param string $name  The name of the attribute.
+     *
+     * @return array  Multiple values for an attribute.
+     * @throws Horde_Icalendar_Exception
+     */
+    public function getAttributeValues($name)
+    {
+        $result = array();
+        foreach ($this->_attributes as $attribute) {
+            if ($attribute['name'] == $name) {
+                $result = array_merge($attribute['values'], $result);
+            }
+        }
+
+        if (!count($result)) {
+            throw new Horde_Icalendar_Exception('Attribute "' . $name . '" Not Found');
+        }
+
+        return $result;
+    }
+
+    /**
+     * Returns the value of an attribute, or a specified default value
+     * if the attribute does not exist.
+     *
+     * @param string $name    The name of the attribute.
+     * @param mixed $default  What to return if the attribute specified by
+     *                        $name does not exist.
+     *
+     * @return mixed (string) The value of $name.
+     *               (mixed)  $default if $name does not exist.
+     */
+    public function getAttributeDefault($name, $default = '')
+    {
+        try {
+            return $this->getAttribute($name);
+        } catch (Horde_Icalendar_Exception $e) {
+            return $default;
+        }
+    }
+
+    /**
+     * Remove all occurences of an attribute.
+     *
+     * @param string $name  The name of the attribute.
+     */
+    public function removeAttribute($name)
+    {
+        foreach (array_keys($this->_attributes) as $key) {
+            if ($this->_attributes[$key]['name'] == $name) {
+                unset($this->_attributes[$key]);
+            }
+        }
+    }
+
+    /**
+     * Get attributes for all tags or for a given tag.
+     *
+     * @param string $tag  Return attributes for this tag, or all attributes
+     *                     if not given.
+     *
+     * @return array  An array containing all the attributes and their types.
+     */
+    public function getAllAttributes($tag = false)
+    {
+        if ($tag === false) {
+            return $this->_attributes;
+        }
+
+        $result = array();
+        foreach ($this->_attributes as $attribute) {
+            if ($attribute['name'] == $tag) {
+                $result[] = $attribute;
+            }
+        }
+
+        return $result;
+    }
+
+    /**
+     * Add a vCalendar component (eg vEvent, vTimezone, etc.).
+     *
+     * @param mixed  Either a Horde_Icalendar component (subclass) or an array
+     *               of them.
+     */
+    public function addComponent($components)
+    {
+        if (!is_array($components)) {
+            $components = array($components);
+        }
+
+        foreach ($components as $component) {
+            if ($component instanceof Horde_Icalendar) {
+                $component->_container = $this;
+                $this->_components[] = $component;
+            }
+        }
+    }
+
+    /**
+     * Retrieve all the components.
+     *
+     * @return array  Array of Horde_Icalendar objects.
+     */
+    public function getComponents()
+    {
+        return $this->_components;
+    }
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function getType()
+    {
+        return $this->type;
+    }
+
+    /**
+     * Return the classes (entry types) we have.
+     *
+     * @return array  Hash with class names Horde_Icalendar_xxx as keys
+     *                and number of components of this class as value.
+     */
+    public function getComponentClasses()
+    {
+        $r = array();
+
+        foreach ($this->_components as $c) {
+            $cn = strtolower(get_class($c));
+            if (empty($r[$cn])) {
+                $r[$cn] = 1;
+            } else {
+                ++$r[$cn];
+            }
+        }
+
+        return $r;
+    }
+
+    /**
+     * Number of components in this container.
+     *
+     * @return integer  Number of components in this container.
+     */
+    public function getComponentCount()
+    {
+        return count($this->_components);
+    }
+
+    /**
+     * Retrieve a specific component.
+     *
+     * @param integer $idx  The index of the object to retrieve.
+     *
+     * @return mixed  (boolean) False if the index does not exist.
+     *                (Horde_Icalendar_*) The requested component.
+     */
+    public function getComponent($idx)
+    {
+        return isset($this->_components[$idx])
+            ? $this->_components[$idx]
+            : false;
+    }
+
+    /**
+     * Locates the first child component of the specified class, and returns a
+     * reference to it.
+     *
+     * @param string $type  The type of component to find.
+     *
+     * @return boolean|Horde_Icalendar_*  False if no subcomponent of the
+     *                                    specified class exists or the
+     *                                    requested component.
+     */
+    public function findComponent($childclass)
+    {
+        $childclass = __CLASS__ . '_' . Horde_String::lower($childclass);
+
+        foreach (array_keys($this->_components) as $key) {
+            if ($this->_components[$key] instanceof $childclass) {
+                return $this->_components[$key];
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Locates the first matching child component of the specified class, and
+     * returns a reference to it.
+     *
+     * @param string $childclass  The type of component to find.
+     * @param string $attribute   This attribute must be set in the component
+     *                            for it to match.
+     * @param string $value       Optional value that $attribute must match.
+     *
+     * @return boolean|Horde_Icalendar_*  False if no matching subcomponent
+     *                                    of the specified class exists, or
+     *                                    the requested component.
+     */
+    public function findComponentByAttribute($childclass, $attribute,
+                                             $value = null)
+    {
+        $childclass = __CLASS__ . '_' . Horde_String::lower($childclass);
+
+        foreach (array_keys($this->_components) as $key) {
+            if ($this->_components[$key] instanceof $childclass) {
+                try {
+                    $attr = $this->_components[$key]->getAttribute($attribute);
+                } catch (Horde_Icalendar_Exception $e) {
+                    continue;
+                }
+
+                if (is_null($value) || $value == $attr) {
+                    return $this->_components[$key];
+                }
+            }
+        }
+
+        return false;
+    }
+
+    /**
+     * Clears the iCalendar object (resets the components and attributes
+     * arrays).
+     */
+    public function clear()
+    {
+        $this->_attributes = $this->_components = array();
+    }
+
+    /**
+     * Export as vCalendar format.
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        // Default values.
+        // TODO: HORDE_VERSION does not exist.
+        $requiredAttributes['PRODID'] = '-//The Horde Project//Horde iCalendar Library' . (defined('HORDE_VERSION') ? ', Horde ' . constant('HORDE_VERSION') : '') . '//EN';
+        $requiredAttributes['METHOD'] = 'PUBLISH';
+
+        foreach ($requiredAttributes as $name => $default_value) {
+            try {
+                $this->getAttribute($name);
+            } catch (Horde_Icalendar_Exception $e) {
+                $this->setAttribute($name, $default_value);
+            }
+        }
+
+        return $this->_exportvData('VCALENDAR');
+    }
+
+    /**
+     * Export this entry as a hash array with tag names as keys.
+     *
+     * @param boolean $paramsInKeys  If false, the operation can be quite
+     *                               lossy as the parameters are ignored when
+     *                               building the array keys.
+     *                               So if you export a vcard with
+     *                               LABEL;TYPE=WORK:foo
+     *                               LABEL;TYPE=HOME:bar
+     *                               the resulting hash contains only one
+     *                               label field!
+     *                               If set to true, array keys look like
+     *                               'LABEL;TYPE=WORK'
+     *
+     * @return array  A hash array with tag names as keys.
+     */
+    public function toHash($paramsInKeys = false)
+    {
+        $hash = array();
+
+        foreach ($this->_attributes as $a)  {
+            $k = $a['name'];
+            if ($paramsInKeys && is_array($a['params'])) {
+                foreach ($a['params'] as $p => $v) {
+                    $k .= ";$p=$v";
+                }
+            }
+            $hash[$k] = $a['value'];
+        }
+
+        return $hash;
+    }
+
+    /**
+     * Parses a string containing vCalendar data.
+     *
+     * @todo This method doesn't work well at all, if $base is VCARD.
+     *
+     * @param string $text     The data to parse.
+     * @param string $base     The type of the base object.
+     * @param string $charset  The encoding charset for $text. Defaults to
+     *                         utf-8 for new format, iso-8859-1 for old format.
+     * @param boolean $clear   If true clears the iCal object before parsing.
+     *
+     * @return boolean  True on successful import, false otherwise.
+     * @throws Horde_Icalendar_Exception
+     */
+    public function parsevCalendar($text, $base = 'VCALENDAR',
+                                   $charset = null, $clear = true)
+    {
+        if ($clear) {
+            $this->clear();
+        }
+
+        if (preg_match('/^BEGIN:' . $base . '(.*)^END:' . $base . '/ism', $text, $matches)) {
+            $container = true;
+            $vCal = $matches[1];
+        } else {
+            // Text isn't enclosed in BEGIN:VCALENDAR
+            // .. END:VCALENDAR. We'll try to parse it anyway.
+            $container = false;
+            $vCal = $text;
+        }
+        $vCal = trim($vCal);
+
+        // All subcomponents.
+        $matches = null;
+        if (preg_match_all('/^BEGIN:(.*)(\r\n|\r|\n)(.*)^END:\1/Uims', $vCal, $matches)) {
+            // vTimezone components are processed first. They are
+            // needed to process vEvents that may use a TZID.
+            foreach ($matches[0] as $key => $data) {
+                $type = trim($matches[1][$key]);
+                if ($type != 'VTIMEZONE') {
+                    continue;
+                }
+                $component = $this->newComponent($type, $this);
+                if ($component === false) {
+                    throw new Horde_Icalendar_Exception('Unable to create object for type ' . $type);
+                }
+                $component->parsevCalendar($data, $type, $charset);
+
+                $this->addComponent($component);
+
+                // Remove from the vCalendar data.
+                $vCal = str_replace($data, '', $vCal);
+            }
+
+            // Now process the non-vTimezone components.
+            foreach ($matches[0] as $key => $data) {
+                $type = trim($matches[1][$key]);
+                if ($type == 'VTIMEZONE') {
+                    continue;
+                }
+                $component = $this->newComponent($type, $this);
+                if ($component === false) {
+                    throw new Horde_Icalendar_Exception('Unable to create object for type ' . $type);
+                }
+                $component->parsevCalendar($data, $type, $charset);
+
+                $this->addComponent($component);
+
+                // Remove from the vCalendar data.
+                $vCal = str_replace($data, '', $vCal);
+            }
+        } elseif (!$container) {
+            return false;
+        }
+
+        // Unfold "quoted printable" folded lines like:
+        //  BODY;ENCODING=QUOTED-PRINTABLE:=
+        //  another=20line=
+        //  last=20line
+        while (preg_match_all('/^([^:]+;\s*(ENCODING=)?QUOTED-PRINTABLE(.*=\r?\n)+(.*[^=])?\r?\n)/mU', $vCal, $matches)) {
+            foreach ($matches[1] as $s) {
+                $r = preg_replace('/=\r?\n/', '', $s);
+                $vCal = str_replace($s, $r, $vCal);
+            }
+        }
+
+        // Unfold any folded lines.
+        $vCal = preg_replace('/[\r\n]+[ \t]/', '', $vCal);
+
+        // Parse the remaining attributes.
+        if (preg_match_all('/^((?:[^":]+|(?:"[^"]*")+)*):([^\r\n]*)\r?$/m', $vCal, $matches)) {
+            foreach ($matches[0] as $attribute) {
+                preg_match('/([^;^:]*)((;(?:[^":]+|(?:"[^"]*")+)*)?):([^\r\n]*)[\r\n]*/', $attribute, $parts);
+                $tag = trim(Horde_String::upper($parts[1]));
+                $value = $parts[4];
+                $params = array();
+
+                // Parse parameters.
+                if (!empty($parts[2])) {
+                    preg_match_all('/;(([^;=]*)(=("[^"]*"|[^;]*))?)/', $parts[2], $param_parts);
+                    foreach ($param_parts[2] as $key => $paramName) {
+                        $paramName = Horde_String::upper($paramName);
+                        $paramValue = $param_parts[4][$key];
+                        if ($paramName == 'TYPE') {
+                            $paramValue = preg_split('/(?<!\\\\),/', $paramValue);
+                            if (count($paramValue) == 1) {
+                                $paramValue = $paramValue[0];
+                            }
+                        }
+                        if (preg_match('/"([^"]*)"/', $paramValue, $parts)) {
+                            $paramValue = $parts[1];
+                        }
+                        $params[$paramName] = $paramValue;
+                    }
+                }
+
+                // Charset and encoding handling.
+                if ((isset($params['ENCODING']) &&
+                     Horde_String::upper($params['ENCODING']) == 'QUOTED-PRINTABLE') ||
+                    isset($params['QUOTED-PRINTABLE'])) {
+
+                    $value = quoted_printable_decode($value);
+                    if (isset($params['CHARSET'])) {
+                        $value = Horde_String::convertCharset($value, $params['CHARSET']);
+                    } else {
+                        $value = Horde_String::convertCharset($value, empty($charset) ? ($this->oldFormat ? 'iso-8859-1' : 'utf-8') : $charset);
+                    }
+                } elseif (isset($params['CHARSET'])) {
+                    $value = Horde_String::convertCharset($value, $params['CHARSET']);
+                } else {
+                    // As per RFC 2279, assume UTF8 if we don't have an
+                    // explicit charset parameter.
+                    $value = Horde_String::convertCharset($value, empty($charset) ? ($this->oldFormat ? 'iso-8859-1' : 'utf-8') : $charset);
+                }
+
+                // Get timezone info for date fields from $params.
+                $tzid = isset($params['TZID']) ? trim($params['TZID'], '\"') : false;
+
+                switch ($tag) {
+                // Date fields.
+                case 'COMPLETED':
+                case 'CREATED':
+                case 'LAST-MODIFIED':
+                case 'X-MOZ-LASTACK':
+                case 'X-MOZ-SNOOZE-TIME':
+                    $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params);
+                    break;
+
+                case 'BDAY':
+                case 'X-ANNIVERSARY':
+                    $this->setAttribute($tag, $this->_parseDate($value), $params);
+                    break;
+
+                case 'DTEND':
+                case 'DTSTART':
+                case 'DTSTAMP':
+                case 'DUE':
+                case 'AALARM':
+                case 'RECURRENCE-ID':
+                    // types like AALARM may contain additional data after a ;
+                    // ignore these.
+                    $ts = explode(';', $value);
+                    if (isset($params['VALUE']) && $params['VALUE'] == 'DATE') {
+                        $this->setAttribute($tag, $this->_parseDate($ts[0]), $params);
+                    } else {
+                        $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params);
+                    }
+                    break;
+
+                case 'TRIGGER':
+                    if (isset($params['VALUE']) &&
+                        $params['VALUE'] == 'DATE-TIME') {
+                            $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params);
+                    } else {
+                        $this->setAttribute($tag, $this->_parseDuration($value), $params);
+                    }
+                    break;
+
+                // Comma seperated dates.
+                case 'EXDATE':
+                case 'RDATE':
+                    $dates = array();
+                    preg_match_all('/,([^,]*)/', ',' . $value, $values);
+
+                    foreach ($values[1] as $value) {
+                        $dates[] = $this->_parseDate($value);
+                    }
+                    $this->setAttribute($tag, isset($dates[0]) ? $dates[0] : null, $params, true, $dates);
+                    break;
+
+                // Duration fields.
+                case 'DURATION':
+                    $this->setAttribute($tag, $this->_parseDuration($value), $params);
+                    break;
+
+                // Period of time fields.
+                case 'FREEBUSY':
+                    $periods = array();
+                    preg_match_all('/,([^,]*)/', ',' . $value, $values);
+                    foreach ($values[1] as $value) {
+                        $periods[] = $this->_parsePeriod($value);
+                    }
+
+                    $this->setAttribute($tag, isset($periods[0]) ? $periods[0] : null, $params, true, $periods);
+                    break;
+
+                // UTC offset fields.
+                case 'TZOFFSETFROM':
+                case 'TZOFFSETTO':
+                    $this->setAttribute($tag, $this->_parseUtcOffset($value), $params);
+                    break;
+
+                // Integer fields.
+                case 'PERCENT-COMPLETE':
+                case 'PRIORITY':
+                case 'REPEAT':
+                case 'SEQUENCE':
+                    $this->setAttribute($tag, intval($value), $params);
+                    break;
+
+                // Geo fields.
+                case 'GEO':
+                    if ($this->oldFormat) {
+                        $floats = explode(',', $value);
+                        $value = array('latitude' => floatval($floats[1]),
+                                       'longitude' => floatval($floats[0]));
+                    } else {
+                        $floats = explode(';', $value);
+                        $value = array('latitude' => floatval($floats[0]),
+                                       'longitude' => floatval($floats[1]));
+                    }
+                    $this->setAttribute($tag, $value, $params);
+                    break;
+
+                // Recursion fields.
+                case 'EXRULE':
+                case 'RRULE':
+                    $this->setAttribute($tag, trim($value), $params);
+                    break;
+
+                // ADR, ORG and N are lists seperated by unescaped semicolons
+                // with a specific number of slots.
+                case 'ADR':
+                case 'N':
+                case 'ORG':
+                    $value = trim($value);
+                    // As of rfc 2426 2.4.2 semicolon, comma, and colon must
+                    // be escaped (comma is unescaped after splitting below).
+                    $value = str_replace(array('\\n', '\\N', '\\;', '\\:'),
+                                         array($this->_newline, $this->_newline, ';', ':'),
+                                         $value);
+
+                    // Split by unescaped semicolons:
+                    $values = preg_split('/(?<!\\\\);/', $value);
+                    $value = str_replace('\\;', ';', $value);
+                    $values = str_replace('\\;', ';', $values);
+                    $this->setAttribute($tag, trim($value), $params, true, $values);
+                    break;
+
+                // String fields.
+                default:
+                    if ($this->oldFormat) {
+                        // vCalendar 1.0 and vCard 2.1 only escape semicolons
+                        // and use unescaped semicolons to create lists.
+                        $value = trim($value);
+                        // Split by unescaped semicolons:
+                        $values = preg_split('/(?<!\\\\);/', $value);
+                        $value = str_replace('\\;', ';', $value);
+                        $values = str_replace('\\;', ';', $values);
+                        $this->setAttribute($tag, trim($value), $params, true, $values);
+                    } else {
+                        $value = trim($value);
+                        // As of rfc 2426 2.4.2 semicolon, comma, and colon
+                        // must be escaped (comma is unescaped after splitting
+                        // below).
+                        $value = str_replace(array('\\n', '\\N', '\\;', '\\:', '\\\\'),
+                                             array($this->_newline, $this->_newline, ';', ':', '\\'),
+                                             $value);
+
+                        // Split by unescaped commas.
+                        $values = preg_split('/(?<!\\\\),/', $value);
+                        $value = str_replace('\\,', ',', $value);
+                        $values = str_replace('\\,', ',', $values);
+
+                        $this->setAttribute($tag, trim($value), $params, true, $values);
+                    }
+                    break;
+                }
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * Export this component in vCal format.
+     *
+     * @param string $base  The type of the base object.
+     *
+     * @return string  vCal format data.
+     */
+    protected function _exportvData($base = 'VCALENDAR')
+    {
+        $result = 'BEGIN:' . Horde_String::upper($base) . $this->_newline;
+
+        // VERSION is not allowed for entries enclosed in VCALENDAR/ICALENDAR,
+        // as it is part of the enclosing VCALENDAR/ICALENDAR. See rfc2445
+        if ($base !== 'VEVENT' && $base !== 'VTODO' && $base !== 'VALARM' &&
+            $base !== 'VJOURNAL' && $base !== 'VFREEBUSY') {
+            // Ensure that version is the first attribute.
+            $result .= 'VERSION:' . $this->version . $this->_newline;
+        }
+        foreach ($this->_attributes as $attribute) {
+            $name = $attribute['name'];
+            if ($name == 'VERSION') {
+                // Already done.
+                continue;
+            }
+
+            $params_str = '';
+            $params = $attribute['params'];
+            if ($params) {
+                foreach ($params as $param_name => $param_value) {
+                    /* Skip CHARSET for iCalendar 2.0 data, not allowed. */
+                    if ($param_name == 'CHARSET' && !$this->oldFormat) {
+                        continue;
+                    }
+                    /* Skip VALUE=DATE for vCalendar 1.0 data, not allowed. */
+                    if ($this->oldFormat &&
+                        $param_name == 'VALUE' && $param_value == 'DATE') {
+                        continue;
+                    }
+
+                    if ($param_value === null) {
+                        $params_str .= ";$param_name";
+                    } else {
+                        $len = strlen($param_value);
+                        $safe_value = '';
+                        $quote = false;
+                        for ($i = 0; $i < $len; ++$i) {
+                            $ord = ord($param_value[$i]);
+                            // Accept only valid characters.
+                            if ($ord == 9 || $ord == 32 || $ord == 33 ||
+                                ($ord >= 35 && $ord <= 126) ||
+                                $ord >= 128) {
+                                $safe_value .= $param_value[$i];
+                                // Characters above 128 do not need to be
+                                // quoted as per RFC2445 but Outlook requires
+                                // this.
+                                if ($ord == 44 || $ord == 58 || $ord == 59 ||
+                                    $ord >= 128) {
+                                    $quote = true;
+                                }
+                            }
+                        }
+                        if ($quote) {
+                            $safe_value = '"' . $safe_value . '"';
+                        }
+                        $params_str .= ";$param_name=$safe_value";
+                    }
+                }
+            }
+
+            $value = $attribute['value'];
+            switch ($name) {
+            // Date fields.
+            case 'COMPLETED':
+            case 'CREATED':
+            case 'DCREATED':
+            case 'LAST-MODIFIED':
+            case 'X-MOZ-LASTACK':
+            case 'X-MOZ-SNOOZE-TIME':
+                $value = $this->_exportDateTime($value);
+                break;
+
+            case 'DTEND':
+            case 'DTSTART':
+            case 'DTSTAMP':
+            case 'DUE':
+            case 'AALARM':
+            case 'RECURRENCE-ID':
+                if (isset($params['VALUE'])) {
+                    if ($params['VALUE'] == 'DATE') {
+                        // VCALENDAR 1.0 uses T000000 - T235959 for all day events:
+                        if ($this->oldFormat && $name == 'DTEND') {
+                            $d = new Horde_Date($value);
+                            $value = new Horde_Date(array(
+                                'year' => $d->year,
+                                'month' => $d->month,
+                                'mday' => $d->mday - 1));
+                            $value->correct();
+                            $value = $this->_exportDate($value, '235959');
+                        } else {
+                            $value = $this->_exportDate($value, '000000');
+                        }
+                    } else {
+                        $value = $this->_exportDateTime($value);
+                    }
+                } else {
+                    $value = $this->_exportDateTime($value);
+                }
+                break;
+
+            // Comma seperated dates.
+            case 'EXDATE':
+            case 'RDATE':
+                $dates = array();
+                foreach ($value as $date) {
+                    if (isset($params['VALUE'])) {
+                        if ($params['VALUE'] == 'DATE') {
+                            $dates[] = $this->_exportDate($date, '000000');
+                        } elseif ($params['VALUE'] == 'PERIOD') {
+                            $dates[] = $this->_exportPeriod($date);
+                        } else {
+                            $dates[] = $this->_exportDateTime($date);
+                        }
+                    } else {
+                        $dates[] = $this->_exportDateTime($date);
+                    }
+                }
+                $value = implode(',', $dates);
+                break;
+
+            case 'TRIGGER':
+                if (isset($params['VALUE'])) {
+                    if ($params['VALUE'] == 'DATE-TIME') {
+                        $value = $this->_exportDateTime($value);
+                    } elseif ($params['VALUE'] == 'DURATION') {
+                        $value = $this->_exportDuration($value);
+                    }
+                } else {
+                    $value = $this->_exportDuration($value);
+                }
+                break;
+
+            // Duration fields.
+            case 'DURATION':
+                $value = $this->_exportDuration($value);
+                break;
+
+            // Period of time fields.
+            case 'FREEBUSY':
+                $value_str = '';
+                foreach ($value as $period) {
+                    $value_str .= empty($value_str) ? '' : ',';
+                    $value_str .= $this->_exportPeriod($period);
+                }
+                $value = $value_str;
+                break;
+
+            // UTC offset fields.
+            case 'TZOFFSETFROM':
+            case 'TZOFFSETTO':
+                $value = $this->_exportUtcOffset($value);
+                break;
+
+            // Integer fields.
+            case 'PERCENT-COMPLETE':
+            case 'PRIORITY':
+            case 'REPEAT':
+            case 'SEQUENCE':
+                $value = "$value";
+                break;
+
+            // Geo fields.
+            case 'GEO':
+                if ($this->oldFormat) {
+                    $value = $value['longitude'] . ',' . $value['latitude'];
+                } else {
+                    $value = $value['latitude'] . ';' . $value['longitude'];
+                }
+                break;
+
+            // Recurrence fields.
+            case 'EXRULE':
+            case 'RRULE':
+                break;
+
+            default:
+                if ($this->oldFormat) {
+                    if (is_array($attribute['values']) &&
+                        count($attribute['values']) > 1) {
+                        $values = $attribute['values'];
+                        if ($name == 'N' || $name == 'ADR' || $name == 'ORG') {
+                            $glue = ';';
+                        } else {
+                            $glue = ',';
+                        }
+                        $values = str_replace(';', '\\;', $values);
+                        $value = implode($glue, $values);
+                    } else {
+                        /* vcard 2.1 and vcalendar 1.0 escape only
+                         * semicolons */
+                        $value = str_replace(';', '\\;', $value);
+                    }
+                    // Text containing newlines or ASCII >= 127 must be BASE64
+                    // or QUOTED-PRINTABLE encoded. Currently we use
+                    // QUOTED-PRINTABLE as default.
+                    if (preg_match("/[^\x20-\x7F]/", $value) &&
+                        empty($params['ENCODING']))  {
+                        $params['ENCODING'] = 'QUOTED-PRINTABLE';
+                        $params_str .= ';ENCODING=QUOTED-PRINTABLE';
+                        // Add CHARSET as well. At least the synthesis client
+                        // gets confused otherwise
+                        if (empty($params['CHARSET'])) {
+                            $params['CHARSET'] = $GLOBALS['registry']->getCharset();
+                            $params_str .= ';CHARSET=' . $params['CHARSET'];
+                        }
+                    }
+                } else {
+                    if (is_array($attribute['values']) &&
+                        count($attribute['values'])) {
+                        $values = $attribute['values'];
+                        if ($name == 'N' || $name == 'ADR' || $name == 'ORG') {
+                            $glue = ';';
+                        } else {
+                            $glue = ',';
+                        }
+                        // As of rfc 2426 2.5 semicolon and comma must be
+                        // escaped.
+                        $values = str_replace(array('\\', ';', ','),
+                                              array('\\\\', '\\;', '\\,'),
+                                              $values);
+                        $value = implode($glue, $values);
+                    } else {
+                        // As of rfc 2426 2.5 semicolon and comma must be
+                        // escaped.
+                        $value = str_replace(array('\\', ';', ','),
+                                             array('\\\\', '\\;', '\\,'),
+                                             $value);
+                    }
+                    $value = preg_replace('/\r?\n/', '\n', $value);
+                }
+                break;
+            }
+
+            $value = str_replace("\r", '', $value);
+            if (!empty($params['ENCODING']) &&
+                $params['ENCODING'] == 'QUOTED-PRINTABLE' &&
+                strlen(trim($value))) {
+                $result .= $name . $params_str . ':'
+                    . str_replace('=0A', '=0D=0A',
+                                  Horde_Mime::quotedPrintableEncode($value))
+                    . $this->_newline;
+            } else {
+                $attr_string = $name . $params_str . ':' . $value;
+                if (!$this->oldFormat) {
+                    $attr_string = Horde_String::wordwrap($attr_string, 75, $this->_newline . ' ',
+                                                    true, 'utf-8', true);
+                }
+                $result .= $attr_string . $this->_newline;
+            }
+        }
+
+        foreach ($this->_components as $component) {
+            $result .= $component->exportvCalendar();
+        }
+
+        return $result . 'END:' . $base . $this->_newline;
+    }
+
+    /**
+     * Parse a UTC Offset field.
+     *
+     * @param $text TODO
+     *
+     * @return TODO
+     */
+    protected function _parseUtcOffset($text)
+    {
+        $offset = array();
+
+        if (preg_match('/(\+|-)([0-9]{2})([0-9]{2})([0-9]{2})?/', $text, $timeParts)) {
+            $offset['ahead']  = (bool)($timeParts[1] == '+');
+            $offset['hour']   = intval($timeParts[2]);
+            $offset['minute'] = intval($timeParts[3]);
+            if (isset($timeParts[4])) {
+                $offset['second'] = intval($timeParts[4]);
+            }
+            return $offset;
+        }
+
+        return false;
+    }
+
+    /**
+     * Export a UTC Offset field.
+     *
+     * @param $value TODO
+     *
+     * @return TODO
+     */
+    function _exportUtcOffset($value)
+    {
+        $offset = ($value['ahead'] ? '+' : '-') .
+            sprintf('%02d%02d', $value['hour'], $value['minute']);
+
+        if (isset($value['second'])) {
+            $offset .= sprintf('%02d', $value['second']);
+        }
+
+        return $offset;
+    }
+
+    /**
+     * Parse a Time Period field.
+     *
+     * @param $text TODO
+     *
+     * @return array  TODO
+     */
+    protected function _parsePeriod($text)
+    {
+        $periodParts = explode('/', $text);
+        $start = $this->_parseDateTime($periodParts[0]);
+
+        if ($duration = $this->_parseDuration($periodParts[1])) {
+            return array('start' => $start, 'duration' => $duration);
+        } elseif ($end = $this->_parseDateTime($periodParts[1])) {
+            return array('start' => $start, 'end' => $end);
+        }
+    }
+
+    /**
+     * Export a Time Period field.
+     *
+     * @param $value TODO
+     *
+     * @return TODO
+     */
+    protected function _exportPeriod($value)
+    {
+        $period = $this->_exportDateTime($value['start']) . '/';
+
+        return isset($value['duration'])
+            ? $period . $this->_exportDuration($value['duration'])
+            : $period . $this->_exportDateTime($value['end']);
+    }
+
+    /**
+     * Grok the TZID and return an offset in seconds from UTC for this
+     * date and time.
+     *
+     * @param $date TODO
+     * @param $time TODO
+     * @param $tzid TODO
+     *
+     * @return TODO
+     */
+    protected function _parseTZID($date, $time, $tzid)
+    {
+        $vtimezone = $this->_container->findComponentByAttribute('vtimezone', 'TZID', $tzid);
+        if (!$vtimezone) {
+            return false;
+        }
+
+        $change_times = array();
+        foreach ($vtimezone->getComponents() as $o) {
+            $t = $vtimezone->parseChild($o, $date['year']);
+            if ($t !== false) {
+                $change_times[] = $t;
+            }
+        }
+
+        if (!$change_times) {
+            return false;
+        }
+
+        sort($change_times);
+
+        // Time is arbitrarily based on UTC for comparison.
+        $t = @gmmktime($time['hour'], $time['minute'], $time['second'],
+                       $date['month'], $date['mday'], $date['year']);
+
+        if ($t < $change_times[0]['time']) {
+            return $change_times[0]['from'];
+        }
+
+        for ($i = 0, $n = count($change_times); $i < $n - 1; $i++) {
+            if (($t >= $change_times[$i]['time']) &&
+                ($t < $change_times[$i + 1]['time'])) {
+                return $change_times[$i]['to'];
+            }
+        }
+
+        if ($t >= $change_times[$n - 1]['time']) {
+            return $change_times[$n - 1]['to'];
+        }
+
+        return false;
+    }
+
+    /**
+     * Parses a DateTime field and returns a unix timestamp. If the
+     * field cannot be parsed then the original text is returned
+     * unmodified.
+     *
+     * @todo This function should be moved to Horde_Date and made public.
+     *
+     * @param $time TODO
+     * @param $tzid TODO
+     *
+     * @return TODO
+     */
+    protected function _parseDateTime($text, $tzid = false)
+    {
+        $dateParts = explode('T', $text);
+        if (count($dateParts) != 2 && !empty($text)) {
+            // Not a datetime field but may be just a date field.
+            if (!preg_match('/^(\d{4})-?(\d{2})-?(\d{2})$/', $text, $match)) {
+                // Or not
+                return $text;
+            }
+            $dateParts = array($text, '000000');
+        }
+
+        if (!($date = $this->_parseDate($dateParts[0])) ||
+            !($time = $this->_parseTime($dateParts[1]))) {
+            return $text;
+        }
+
+        // Get timezone info for date fields from $tzid and container.
+        $tzoffset = ($time['zone'] == 'Local' && $tzid &&
+                     ($this->_container instanceof Horde_Icalendar))
+                     ? $this->_parseTZID($date, $time, $tzid)
+                     : false;
+        if ($time['zone'] == 'UTC' || $tzoffset !== false) {
+            $result = @gmmktime($time['hour'], $time['minute'], $time['second'],
+                                $date['month'], $date['mday'], $date['year']);
+            if ($tzoffset) {
+                $result -= $tzoffset;
+            }
+        } else {
+            // We don't know the timezone so assume local timezone.
+            // FIXME: shouldn't this be based on the user's timezone
+            // preference rather than the server's timezone?
+            $result = @mktime($time['hour'], $time['minute'], $time['second'],
+                              $date['month'], $date['mday'], $date['year']);
+        }
+
+        return ($result !== false) ? $result : $text;
+    }
+
+    /**
+     * Export a DateTime field.
+     *
+     * @todo A bunch of code calls this function outside this class, so it
+     * needs to be marked public for now.
+     *
+     * @param $value TODO
+     *
+     * @return TODO
+     */
+    public function _exportDateTime($value)
+    {
+        $temp = array();
+        if (!is_object($value) && !is_array($value)) {
+            $tz = date('O', $value);
+            $TZOffset = (3600 * substr($tz, 0, 3)) + (60 * substr(date('O', $value), 3, 2));
+            $value -= $TZOffset;
+
+            $temp['zone']   = 'UTC';
+            $temp['year']   = date('Y', $value);
+            $temp['month']  = date('n', $value);
+            $temp['mday']   = date('j', $value);
+            $temp['hour']   = date('G', $value);
+            $temp['minute'] = date('i', $value);
+            $temp['second'] = date('s', $value);
+        } else {
+            $dateOb = new Horde_Date($value);
+            return $this->_exportDateTime($dateOb->timestamp());
+        }
+
+        return $this->_exportDate($temp) . 'T' . $this->_exportTime($temp);
+    }
+
+    /**
+     * Parses a Time field.
+     *
+     * @param $text  TODO
+     *
+     * @return TODO
+     */
+    protected function _parseTime($text)
+    {
+        if (!preg_match('/([0-9]{2})([0-9]{2})([0-9]{2})(Z)?/', $text, $timeParts)) {
+            return false;
+        }
+
+        return array(
+            'hour' => $timeParts[1],
+            'minute' => $timeParts[2],
+            'second' => $timeParts[3],
+            'zone' => isset($timeParts[4]) ? 'UTC' : 'Local'
+        );
+    }
+
+    /**
+     * Exports a Time field.
+     *
+     * @param $value TODO
+     *
+     * @return TODO
+     */
+    protected function _exportTime($value)
+    {
+        $time = sprintf('%02d%02d%02d',
+                        $value['hour'], $value['minute'], $value['second']);
+        if ($value['zone'] == 'UTC') {
+            $time .= 'Z';
+        }
+
+        return $time;
+    }
+
+    /**
+     * Parses a Date field.
+     *
+     * @param $text TODO
+     *
+     * @return array TODO
+     */
+    protected function _parseDate($text)
+    {
+        $parts = explode('T', $text);
+        if (count($parts) == 2) {
+            $text = $parts[0];
+        }
+
+        if (!preg_match('/^(\d{4})-?(\d{2})-?(\d{2})$/', $text, $match)) {
+            return false;
+        }
+
+        return array(
+            'year' => $match[1],
+            'month' => $match[2],
+            'mday' => $match[3]
+        );
+    }
+
+    /**
+     * Exports a date field.
+     *
+     * @param object|array $value  Date object or hash.
+     * @param string $autoconvert  If set, use this as time part to export the
+     *                             date as datetime when exporting to Vcalendar
+     *                             1.0. Examples: '000000' or '235959'
+     *
+     * @return TODO
+     */
+    protected function _exportDate($value, $autoconvert = false)
+    {
+        if (is_object($value)) {
+            $value = array('year' => $value->year, 'month' => $value->month, 'mday' => $value->mday);
+        }
+
+        return ($autoconvert !== false && $this->oldFormat)
+            ? sprintf('%04d%02d%02dT%s', $value['year'], $value['month'], $value['mday'], $autoconvert)
+            : sprintf('%04d%02d%02d', $value['year'], $value['month'], $value['mday']);
+    }
+
+    /**
+     * Parse a Duration Value field.
+     *
+     * @param $text TODO
+     *
+     * @return TODO
+     */
+    protected function _parseDuration($text)
+    {
+        if (!preg_match('/([+]?|[-])P(([0-9]+W)|([0-9]+D)|)(T(([0-9]+H)|([0-9]+M)|([0-9]+S))+)?/', trim($text), $durvalue)) {
+            return false;
+        }
+
+        // Weeks.
+        $duration = 7 * 86400 * intval($durvalue[3]);
+
+        if (count($durvalue) > 4) {
+            // Days.
+            $duration += 86400 * intval($durvalue[4]);
+        }
+
+        if (count($durvalue) > 5) {
+            // Hours.
+            $duration += 3600 * intval($durvalue[7]);
+
+            // Mins.
+            if (isset($durvalue[8])) {
+                $duration += 60 * intval($durvalue[8]);
+            }
+
+            // Secs.
+            if (isset($durvalue[9])) {
+                $duration += intval($durvalue[9]);
+            }
+        }
+
+        // Sign.
+        if ($durvalue[1] == "-") {
+            $duration *= -1;
+        }
+
+        return $duration;
+    }
+
+    /**
+     * Export a duration value.
+     *
+     * @param $value TODO
+     */
+    protected function _exportDuration($value)
+    {
+        $duration = '';
+        if ($value < 0) {
+            $value *= -1;
+            $duration .= '-';
+        }
+        $duration .= 'P';
+
+        $weeks = floor($value / (7 * 86400));
+        $value = $value % (7 * 86400);
+        if ($weeks) {
+            $duration .= $weeks . 'W';
+        }
+
+        $days = floor($value / (86400));
+        $value = $value % (86400);
+        if ($days) {
+            $duration .= $days . 'D';
+        }
+
+        if ($value) {
+            $duration .= 'T';
+
+            $hours = floor($value / 3600);
+            $value = $value % 3600;
+            if ($hours) {
+                $duration .= $hours . 'H';
+            }
+
+            $mins = floor($value / 60);
+            $value = $value % 60;
+            if ($mins) {
+                $duration .= $mins . 'M';
+            }
+
+            if ($value) {
+                $duration .= $value . 'S';
+            }
+        }
+
+        return $duration;
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Daylight.php b/framework/Icalendar/lib/Horde/Icalendar/Daylight.php
new file mode 100644 (file)
index 0000000..5908518
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * TODO
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Daylight extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'daylight';
+
+    /**
+     * TODO
+     *
+     * @param $data TODO
+     */
+    public function parsevCalendar($data)
+    {
+        parent::parsevCalendar($data, 'DAYLIGHT');
+    }
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('DAYLIGHT');
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Exception.php b/framework/Icalendar/lib/Horde/Icalendar/Exception.php
new file mode 100644 (file)
index 0000000..5409068
--- /dev/null
@@ -0,0 +1,17 @@
+<?php
+/**
+ * Exception handler for the horde/Icalendar package.
+ *
+ * Copyright 2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Michael Slusarz <slusarz@horde.org>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Exception extends Horde_Exception_Prior
+{
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Standard.php b/framework/Icalendar/lib/Horde/Icalendar/Standard.php
new file mode 100644 (file)
index 0000000..90dad1f
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Class representing vTimezones.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Standard extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'standard';
+
+    /**
+     * TODO
+     *
+     * @param $data TODO
+     */
+    public function parsevCalendar($data)
+    {
+        parent::parsevCalendar($data, 'STANDARD');
+    }
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('STANDARD');
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Valarm.php b/framework/Icalendar/lib/Horde/Icalendar/Valarm.php
new file mode 100644 (file)
index 0000000..da2d4b0
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Class representing vAlarms.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Valarm extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vAlarm';
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('VALARM');
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vcard.php b/framework/Icalendar/lib/Horde/Icalendar/Vcard.php
new file mode 100644 (file)
index 0000000..eb4cff1
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+/**
+ * Class representing vCard entries.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Karsten Fourmont <karsten@horde.org>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vcard extends Horde_Icalendar
+{
+    // The following were shamelessly yoinked from Contact_Vcard_Build
+    // Part numbers for N components.
+    const N_FAMILY = 0;
+    const N_GIVEN = 1;
+    const N_ADDL = 2;
+    const N_PREFIX = 3;
+    const N_SUFFIX = 4;
+
+    // Part numbers for ADR components.
+    const ADR_POB = 0;
+    const ADR_EXTEND = 1;
+    const ADR_STREET = 2;
+    const ADR_LOCALITY = 3;
+    const ADR_REGION = 4;
+    const ADR_POSTCODE = 5;
+    const ADR_COUNTRY = 6;
+
+    // Part numbers for GEO components.
+    const GEO_LAT = 0;
+    const GEO_LON = 1;
+
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vcard';
+
+    /**
+     * Constructor.
+     */
+    public function __construct($version = '2.1')
+    {
+        parent::__construct($version);
+    }
+
+    /**
+     * Sets the version of this component.
+     *
+     * @see $version
+     * @see $oldFormat
+     *
+     * @param string  A float-like version string.
+     */
+    public function setVersion($version)
+    {
+        $this->oldFormat = $version < 3;
+        $this->version = $version;
+    }
+
+    /**
+     * Unlike vevent and vtodo, a vcard is normally not enclosed in an
+     * iCalendar container. (BEGIN..END)
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        $requiredAttributes['VERSION'] = $this->version;
+        $requiredAttributes['N'] = ';;;;;;';
+        if ($this->version == '3.0') {
+            $requiredAttributes['FN'] = '';
+        }
+
+        foreach ($requiredAttributes as $name => $default_value) {
+            try {
+                $this->getAttribute($name);
+            } catch (Horde_Icalendar_Exception $e) {
+                $this->setAttribute($name, $default_value);
+            }
+        }
+
+        return $this->_exportvData('VCARD');
+    }
+
+    /**
+     * Returns the contents of the "N" tag as a printable Name:
+     * i.e. converts:
+     *
+     *   N:Duck;Dagobert;T;Professor;Sen.
+     * to
+     *   "Professor Dagobert T Duck Sen"
+     *
+     * @return string  Full name of vcard "N" tag or null if no N tag.
+     */
+    public function printableName()
+    {
+        try {
+            $name_parts = $this->getAttributeValues('N');
+        } catch (Horde_Icalendar_Exception $e) {
+            return null;
+        }
+
+        $name_arr = array();
+
+        foreach (array(self::N_PREFIX, self::N_GIVEN, self::N_ADDL, self::N_FAMILY, self::N_SUFFIX) as $val) {
+            if (!empty($name_parts[$val])) {
+                $name_arr[] = $name_parts[$val];
+            }
+        }
+
+        return implode(' ', $name_arr);
+    }
+
+    /**
+     * Static function to make a given email address rfc822 compliant.
+     *
+     * @param string $address  An email address.
+     *
+     * @return string  The RFC822-formatted email address.
+     */
+    static function getBareEmail($address)
+    {
+        return Horde_Mime_Address::bareAddress($address);
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vevent.php b/framework/Icalendar/lib/Horde/Icalendar/Vevent.php
new file mode 100644 (file)
index 0000000..3c4d625
--- /dev/null
@@ -0,0 +1,244 @@
+<?php
+/**
+ * Class representing vEvents.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vevent extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vEvent';
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        // Default values.
+        $requiredAttributes = array(
+            'DTSTAMP' => time(),
+            'UID' => strval(new Horde_Support_Uuid())
+        );
+
+        $method = !empty($this->_container)
+            ? $this->_container->getAttribute('METHOD')
+            : 'PUBLISH';
+
+        switch ($method) {
+        case 'PUBLISH':
+            $requiredAttributes['DTSTART'] = time();
+            $requiredAttributes['SUMMARY'] = '';
+            break;
+
+        case 'REQUEST':
+            $requiredAttributes['ATTENDEE'] = '';
+            $requiredAttributes['DTSTART'] = time();
+            $requiredAttributes['SUMMARY'] = '';
+            break;
+
+        case 'REPLY':
+            $requiredAttributes['ATTENDEE'] = '';
+            break;
+
+        case 'ADD':
+            $requiredAttributes['DTSTART'] = time();
+            $requiredAttributes['SEQUENCE'] = 1;
+            $requiredAttributes['SUMMARY'] = '';
+            break;
+
+        case 'CANCEL':
+            $requiredAttributes['ATTENDEE'] = '';
+            $requiredAttributes['SEQUENCE'] = 1;
+            break;
+
+        case 'REFRESH':
+            $requiredAttributes['ATTENDEE'] = '';
+            break;
+        }
+
+        foreach ($requiredAttributes as $name => $default_value) {
+            try {
+                $this->getAttribute($name);
+            } catch (Horde_Icalendar_Exception $e) {
+                $this->setAttribute($name, $default_value);
+            }
+        }
+
+        return $this->_exportvData('VEVENT');
+    }
+
+    /**
+     * Update the status of an attendee of an event.
+     *
+     * @param $email    The email address of the attendee.
+     * @param $status   The participant status to set.
+     * @param $fullname The full name of the participant to set.
+     */
+    public function updateAttendee($email, $status, $fullname = '')
+    {
+        foreach ($this->_attributes as $key => $attribute) {
+            if ($attribute['name'] == 'ATTENDEE' &&
+                $attribute['value'] == 'mailto:' . $email) {
+                $this->_attributes[$key]['params']['PARTSTAT'] = $status;
+                if (!empty($fullname)) {
+                    $this->_attributes[$key]['params']['CN'] = $fullname;
+                }
+                unset($this->_attributes[$key]['params']['RSVP']);
+                return;
+            }
+        }
+        $params = array('PARTSTAT' => $status);
+        if (!empty($fullname)) {
+            $params['CN'] = $fullname;
+        }
+        $this->setAttribute('ATTENDEE', 'mailto:' . $email, $params);
+    }
+
+    /**
+     * Return the organizer display name or email.
+     *
+     * @return string  The organizer name to display for this event.
+     */
+    public function organizerName()
+    {
+        try {
+            $organizer = $this->getAttribute('ORGANIZER', true);
+        } catch (Horde_Icalendar_Exception $e) {
+            return _("An unknown person");
+        }
+
+        if (isset($organizer[0]['CN'])) {
+            return $organizer[0]['CN'];
+        }
+
+        $organizer = parse_url($this->getAttribute('ORGANIZER'));
+
+        return $organizer['path'];
+    }
+
+    /**
+     * Update this event with details from another event.
+     *
+     * @param Horde_Icalendar_Vevent $vevent  The vEvent with latest details.
+     */
+    public function updateFromvEvent($vevent)
+    {
+        $newAttributes = $vevent->getAllAttributes();
+        foreach ($newAttributes as $newAttribute) {
+            try {
+                $currentValue = $this->getAttribute($newAttribute['name']);
+            } catch (Horde_Icalendar_Exception $e) {
+                // Already exists so just add it.
+                $this->setAttribute($newAttribute['name'],
+                                    $newAttribute['value'],
+                                    $newAttribute['params']);
+                continue;
+            }
+
+            // Already exists so locate and modify.
+            $found = false;
+
+            // Try matching the attribte name and value incase
+            // only the params changed (eg attendee updating
+            // status).
+            foreach ($this->_attributes as $id => $attr) {
+                if ($attr['name'] == $newAttribute['name'] &&
+                    $attr['value'] == $newAttribute['value']) {
+                    // merge the params
+                    foreach ($newAttribute['params'] as $param_id => $param_name) {
+                        $this->_attributes[$id]['params'][$param_id] = $param_name;
+                    }
+                    $found = true;
+                    break;
+                }
+            }
+            if (!$found) {
+                // Else match the first attribute with the same
+                // name (eg changing start time).
+                foreach ($this->_attributes as $id => $attr) {
+                    if ($attr['name'] == $newAttribute['name']) {
+                        $this->_attributes[$id]['value'] = $newAttribute['value'];
+                        // Merge the params.
+                        foreach ($newAttribute['params'] as $param_id => $param_name) {
+                            $this->_attributes[$id]['params'][$param_id] = $param_name;
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Update just the attendess of event with details from another
+     * event.
+     *
+     * @param Horde_Icalendar_Vevent $vevent  The vEvent with latest details
+     */
+    public function updateAttendeesFromvEvent($vevent)
+    {
+        $newAttributes = $vevent->getAllAttributes();
+        foreach ($newAttributes as $newAttribute) {
+            if ($newAttribute['name'] != 'ATTENDEE') {
+                continue;
+            }
+
+            try {
+                $currentValue = $this->getAttribute($newAttribute['name']);
+            } catch (Horde_Icalendar_Exception $e) {
+                // Already exists so just add it.
+                $this->setAttribute($newAttribute['name'],
+                                    $newAttribute['value'],
+                                    $newAttribute['params']);
+                continue;
+            }
+
+            // Already exists so locate and modify.
+            $found = false;
+            // Try matching the attribte name and value incase
+            // only the params changed (eg attendee updating
+            // status).
+            foreach ($this->_attributes as $id => $attr) {
+                if ($attr['name'] == $newAttribute['name'] &&
+                    $attr['value'] == $newAttribute['value']) {
+                    // Merge the params.
+                    foreach ($newAttribute['params'] as $param_id => $param_name) {
+                        $this->_attributes[$id]['params'][$param_id] = $param_name;
+                    }
+                    $found = true;
+                    break;
+                }
+            }
+
+            if (!$found) {
+                // Else match the first attribute with the same
+                // name (eg changing start time).
+                foreach ($this->_attributes as $id => $attr) {
+                    if ($attr['name'] == $newAttribute['name']) {
+                        $this->_attributes[$id]['value'] = $newAttribute['value'];
+                        // Merge the params.
+                        foreach ($newAttribute['params'] as $param_id => $param_name) {
+                            $this->_attributes[$id]['params'][$param_id] = $param_name;
+                        }
+                        break;
+                    }
+                }
+            }
+        }
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vfreebusy.php b/framework/Icalendar/lib/Horde/Icalendar/Vfreebusy.php
new file mode 100644 (file)
index 0000000..f66f4e4
--- /dev/null
@@ -0,0 +1,502 @@
+<?php
+/**
+ * Class representing vFreebusy components.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @todo Don't use timestamps
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_ICalendar_Vfreebusy extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vFreebusy';
+
+    /**
+     * TODO
+     *
+     * @var array
+     */
+    protected $_busyPeriods = array();
+
+    /**
+     * TODO
+     *
+     * @var array
+     */
+    protected $_extraParams = array();
+
+    /**
+     * Parses a string containing vFreebusy data.
+     *
+     * @param string $data     The data to parse.
+     * @param $type TODO
+     * @param $charset TODO
+     */
+    public function parsevCalendar($data, $type = null, $charset = null)
+    {
+        parent::parsevCalendar($data, 'VFREEBUSY', $charset);
+
+        // Do something with all the busy periods.
+        foreach ($this->_attributes as $key => $attribute) {
+            if ($attribute['name'] != 'FREEBUSY') {
+                continue;
+            }
+            foreach ($attribute['values'] as $value) {
+                $params = isset($attribute['params'])
+                    ? $attribute['params']
+                    : array();
+                if (isset($value['duration'])) {
+                    $this->addBusyPeriod('BUSY', $value['start'], null,
+                                         $value['duration'], $params);
+                } else {
+                    $this->addBusyPeriod('BUSY', $value['start'],
+                                         $value['end'], null, $params);
+                }
+            }
+            unset($this->_attributes[$key]);
+        }
+    }
+
+    /**
+     * Returns the component exported as string.
+     *
+     * @return string  The exported vFreeBusy information according to the
+     *                 iCalendar format specification.
+     */
+    public function exportvCalendar()
+    {
+        foreach ($this->_busyPeriods as $start => $end) {
+            $periods = array(array('start' => $start, 'end' => $end));
+            $this->setAttribute('FREEBUSY', $periods,
+                                isset($this->_extraParams[$start])
+                                ? $this->_extraParams[$start] : array());
+        }
+
+        $res = $this->_exportvData('VFREEBUSY');
+
+        foreach ($this->_attributes as $key => $attribute) {
+            if ($attribute['name'] == 'FREEBUSY') {
+                unset($this->_attributes[$key]);
+            }
+        }
+
+        return $res;
+    }
+
+    /**
+     * Returns a display name for this object.
+     *
+     * @return string  A clear text name for displaying this object.
+     */
+    public function getName()
+    {
+        $name = '';
+
+        try {
+            $method = !empty($this->_container)
+                ? $this->_container->getAttribute('METHOD')
+                : 'PUBLISH';
+            if ($method == 'PUBLISH') {
+                $attr = 'ORGANIZER';
+            } elseif ($method == 'REPLY') {
+                $attr = 'ATTENDEE';
+            }
+        } catch (Horde_Icalendar_Exception $e) {
+            $attr = 'ORGANIZER';
+        }
+
+        try {
+            $name = $this->getAttribute($attr, true);
+            if (isset($name[0]['CN'])) {
+                return $name[0]['CN'];
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $name = parse_url($this->getAttribute($attr));
+            return $name['path'];
+        } catch (Horde_Icalendar_Exception $e) {
+            return '';
+        }
+    }
+
+    /**
+     * Returns the email address for this object.
+     *
+     * @return string  The email address of this object's owner.
+     */
+    public function getEmail()
+    {
+        $name = '';
+
+        try {
+            $method = !empty($this->_container)
+                ? $this->_container->getAttribute('METHOD')
+                : 'PUBLISH';
+            if ($method == 'PUBLISH') {
+                $attr = 'ORGANIZER';
+            } elseif ($method == 'REPLY') {
+                $attr = 'ATTENDEE';
+            }
+        } catch (Horde_Icalendar_Exception $e) {
+            $attr = 'ORGANIZER';
+        }
+
+        try {
+            $name = parse_url($this->getAttribute($attr));
+            return $name['path'];
+        } catch (Horde_Icalendar_Exception $e) {
+            return '';
+        }
+    }
+
+    /**
+     * Returns the busy periods.
+     *
+     * @return array  All busy periods.
+     */
+    public function getBusyPeriods()
+    {
+        return $this->_busyPeriods;
+    }
+
+    /**
+     * Returns any additional freebusy parameters.
+     *
+     * @return array  Additional parameters of the freebusy periods.
+     */
+    public function getExtraParams()
+    {
+        return $this->_extraParams;
+    }
+
+    /**
+     * Returns all the free periods of time in a given period.
+     *
+     * @param integer $startStamp  The start timestamp.
+     * @param integer $endStamp    The end timestamp.
+     *
+     * @return array  A hash with free time periods, the start times as the
+     *                keys and the end times as the values.
+     */
+    public function getFreePeriods($startStamp, $endStamp)
+    {
+        $this->simplify();
+        $periods = array();
+
+        // Check that we have data for some part of this period.
+        if ($this->getEnd() < $startStamp || $this->getStart() > $endStamp) {
+            return $periods;
+        }
+
+        // Locate the first time in the requested period we have data for.
+        $nextstart = max($startStamp, $this->getStart());
+
+        // Check each busy period and add free periods in between.
+        foreach ($this->_busyPeriods as $start => $end) {
+            if ($start <= $endStamp && $end >= $nextstart) {
+                if ($nextstart <= $start) {
+                    $periods[$nextstart] = min($start, $endStamp);
+                }
+                $nextstart = min($end, $endStamp);
+            }
+        }
+
+        // If we didn't read the end of the requested period but still have
+        // data then mark as free to the end of the period or available data.
+        if ($nextstart < $endStamp && $nextstart < $this->getEnd()) {
+            $periods[$nextstart] = min($this->getEnd(), $endStamp);
+        }
+
+        return $periods;
+    }
+
+    /**
+     * Adds a busy period to the info.
+     *
+     * This function may throw away data in case you add a period with a start
+     * date that already exists. The longer of the two periods will be chosen
+     * (and all information associated with the shorter one will be removed).
+     *
+     * @param string $type       The type of the period. Either 'FREE' or
+     *                           'BUSY'; only 'BUSY' supported at the moment.
+     * @param integer $start     The start timestamp of the period.
+     * @param integer $end       The end timestamp of the period.
+     * @param integer $duration  The duration of the period. If specified, the
+     *                           $end parameter will be ignored.
+     * @param array   $extra     Additional parameters for this busy period.
+     */
+    public function addBusyPeriod($type, $start, $end = null, $duration = null,
+                                  $extra = array())
+    {
+        if ($type == 'FREE') {
+            // Make sure this period is not marked as busy.
+            return false;
+        }
+
+        // Calculate the end time if duration was specified.
+        $tempEnd = is_null($duration) ? $end : $start + $duration;
+
+        // Make sure the period length is always positive.
+        $end = max($start, $tempEnd);
+        $start = min($start, $tempEnd);
+
+        if (isset($this->_busyPeriods[$start])) {
+            // Already a period starting at this time. Change the current
+            // period only if the new one is longer. This might be a problem
+            // if the callee assumes that there is no simplification going
+            // on. But since the periods are stored using the start time of
+            // the busy periods we have to throw away data here.
+            if ($end > $this->_busyPeriods[$start]) {
+                $this->_busyPeriods[$start] = $end;
+                $this->_extraParams[$start] = $extra;
+            }
+        } else {
+            // Add a new busy period.
+            $this->_busyPeriods[$start] = $end;
+            $this->_extraParams[$start] = $extra;
+        }
+
+        return true;
+    }
+
+    /**
+     * Returns the timestamp of the start of the time period this free busy
+     * information covers.
+     *
+     * @return integer  A timestamp.
+     */
+    public function getStart()
+    {
+        try {
+            return $this->getAttribute('DTSTART');
+        } catch (Horde_Icalendar_Exception $e) {
+            return count($this->_busyPeriods)
+                ? min(array_keys($this->_busyPeriods))
+                : false;
+        }
+    }
+
+    /**
+     * Returns the timestamp of the end of the time period this free busy
+     * information covers.
+     *
+     * @return integer  A timestamp.
+     */
+    public function getEnd()
+    {
+        try {
+            return $this->getAttribute('DTEND');
+        } catch (Horde_Icalendar_Exception $e) {
+            return count($this->_busyPeriods)
+                ? max(array_values($this->_busyPeriods))
+                : false;
+        }
+    }
+
+    /**
+     * Merges the busy periods of another Horde_Icalendar_Vfreebusy object
+     * into this one.
+     *
+     * This might lead to simplification no matter what you specify for the
+     * "simplify" flag since periods with the same start date will lead to the
+     * shorter period being removed (see addBusyPeriod).
+     *
+     * @param Horde_Icalendar_Vfreebusy $freebusy  A freebusy object.
+     * @param boolean $simplify                    If true, simplify() will
+     *                                             called after the merge.
+     */
+    public function merge(Horde_Icalendar_Vfreebusy $freebusy,
+                          $simplify = true)
+    {
+        $extra = $freebusy->getExtraParams();
+        foreach ($freebusy->getBusyPeriods() as $start => $end) {
+            // This might simplify the busy periods without taking the
+            // "simplify" flag into account.
+            $this->addBusyPeriod('BUSY', $start, $end, null,
+                                 isset($extra[$start])
+                                 ? $extra[$start] : array());
+        }
+
+        foreach (array('DTSTART', 'DTEND') as $val) {
+            try {
+                $thisattr = $this->getAttribute($val);
+            } catch (Horde_Icalendar_Exception $e) {
+                $thisattr = null;
+            }
+
+            try {
+                $thatattr = $freebusy->getAttribute($val);
+            } catch (Horde_Icalendar_Exception $e) {
+                $thatattr = null;
+            }
+
+            if (is_null($thisattr) && !is_null($thatattr)) {
+                $this->setAttribute($val, $thatattr, array(), false);
+            } elseif (!is_null($thatattr)) {
+                switch ($val) {
+                case 'DTSTART':
+                    $set = ($thatattr < $thisattr);
+                    break;
+
+                case 'DTEND':
+                    $set = ($thatattr > $thisattr);
+                    break;
+                }
+
+                if ($set) {
+                    $this->setAttribute($val, $thatattr, array(), false);
+                }
+            }
+        }
+
+        if ($simplify) {
+            $this->simplify();
+        }
+
+        return true;
+    }
+
+    /**
+     * Removes all overlaps and simplifies the busy periods array as much as
+     * possible.
+     */
+    public function simplify()
+    {
+        $clean = false;
+        $busy  = array($this->_busyPeriods, $this->_extraParams);
+        while (!$clean) {
+            $result = $this->_simplify($busy[0], $busy[1]);
+            $clean = $result === $busy;
+            $busy = $result;
+        }
+
+        ksort($result[1], SORT_NUMERIC);
+        $this->_extraParams = $result[1];
+
+        ksort($result[0], SORT_NUMERIC);
+        $this->_busyPeriods = $result[0];
+    }
+
+    /**
+     * TODO
+     *
+     * @param $busyPeriods TODO
+     * @param array $extraParams TODO
+     *
+     * @return array TODO
+     */
+    protected function _simplify($busyPeriods, $extraParams = array())
+    {
+        $checked = $checkedExtra = array();
+        $checkedEmpty = true;
+
+        foreach ($busyPeriods as $start => $end) {
+            if ($checkedEmpty) {
+                $checked[$start] = $end;
+                $checkedExtra[$start] = isset($extraParams[$start])
+                    ? $extraParams[$start]
+                    : array();
+                $checkedEmpty = false;
+            } else {
+                $added = false;
+                foreach ($checked as $testStart => $testEnd) {
+                    // Replace old period if the new period lies around the
+                    // old period.
+                    if ($start <= $testStart && $end >= $testEnd) {
+                        // Remove old period entry.
+                        unset($checked[$testStart]);
+                        unset($checkedExtra[$testStart]);
+                        // Add replacing entry.
+                        $checked[$start] = $end;
+                        $checkedExtra[$start] = isset($extraParams[$start])
+                            ? $extraParams[$start]
+                            : array();
+                        $added = true;
+                    } elseif ($start >= $testStart && $end <= $testEnd) {
+                        // The new period lies fully within the old
+                        // period. Just forget about it.
+                        $added = true;
+                    } elseif (($end <= $testEnd && $end >= $testStart) ||
+                              ($start >= $testStart && $start <= $testEnd)) {
+                        // Now we are in trouble: Overlapping time periods. If
+                        // we allow for additional parameters we cannot simply
+                        // choose one of the two parameter sets. It's better
+                        // to leave two separated time periods.
+                        $extra = isset($extraParams[$start])
+                            ? $extraParams[$start]
+                            : array();
+                        $testExtra = isset($checkedExtra[$testStart])
+                            ? $checkedExtra[$testStart]
+                            : array();
+                        // Remove old period entry.
+                        unset($checked[$testStart]);
+                        unset($checkedExtra[$testStart]);
+                        // We have two periods overlapping. Are their
+                        // additional parameters the same or different?
+                        $newStart = min($start, $testStart);
+                        $newEnd = max($end, $testEnd);
+                        if ($extra === $testExtra) {
+                            // Both periods have the same information. So we
+                            // can just merge.
+                            $checked[$newStart] = $newEnd;
+                            $checkedExtra[$newStart] = $extra;
+                        } else {
+                            // Extra parameters are different. Create one
+                            // period at the beginning with the params of the
+                            // first period and create a trailing period with
+                            // the params of the second period. The break
+                            // point will be the end of the first period.
+                            $break = min($end, $testEnd);
+                            $checked[$newStart] = $break;
+                            $checkedExtra[$newStart] =
+                                isset($extraParams[$newStart])
+                                ? $extraParams[$newStart]
+                                : array();
+                            $checked[$break] = $newEnd;
+                            $highStart = max($start, $testStart);
+                            $checkedExtra[$break] =
+                                isset($extraParams[$highStart])
+                                ? $extraParams[$highStart]
+                                : array();
+
+                            // Ensure we also have the extra data in the
+                            // extraParams.
+                            $extraParams[$break] =
+                                isset($extraParams[$highStart])
+                                ? $extraParams[$highStart]
+                                : array();
+                        }
+                        $added = true;
+                    }
+
+                    if ($added) {
+                        break;
+                    }
+                }
+
+                if (!$added) {
+                    $checked[$start] = $end;
+                    $checkedExtra[$start] = isset($extraParams[$start])
+                        ? $extraParams[$start]
+                        : array();
+                }
+            }
+        }
+
+        return array($checked, $checkedExtra);
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vjournal.php b/framework/Icalendar/lib/Horde/Icalendar/Vjournal.php
new file mode 100644 (file)
index 0000000..5dcbee1
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Class representing vJournals.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vjournal extends Horde_Icalendar {
+
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vJournal';
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('VJOURNAL');
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vnote.php b/framework/Icalendar/lib/Horde/Icalendar/Vnote.php
new file mode 100644 (file)
index 0000000..95558e1
--- /dev/null
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Class representing vNotes.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @author   Karsten Fourmont <fourmont@gmx.de>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vnote extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vNote';
+
+    /**
+     * Constructor.
+     */
+    public function __construct($version = '1.1')
+    {
+        parent::__construct($version);
+    }
+
+    /**
+     * Sets the version of this component.
+     *
+     * @see $version
+     * @see $oldFormat
+     *
+     * @param string  A float-like version string.
+     */
+    public function setVersion($version)
+    {
+        $this->oldFormat = $version < 1;
+        $this->version = $version;
+    }
+
+    /**
+     * Unlike vevent and vtodo, a vnote is normally not enclosed in an
+     * iCalendar container. (BEGIN..END)
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        $requiredAttributes['BODY'] = '';
+        $requiredAttributes['VERSION'] = '1.1';
+
+        foreach ($requiredAttributes as $name => $default_value) {
+            try {
+                $this->getAttribute($name);
+            } catch (Horde_Icalendar_Exception $e) {
+                $this->setAttribute($name, $default_value);
+            }
+        }
+
+        return $this->_exportvData('VNOTE');
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vtimezone.php b/framework/Icalendar/lib/Horde/Icalendar/Vtimezone.php
new file mode 100644 (file)
index 0000000..6c63a5b
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+/**
+ * Class representing vTimezones.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vtimezone extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vTimeZone';
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('VTIMEZONE');
+    }
+
+    /**
+     * Parse child components of the vTimezone component. Returns an
+     * array with the exact time of the time change as well as the
+     * 'from' and 'to' offsets around the change. Time is arbitrarily
+     * based on UTC for comparison.
+     *
+     * @param &$child TODO
+     * @param $year TODO
+     *
+     * @return TODO
+     */
+    public function parseChild(&$child, $year)
+    {
+        // Make sure 'time' key is first for sort().
+        $result['time'] = 0;
+
+        try {
+            $t = $child->getAttribute('TZOFFSETFROM');
+        } catch (Horde_Icalendar_Exception $e) {
+            return false;
+        }
+        $result['from'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
+
+        try {
+            $t = $child->getAttribute('TZOFFSETTO');
+        } catch (Horde_Icalendar_Exception $e) {
+            return false;
+        }
+        $result['to'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
+
+        try {
+            $switch_time = $child->getAttribute('DTSTART');
+        } catch (Horde_Icalendar_Exception $e) {
+            return false;
+        }
+
+        try {
+            $rrules = $child->getAttribute('RRULE');
+        } catch (Horde_Icalendar_Exception $e) {
+            if (!is_int($switch_time)) {
+                return false;
+            }
+            // Convert this timestamp from local time to UTC for
+            // comparison (All dates are compared as if they are UTC).
+            $t = getdate($switch_time);
+            $result['time'] = @gmmktime($t['hours'], $t['minutes'], $t['seconds'],
+                                        $t['mon'], $t['mday'], $t['year']);
+            return $result;
+        }
+
+        $rrules = explode(';', $rrules);
+        foreach ($rrules as $rrule) {
+            $t = explode('=', $rrule);
+            switch ($t[0]) {
+            case 'FREQ':
+                if ($t[1] != 'YEARLY') {
+                    return false;
+                }
+                break;
+
+            case 'INTERVAL':
+                if ($t[1] != '1') {
+                    return false;
+                }
+                break;
+
+            case 'BYMONTH':
+                $month = intval($t[1]);
+                break;
+
+            case 'BYDAY':
+                $len = strspn($t[1], '1234567890-+');
+                if ($len == 0) {
+                    return false;
+                }
+                $weekday = substr($t[1], $len);
+                $weekdays = array(
+                    'SU' => 0,
+                    'MO' => 1,
+                    'TU' => 2,
+                    'WE' => 3,
+                    'TH' => 4,
+                    'FR' => 5,
+                    'SA' => 6
+                );
+                $weekday = $weekdays[$weekday];
+                $which = intval(substr($t[1], 0, $len));
+                break;
+
+            case 'UNTIL':
+                if (intval($year) > intval(substr($t[1], 0, 4))) {
+                    return false;
+                }
+                break;
+            }
+        }
+
+        if (empty($month) || !isset($weekday)) {
+            return false;
+        }
+
+        if (is_int($switch_time)) {
+            // Was stored as localtime.
+            $switch_time = strftime('%H:%M:%S', $switch_time);
+            $switch_time = explode(':', $switch_time);
+        } else {
+            $switch_time = explode('T', $switch_time);
+            if (count($switch_time) != 2) {
+                return false;
+            }
+            $switch_time[0] = substr($switch_time[1], 0, 2);
+            $switch_time[2] = substr($switch_time[1], 4, 2);
+            $switch_time[1] = substr($switch_time[1], 2, 2);
+        }
+
+        // Get the timestamp for the first day of $month.
+        $when = gmmktime($switch_time[0], $switch_time[1], $switch_time[2],
+                         $month, 1, $year);
+        // Get the day of the week for the first day of $month.
+        $first_of_month_weekday = intval(gmstrftime('%w', $when));
+
+        // Go to the first $weekday before first day of $month.
+        if ($weekday >= $first_of_month_weekday) {
+            $weekday -= 7;
+        }
+        $when -= ($first_of_month_weekday - $weekday) * 60 * 60 * 24;
+
+        // If going backwards go to the first $weekday after last day
+        // of $month.
+        if ($which < 0) {
+            do {
+                $when += 60*60*24*7;
+            } while (intval(gmstrftime('%m', $when)) == $month);
+        }
+
+        // Calculate $weekday number $which.
+        $when += $which * 60 * 60 * 24 * 7;
+
+        $result['time'] = $when;
+
+        return $result;
+    }
+
+}
diff --git a/framework/Icalendar/lib/Horde/Icalendar/Vtodo.php b/framework/Icalendar/lib/Horde/Icalendar/Vtodo.php
new file mode 100644 (file)
index 0000000..dd7be53
--- /dev/null
@@ -0,0 +1,99 @@
+<?php
+/**
+ * Class representing vTodos.
+ *
+ * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author   Mike Cochrane <mike@graftonhall.co.nz>
+ * @category Horde
+ * @license  http://www.fsf.org/copyleft/lgpl.html LGPL
+ * @package  Icalendar
+ */
+class Horde_Icalendar_Vtodo extends Horde_Icalendar
+{
+    /**
+     * The component type of this class.
+     *
+     * @var string
+     */
+    public $type = 'vTodo';
+
+    /**
+     * TODO
+     *
+     * @return TODO
+     */
+    public function exportvCalendar()
+    {
+        return $this->_exportvData('VTODO');
+    }
+
+    /**
+     * Convert this todo to an array of attributes.
+     *
+     * @return array  Array containing the details of the todo in a hash
+     *                as used by Horde applications.
+     */
+    public function toArray()
+    {
+        $todo = array();
+
+        try {
+            $name = $this->getAttribute('SUMMARY');
+            if (!is_array($name)) {
+                $todo['name'] = $name;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $desc = $this->getAttribute('DESCRIPTION');
+            if (!is_array($desc)) {
+                $todo['desc'] = $desc;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $priority = $this->getAttribute('PRIORITY');
+            if (!is_array($priority)) {
+                $todo['priority'] = $priority;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $due = $this->getAttribute('DTSTAMP');
+            if (!is_array($due)) {
+                $todo['due'] = $due;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        return $todo;
+    }
+
+    /**
+     * Set the attributes for this todo item from an array.
+     *
+     * @param array $todo  Array containing the details of the todo in
+     *                     the same format that toArray() exports.
+     */
+    public function fromArray($todo)
+    {
+        if (isset($todo['name'])) {
+            $this->setAttribute('SUMMARY', $todo['name']);
+        }
+        if (isset($todo['desc'])) {
+            $this->setAttribute('DESCRIPTION', $todo['desc']);
+        }
+
+        if (isset($todo['priority'])) {
+            $this->setAttribute('PRIORITY', $todo['priority']);
+        }
+
+        if (isset($todo['due'])) {
+            $this->setAttribute('DTSTAMP', $todo['due']);
+        }
+    }
+
+}
diff --git a/framework/Icalendar/package.xml b/framework/Icalendar/package.xml
new file mode 100644 (file)
index 0000000..8756e99
--- /dev/null
@@ -0,0 +1,240 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+http://pear.php.net/dtd/tasks-1.0.xsd
+http://pear.php.net/dtd/package-2.0
+http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Icalendar</name>
+ <channel>pear.horde.org</channel>
+ <summary>iCalendar API</summary>
+ <description>This package provides an API for dealing with iCalendar data.</description>
+ <lead>
+  <name>Chuck Hagenbuch</name>
+  <user>chuck</user>
+  <email>chuck@horde.org</email>
+  <active>yes</active>
+ </lead>
+ <lead>
+  <name>Jan Schneider</name>
+  <user>jan</user>
+  <email>jan@horde.org</email>
+  <active>yes</active>
+ </lead>
+ <date>2010-08-02</date>
+ <version>
+  <release>0.2.0</release>
+  <api>0.2.0</api>
+ </version>
+ <stability>
+  <release>beta</release>
+  <api>beta</api>
+ </stability>
+ <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+ <notes>* Initial Horde 4 package.
+ </notes>
+ <contents>
+  <dir name="/">
+   <dir name="examples">
+    <dir name="Horde">
+     <dir name="Icalendar">
+      <file name="exchange.ics" role="doc" />
+      <file name="exdate.ics" role="doc" />
+      <file name="ical.ics" role="doc" />
+      <file name="parser.php" role="doc" />
+      <file name="test_recurring.vcs" role="doc" />
+      <file name="vnote.txt" role="doc" />
+     </dir> <!-- /examples/Horde/Icalendar -->
+    </dir> <!-- /examples/Horde -->
+   </dir> <!-- /examples -->
+   <dir name="lib">
+    <dir name="Horde">
+     <dir name="ICalendar">
+      <file name="Daylight.php" role="php" />
+      <file name="Exception.php" role="php" />
+      <file name="Standard.php" role="php" />
+      <file name="Valarm.php" role="php" />
+      <file name="Vcard.php" role="php" />
+      <file name="Vevent.php" role="php" />
+      <file name="Vfreebusy.php" role="php" />
+      <file name="Vjournal.php" role="php" />
+      <file name="Vnote.php" role="php" />
+      <file name="Vtimezone.php" role="php" />
+      <file name="Vtodo.php" role="php" />
+     </dir> <!-- /lib/Horde/Icalendar -->
+     <file name="Icalendar.php" role="php" />
+    </dir> <!-- /lib/Horde -->
+   </dir> <!-- /lib -->
+   <dir name="test">
+    <dir name="Horde">
+     <dir name="Icalendar">
+      <dir name="fixtures">
+       <dir name="vTimezone">
+        <file name="AuthorChats.ics" role="test" />
+        <file name="MMMPseminar.ics" role="test" />
+        <file name="Moon_Days.ics" role="test" />
+        <file name="ProjectCalendar.ics" role="test" />
+        <file name="SpanishHolidays.ics" role="test" />
+        <file name="allcategories.ics" role="test" />
+        <file name="arsenal32FC.ics" role="test" />
+        <file name="events.ics" role="test" />
+        <file name="exchange.ics" role="test" />
+        <file name="exdate.ics" role="test" />
+        <file name="iscw.ics" role="test" />
+        <file name="meeting.ics" role="test" />
+        <file name="privacy_events.ics" role="test" />
+        <file name="rfc2445.ics" role="test" />
+        <file name="test.vcs" role="test" />
+        <file name="test4.vcs" role="test" />
+        <file name="test_recurring.vcs" role="test" />
+        <file name="wicca.ics" role="test" />
+       </dir> <!-- /test/Horde/Icalendar/fixtures/vTimezone -->
+      </dir> <!-- /test/Horde/Icalendar/fixtures -->
+      <file name="bug_7423.phpt" role="test" />
+      <file name="charset1.phpt" role="test" />
+      <file name="empty_data.phpt" role="test" />
+      <file name="geo.phpt" role="test" />
+      <file name="iCalendar.phpt" role="test" />
+      <file name="line-folding.phpt" role="test" />
+      <file name="quoted-params.phpt" role="test" />
+      <file name="read-escapes.phpt" role="test" />
+      <file name="read-vcard-org.phpt" role="test" />
+      <file name="read-write-escapes.phpt" role="test" />
+      <file name="timezones.phpt" role="test" />
+      <file name="vcal20.phpt" role="test" />
+      <file name="vfreebusy.phpt" role="test" />
+      <file name="write-escapes.phpt" role="test" />
+     </dir> <!-- /test/Horde/Icalendar -->
+    </dir> <!-- /test/Horde -->
+   </dir> <!-- /test -->
+  </dir> <!-- / -->
+ </contents>
+ <dependencies>
+  <required>
+   <php>
+    <min>5.2.0</min>
+   </php>
+   <pearinstaller>
+    <min>1.7.0</min>
+   </pearinstaller>
+   <package>
+    <name>Exception</name>
+    <channel>pear.horde.org</channel>
+   </package>
+   <package>
+    <name>Mime</name>
+    <channel>pear.horde.org</channel>
+   </package>
+   <package>
+    <name>Support</name>
+    <channel>pear.horde.org</channel>
+   </package>
+   <package>
+    <name>Util</name>
+    <channel>pear.horde.org</channel>
+   </package>
+  </required>
+ </dependencies>
+ <phprelease>
+  <install name="lib/Horde/Icalendar/Daylight.php" as="Horde/Icalendar/Daylight.php" />
+  <install name="lib/Horde/Icalendar/Exception.php" as="Horde/Icalendar/Exception.php" />
+  <install name="lib/Horde/Icalendar/Standard.php" as="Horde/Icalendar/Standard.php" />
+  <install name="lib/Horde/Icalendar/Valarm.php" as="Horde/Icalendar/Valarm.php" />
+  <install name="lib/Horde/Icalendar/Vcard.php" as="Horde/Icalendar/Vcard.php" />
+  <install name="lib/Horde/Icalendar/Vevent.php" as="Horde/Icalendar/Vevent.php" />
+  <install name="lib/Horde/Icalendar/Vfreebusy.php" as="Horde/Icalendar/Vfreebusy.php" />
+  <install name="lib/Horde/Icalendar/Vjournal.php" as="Horde/Icalendar/Vjournal.php" />
+  <install name="lib/Horde/Icalendar/Vnote.php" as="Horde/Icalendar/Vnote.php" />
+  <install name="lib/Horde/Icalendar/Vtimezone.php" as="Horde/Icalendar/Vtimezone.php" />
+  <install name="lib/Horde/Icalendar/Vtodo.php" as="Horde/Icalendar/Vtodo.php" />
+  <install name="lib/Horde/Icalendar.php" as="Horde/Icalendar.php" />
+ </phprelease>
+ <changelog>
+  <release>
+   <date>2008-09-25</date>
+   <version>
+    <release>0.1.0</release>
+    <api>0.1.0</api>
+   </version>
+   <stability>
+    <release>beta</release>
+    <api>beta</api>
+   </stability>
+   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+   <notes>* Fix vFreebusy merging (Bug #4807).
+   * Implement handling of vTimezones in iCalendar data (lists-horde@carlthompson.net, Bug #4399).
+   * Correctly produce vcard parameters without value, like "ADR;WORK:...".
+   * Support departments in vCard's ORG properties (martin@matuska.org, Bug #4285).
+   * Fixed _parseDateTime() (wrobel@pardus.de, Bug #4808).
+   * Fix exporting of recurring exceptions (Bug #4627).
+   * Use lowercase mailto: for better Apple iCal compatibility.
+   * We must *not* escape colons per RFC in param values.
+   * Fix encoding issues with iCalendar 2.0 exports.
+   * Move version specific vCalendar/iCalendar export to Kronolith_Event.
+   * Use QUOTED-PRINTABLE when there's a newline in VNOTE data.
+   * Anniversary support (ntai@smartfruit.com, Request #5059).
+   * Support for all day events with VCALENDAR 1.0.
+   * Use ISO-8559-1 as default vCalendar 1.0 and vCard 2.1.
+   * Fix unreliably overwriting a variable with itself (rsalmon@mbpgroup.com, Bug #5652).
+   * Handle AALARM data with parameters (delimited by a ";").
+   * Fix GEO parsing and generation.
+   * Refactor line folding and quoted-printable encoding.
+   * Add missing softline break (Bug #6541).
+   * Don't require a newline after END (Bug #6641, #6706).
+   * Fix detecting of "old" formats when parsing vCalendar/vCard data.
+   * Request charset on the fly, because it depends on the VERSION property.
+   * Fix passing value arrays with only one element.
+   * Correctly parse quoted parameters (Bug #7031)
+   * Set the correct version if none provided through the vcard data.
+   * BODY is not required, but N is, and FN for vcard3.0.
+   * Return the passed address unmodified if Mail_RFC822::validateMailbox() fails.
+   * Fixed importing of several events at once.
+   * Removed required calendar component properties in vevent.php.
+   * Fix generation of UIDs with PHP 5.2+.
+   * Fix generation of free periods with overlapping events (cedric.parent@multitel.be).
+   * Add support for extended vfreebusy parameters (wrobel@gentoo.org, Request #4690).
+   * Ensure vnotes and vcards are created with a valid default version number.
+   </notes>
+  </release>
+  <release>
+   <date>2006-05-08</date>
+   <version>
+    <release>0.0.3</release>
+    <api>0.0.3</api>
+   </version>
+   <stability>
+    <release>beta</release>
+    <api>beta</api>
+   </stability>
+   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+   <notes>* Converted to package.xml 2.0 for pear.horde.org.
+   </notes>
+  </release>
+  <release>
+   <version>
+    <release>0.0.2</release>
+    <api>0.0.2</api>
+   </version>
+   <stability>
+    <release>beta</release>
+    <api>beta</api>
+   </stability>
+   <date>2004-12-05</date>
+   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+   <notes>Lots of improvements, bugfixes and support for more fields and members of the iCalendar family.
+   </notes>
+  </release>
+  <release>
+   <version>
+    <release>0.0.1</release>
+    <api>0.0.1</api>
+   </version>
+   <stability>
+    <release>alpha</release>
+    <api>alpha</api>
+   </stability>
+   <date>2003-07-03</date>
+   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
+   <notes>Initial release as a PEAR package
+   </notes>
+  </release>
+ </changelog>
+</package>
diff --git a/framework/Icalendar/test/.cvsignore b/framework/Icalendar/test/.cvsignore
new file mode 100644 (file)
index 0000000..4fce866
--- /dev/null
@@ -0,0 +1,5 @@
+*.diff
+*.log
+*.exp
+*.php
+*.out
diff --git a/framework/Icalendar/test/Horde/Icalendar/bug_7423.phpt b/framework/Icalendar/test/Horde/Icalendar/bug_7423.phpt
new file mode 100644 (file)
index 0000000..cf3e3a8
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug #7423: Leading space on attribute names
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$data = 'BEGIN:VCALENDAR
+VERSION:2.0
+METHOD:PUBLISH
+BEGIN:VEVENT
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:PT540M
+END:VALARM
+SUMMARY:birthday
+END:VEVENT
+END:VCALENDAR';
+
+$ical->parseVCalendar($data);
+$components = $ical->getComponents();
+foreach ($components as $component) {
+    var_dump($component->toHash(true));
+}
+
+?>
+--EXPECT--
+array(1) {
+  ["SUMMARY"]=>
+  string(8) "birthday"
+}
diff --git a/framework/Icalendar/test/Horde/Icalendar/charset1.phpt b/framework/Icalendar/test/Horde/Icalendar/charset1.phpt
new file mode 100644 (file)
index 0000000..1bbd030
--- /dev/null
@@ -0,0 +1,50 @@
+--TEST--
+Inline charset test
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$data = 'BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:m=C3=B6chen
+DTSTART:20040628T080000Z
+DTEND:20040628T090000Z
+X-EPOCAGENDAENTRYTYPE:APPOINTMENT
+CLASS:PUBLIC
+DCREATED:20040627T220000Z
+LAST-MODIFIED:20040628T175300Z
+PRIORITY:0
+STATUS:NEEDS ACTION
+END:VEVENT
+END:VCALENDAR';
+
+$ical->parseVCalendar($data);
+$event = $ical->getComponent(0);
+var_dump($event->getAttribute('SUMMARY'));
+
+$data = 'BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+SUMMARY;ENCODING=QUOTED-PRINTABLE:m=C3=B6chen
+DTSTART:20040628T080000Z
+DTEND:20040628T090000Z
+X-EPOCAGENDAENTRYTYPE:APPOINTMENT
+CLASS:PUBLIC
+DCREATED:20040627T220000Z
+LAST-MODIFIED:20040628T175300Z
+PRIORITY:0
+STATUS:NEEDS ACTION
+END:VEVENT
+END:VCALENDAR';
+
+$ical->parseVCalendar($data, 'VCALENDAR', 'UTF-8');
+$event = $ical->getComponent(0);
+var_dump($event->getAttribute('SUMMARY'));
+
+?>
+--EXPECT--
+string(6) "möchen"
+string(6) "möchen"
diff --git a/framework/Icalendar/test/Horde/Icalendar/empty_data.phpt b/framework/Icalendar/test/Horde/Icalendar/empty_data.phpt
new file mode 100644 (file)
index 0000000..9640f46
--- /dev/null
@@ -0,0 +1,30 @@
+--TEST--
+Empty data parsing test
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$data = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+END:VCALENDAR';
+
+var_export($ical->parseVCalendar($data));
+echo "\n";
+var_export($ical->getComponents());
+echo "\n";
+var_export($ical->parseVCalendar(''));
+echo "\n";
+var_export($ical->getComponents());
+echo "\n";
+
+?>
+--EXPECT--
+true
+array (
+)
+false
+array (
+)
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/AuthorChats.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/AuthorChats.ics
new file mode 100644 (file)
index 0000000..49956a1
--- /dev/null
@@ -0,0 +1,208 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:AuthorChats\r
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
+X-WR-RELCALID:7245D10D-C6E4-40D1-998A-4FDDE8522F8A\r
+X-WR-TIMEZONE:US/Central\r
+CALSCALE:GREGORIAN\r
+METHOD:PUBLISH\r
+X-WR-CALDESC:Chat dates for CPLLC authors.\r
+BEGIN:VTIMEZONE\r
+TZID:US/Central\r
+LAST-MODIFIED:20060901T191936Z\r
+BEGIN:DAYLIGHT\r
+DTSTART:20060402T080000\r
+TZOFFSETTO:-0500\r
+TZOFFSETFROM:+0000\r
+TZNAME:CDT\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20061029T020000\r
+TZOFFSETTO:-0600\r
+TZOFFSETFROM:-0500\r
+TZNAME:CST\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20070311T010000\r
+TZOFFSETTO:-0500\r
+TZOFFSETFROM:-0600\r
+TZNAME:CDT\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060806T090000\r
+DTEND;TZID=US/Central:20060806T180000\r
+SUMMARY:FAR Sexy Sunday Chat\r
+UID:814DEA1F-F531-4E04-B3A2-DD49AA54F54E-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:5\r
+DTSTAMP:20060702T204116Z\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:3210FF94-6D76-495F-9381-6A2F00325466\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060729T100000\r
+DTEND;TZID=US/Central:20060729T170000\r
+SUMMARY:Lady Aibell Chat\r
+UID:934838F2-FB0E-4005-A1CA-A6E0F296BD75-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:8\r
+DTSTAMP:20060710T034417Z\r
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=29\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT7H\r
+DTSTAMP:20060710T034417Z\r
+UID:934838F2-FB0E-4005-A1CA-A6E0F296BD75-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:7\r
+RECURRENCE-ID;TZID=US/Central:20060729T100000\r
+DTSTART;TZID=US/Central:20060729T100000\r
+SUMMARY:Lady Aibell Chat\r
+DESCRIPTION:Release author chat on Lady Aibell Loop\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060910T090000\r
+DTEND;TZID=US/Central:20060910T170000\r
+SUMMARY:FAR Sexy Sunday Chat\r
+UID:E8B9C16D-E3A4-4FF8-80BE-F8959008FF75-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:5\r
+DTSTAMP:20060702T204150Z\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:499D81D6-A0DF-4A33-8EEF-6C330D23F3A5\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H\r
+DTSTAMP:20060824T161813Z\r
+UID:633D2C12-E8E9-4C21-855D-48D08D8CCAB4-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
+DTSTART;TZID=US/Central:20060911T200000\r
+SUMMARY:Sapphire Phelan's Birthday and She Wants to Party Chat\r
+DESCRIPTION:Chat starts at 9:00 pm central time.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060826T100000\r
+SUMMARY:Bianca's Chat\r
+URL;VALUE=URI:http://groups.yahoo.com/group/BiancaDArc\r
+UID:B575367D-880A-465A-94E1-3D4D0537C6ED-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:3\r
+DTSTAMP:20060823T145036Z\r
+DURATION:PT1H\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060817T100000\r
+DTEND;TZID=US/Central:20060817T160000\r
+SUMMARY:Lady Aibell Chat @ Coffeetime Devin Group\r
+UID:FC8077B5-DAE0-4EB6-8F36-6DDAB6A87D41-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:7\r
+DTSTAMP:20060710T174446Z\r
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=3TH\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060903T190000\r
+DTEND;TZID=US/Central:20060903T210000\r
+SUMMARY:Live Editor Chat\r
+UID:97B15FA9-C33B-4F64-90F0-46BF15C602C5-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
+SEQUENCE:6\r
+DTSTAMP:20060824T132749Z\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:C1525025-1B21-4382-90E6-DCDBE427B4C1\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060709T090000\r
+DTEND;TZID=US/Central:20060709T170000\r
+SUMMARY:FAR Sexy Sunday Chat\r
+UID:9D3E0CD6-0845-4D2A-9514-02D92AD60866-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+URL;VALUE=URI:http://groups.yahoo.com/group/fallenangelreviewchatters\r
+SEQUENCE:7\r
+DTSTAMP:20060702T202936Z\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:8797188A-A8FA-4761-9547-A288E6B31AAE\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060903T130000\r
+DTEND;TZID=US/Central:20060903T150000\r
+SUMMARY:Tammy Lee Author Live Chat\r
+UID:5C18B411-30F3-4594-A13E-FDB3BD963FE7-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
+SEQUENCE:6\r
+DTSTAMP:20060824T132715Z\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:897B3612-2E79-415D-AEC1-3E3814113EFD\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTAMP:20060818T052554Z\r
+UID:27FE0DC8-9F34-442C-931F-59997619017D-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:9\r
+DTSTART;TZID=US/Central:20060804T100000\r
+SUMMARY:CPLLC Romance Authors @ Coffeetime\r
+DTEND;TZID=US/Central:20060804T160000\r
+DESCRIPTION:Coffeetime Karen Find Out About New Books chat for general r\r
+ omance every first Friday of the month\n\r
+RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT6H\r
+DTSTAMP:20060818T052554Z\r
+UID:27FE0DC8-9F34-442C-931F-59997619017D-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:8\r
+RECURRENCE-ID;TZID=US/Central:20060901T100000\r
+DTSTART;TZID=US/Central:20060901T100000\r
+SUMMARY:CPLLC Romance Authors @ Coffeetime\r
+DESCRIPTION:Coffeetime Karen Find Out About New Books chat for general r\r
+ omance every first Friday of the month\ndk\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H\r
+DTSTAMP:20060824T132246Z\r
+UID:C87293E2-7594-467A-A900-493F067063FB-9F560168-F2A5-46FC-9009-47AAF54\r
+ FE01A\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
+DTSTART;TZID=US/Central:20060830T200000\r
+SUMMARY:Ella Scopilo's Hump Day chat\r
+DESCRIPTION:Come join Ella for an hour of naughty fun!\r
+RRULE:FREQ=WEEKLY;INTERVAL=1\r
+BEGIN:VALARM\r
+ACTION:AUDIO\r
+TRIGGER:-PT15M\r
+X-WR-ALARMUID:A5D69E87-5159-48C6-94BF-F3C7CFF2448B\r
+ATTACH;VALUE=URI:Basso\r
+END:VALARM\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/MMMPseminar.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/MMMPseminar.ics
new file mode 100644 (file)
index 0000000..f5082cd
--- /dev/null
@@ -0,0 +1,180 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:spring2006\r
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
+X-WR-RELCALID:DC5E55FF-E16F-4B73-9E26-1233EFC3A1C9\r
+X-WR-TIMEZONE:US/Central\r
+CALSCALE:GREGORIAN\r
+METHOD:PUBLISH\r
+BEGIN:VTIMEZONE\r
+TZID:US/Central\r
+LAST-MODIFIED:20060130T164630Z\r
+BEGIN:STANDARD\r
+DTSTART:20051030T070000\r
+TZOFFSETTO:-0600\r
+TZOFFSETFROM:+0000\r
+TZNAME:CST\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20060402T010000\r
+TZOFFSETTO:-0500\r
+TZOFFSETFROM:-0600\r
+TZNAME:CDT\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20061029T020000\r
+TZOFFSETTO:-0600\r
+TZOFFSETFROM:-0500\r
+TZNAME:CST\r
+END:STANDARD\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060207T120000\r
+DTEND;TZID=US/Central:20060207T130000\r
+SUMMARY:Jack Murphy\nTrojan Horse or Proton Force: Finding the Right Par\r
+ tners for Toxin Translocation\r
+UID:D6E613D7-59A0-4720-875A-760D97A4B3FD\r
+SEQUENCE:2\r
+DTSTAMP:20060130T163846Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060509T120000\r
+DTEND;TZID=US/Central:20060509T130000\r
+SUMMARY:Kai Matuschewski\nHitting the Plasmodium Life Cycle Early On: At\r
+ tenuated Liver Stages\r
+UID:11A905EB-B0AB-4101-AA7C-90723C00345D\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164444Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060321T120000\r
+DTEND;TZID=US/Central:20060321T130000\r
+SUMMARY:Felix Rey\nInsights into the Mechanism of Membrane Fusion Derive\r
+ d from Structural Studies of Viral Envelope Proteins\r
+UID:BD747E63-BA7D-46E3-9BFF-82ED05963784\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164131Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060221T120000\r
+DTEND;TZID=US/Central:20060221T130000\r
+SUMMARY:Maurizio Del Poeta\nSphingolipid-Mediated Fungal Pathogenesis\r
+UID:ED8190C6-A07F-47EC-A480-20A8FBCF6E17\r
+SEQUENCE:2\r
+DTSTAMP:20060130T163935Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060124T120000\r
+DTEND;TZID=US/Central:20060124T130000\r
+SUMMARY:Jorge Galan\nStructure\, Assembly\, and Function of the Type III\r
+  Secretion Injectisome\r
+UID:2D657A20-917F-49F2-8E6A-D49B9D5A65F1\r
+SEQUENCE:3\r
+DTSTAMP:20060130T163705Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060307T120000\r
+DTEND;TZID=US/Central:20060307T130000\r
+SUMMARY:Don Ganem\nRNAi\, MicroRNAs and Viral Infection\r
+UID:883949DC-C6FF-418A-BDEE-0CB6B6453C45\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164024Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060228T120000\r
+DTEND;TZID=US/Central:20060228T130000\r
+SUMMARY:Barak Cohen\nGenomic Analysis of Natural Variation in Saccharomy\r
+ ces\r
+UID:8A81A021-F2A4-426E-BA0C-13C5D12F2248\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164001Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060328T120000\r
+DTEND;TZID=US/Central:20060328T130000\r
+SUMMARY:Michael Ferguson\nThe Structure and Biosynthesis of Trypanosome \r
+ Surface Molecules:  Basic Science and Therapeutic Possiblities\r
+UID:0384243F-2858-4BC3-92EC-5940CF0B3C0E\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164200Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060425T120000\r
+DTEND;TZID=US/Central:20060425T130000\r
+SUMMARY:James M. Musser\nMolecular Pathogenomics of Group A Streptococcu\r
+ s\, the Flesh-Eater\r
+UID:4599802A-AFFE-45BC-B2DD-13BAB8E1BB6C\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164338Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060411T120000\r
+DTEND;TZID=US/Central:20060411T130000\r
+SUMMARY:Wayne Yokoyama\nInnate Responses to Viral Infections\r
+UID:11610367-EC3F-46CB-9F5F-7EEBAEED722E\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164246Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060314T120000\r
+DTEND;TZID=US/Central:20060314T130000\r
+SUMMARY:Herbert \"Skip\" Virgin\nHost-Herpesvirus Standoff:  Good News F\r
+ rom the Front in an Ancient Battle\n\r
+UID:FA8394ED-F737-4E4D-A171-A8A917AFB1CC\r
+SEQUENCE:3\r
+DTSTAMP:20060130T164108Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060102T110000\r
+SUMMARY:New Event\r
+UID:609176ED-56DF-43C2-8931-8EF20C6CFBC0\r
+SEQUENCE:1\r
+DTSTAMP:20060130T163545Z\r
+DURATION:PT1H\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060404T120000\r
+DTEND;TZID=US/Central:20060404T130000\r
+SUMMARY:Matthew Welch\nExploitation of the Host Actin Cytoskeleton by Ba\r
+ cterial and Viral Pathogens\r
+UID:F2B5E5E2-A204-4C27-B679-D0D3217D2F5B\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164223Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060502T120000\r
+DTEND;TZID=US/Central:20060502T130000\r
+SUMMARY:Theresa Koeher\nVirulence Gene Expression by Bacillus anthracis \r
+ and Implications for the Host\r
+UID:4AA1FDD2-F2A1-43B5-B8FF-60D1003E5A09\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164409Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060214T120000\r
+DTEND;TZID=US/Central:20060214T130000\r
+SUMMARY:Eduardo Groisman\nRegulatory Networks Controlling Bacterial Phys\r
+ iology and Virulence\r
+UID:1C1002C3-DEB1-4FA5-9090-C57EB42DE5C2\r
+SEQUENCE:2\r
+DTSTAMP:20060130T163907Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060418T120000\r
+DTEND;TZID=US/Central:20060418T130000\r
+SUMMARY:Brendan Cormack\nTranscriptional Silencing and Adherence in the \r
+ Yeast Pathogen Candida glabrata\r
+UID:FB61B2BE-6805-4A18-8FD7-02DF5B6DDAFB\r
+SEQUENCE:2\r
+DTSTAMP:20060130T164311Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=US/Central:20060131T120000\r
+DTEND;TZID=US/Central:20060131T130000\r
+SUMMARY:Andrew Pekosz\nIntracellular Transport of Viral Proteins and Par\r
+ ticles \r
+UID:80E1E336-E8BD-406C-B578-D8B08F0DCA4D\r
+SEQUENCE:2\r
+DTSTAMP:20060130T163806Z\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/Moon_Days.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/Moon_Days.ics
new file mode 100644 (file)
index 0000000..ccd6c71
--- /dev/null
@@ -0,0 +1,226 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:Moon_Days\r
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
+X-WR-RELCALID:925E2DFC-D4CC-46BC-AD37-F60F4B459D2D\r
+X-WR-TIMEZONE:America/New_York\r
+CALSCALE:GREGORIAN\r
+METHOD:PUBLISH\r
+X-WR-CALDESC:Full moons\, new moons\, + related dates that are astronomi\r
+ cally notable to one chai walla. \r
+BEGIN:VTIMEZONE\r
+TZID:America/New_York\r
+LAST-MODIFIED:20060818T012007Z\r
+BEGIN:DAYLIGHT\r
+DTSTART:20060402T070000\r
+TZOFFSETTO:-0400\r
+TZOFFSETFROM:+0000\r
+TZNAME:EDT\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20061029T020000\r
+TZOFFSETTO:-0500\r
+TZOFFSETFROM:-0400\r
+TZNAME:EST\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20070311T010000\r
+TZOFFSETTO:-0400\r
+TZOFFSETFROM:-0500\r
+TZNAME:EDT\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061029T020000\r
+DTEND;TZID=America/New_York:20061029T020000\r
+SUMMARY:Standard Time resumes\r
+UID:A9672871-FB93-4B76-A1B0-D567D58F32B4-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:7\r
+DTSTAMP:20060302T175347Z\r
+DESCRIPTION:Fall back! Americans must submit to the Lords of Time and ro\r
+ ll their clocks back 1 hour at 3am\, making it 2am. Or something like th\r
+ at. Basically\, we gain 1 hour.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060625T120500\r
+DTEND;TZID=America/New_York:20060625T120500\r
+SUMMARY:New Moon\r
+UID:D54D42CC-FA01-495A-97C3-316767E97302-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:7\r
+DTSTAMP:20060302T175700Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061006T231300\r
+DTEND;TZID=America/New_York:20061007T231300\r
+SUMMARY:Full Moon\r
+UID:9373EAFB-9F3D-40CB-B27D-98509D16B552-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173533Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061105T075800\r
+DTEND;TZID=America/New_York:20061105T075800\r
+SUMMARY:Full Moon\r
+UID:9B3DFD55-B850-46AA-BD2D-82C9EE4408B1-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T174931Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061204T192500\r
+DTEND;TZID=America/New_York:20061204T192500\r
+SUMMARY:Full Moon\r
+UID:605C9869-E068-4991-97BE-DC960E3BBF25-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:5\r
+DTSTAMP:20060302T173824Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060923T000300\r
+DTEND;TZID=America/New_York:20060923T000300\r
+SUMMARY:Autumnal Equinox\r
+UID:536184D2-EF08-45D6-BC00-E8386DEA7B00-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173447Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;VALUE=DATE:20060711\r
+DTEND;VALUE=DATE:20060712\r
+SUMMARY:Guru Purnima\r
+UID:7F7EA952-C7CB-4E26-ADE2-A30ED3863AE8-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:3\r
+DTSTAMP:20060626T191946Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061120T171800\r
+DTEND;TZID=America/New_York:20061120T171800\r
+SUMMARY:New Moon\r
+UID:B927FEBD-23BC-4763-824A-658F531AAD44-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:8\r
+DTSTAMP:20060302T180443Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060710T230200\r
+DTEND;TZID=America/New_York:20060711T110200\r
+SUMMARY:Full Moon\r
+UID:DB59CF53-79CE-4AD7-8617-B98D4B83DBE3-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T172952Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060922T074500\r
+DTEND;TZID=America/New_York:20060922T194500\r
+SUMMARY:New Moon\r
+UID:50F46337-1301-4A7B-95E2-C952B145E5AE-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173407Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060823T161000\r
+DTEND;TZID=America/New_York:20060823T161000\r
+SUMMARY:New Moon\r
+UID:2AC805A6-C9E1-45A6-88DE-DBF18E80D509-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T175546Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;VALUE=DATE:20060822\r
+LOCATION:AYNY\r
+DTEND;VALUE=DATE:20060828\r
+SUMMARY:Ganesha Chaturthi\r
+UID:AF2D2EE9-B7E6-4182-B6AD-661EA817E942-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:8\r
+DTSTAMP:20060804T162200Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060809T185400\r
+DTEND;TZID=America/New_York:20060809T185400\r
+SUMMARY:Full Moon\r
+UID:BABE196C-0782-488F-8020-5EE86F4466CB-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173138Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060907T144200\r
+DTEND;TZID=America/New_York:20060907T144200\r
+SUMMARY:Full Moon\r
+UID:25BF0B7D-1367-407B-A191-1A2B70183F3F-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173326Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061220T090100\r
+DTEND;TZID=America/New_York:20061220T090100\r
+SUMMARY:New Moon\r
+UID:3F36081E-BE60-4A3A-A912-C023BA5C1B17-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:9\r
+DTSTAMP:20060302T180144Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20070103T085700\r
+DTEND;TZID=America/New_York:20070103T205700\r
+SUMMARY:Full Moon\r
+UID:68396D70-C3A5-451F-8A6C-A6C14D048449-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T174342Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060621T082600\r
+DTEND;TZID=America/New_York:20060621T202600\r
+SUMMARY:Summer Solstice\r
+UID:032EA44A-72A3-4E5F-95B5-F6FD26432D37-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:5\r
+DTSTAMP:20060114T155356Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20070202T004500\r
+DTEND;TZID=America/New_York:20070202T004500\r
+SUMMARY:Full Moon\r
+UID:B0B386E9-48BB-4573-BD89-06D0E1578F03-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T174508Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20070118T230100\r
+DTEND;TZID=America/New_York:20070119T230100\r
+SUMMARY:New Moon\r
+UID:99A40CFA-8968-420E-8873-950340AB4920-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:7\r
+DTSTAMP:20060302T174405Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20060725T003100\r
+DTEND;TZID=America/New_York:20060725T003100\r
+SUMMARY:New Moon\r
+UID:FEF1C01E-3BDF-40CD-B569-A7507866A5A0-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:6\r
+DTSTAMP:20060302T173031Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=America/New_York:20061022T011400\r
+DTEND;TZID=America/New_York:20061022T011400\r
+SUMMARY:New Moon\r
+UID:E252DE90-9954-430C-9F69-AC6E3B5012CF-36E46F1A-4503-4154-A637-F2B87BC\r
+ 040D0\r
+SEQUENCE:9\r
+DTSTAMP:20060302T175134Z\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/ProjectCalendar.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/ProjectCalendar.ics
new file mode 100644 (file)
index 0000000..16fe534
--- /dev/null
@@ -0,0 +1,137 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r
+BEGIN:VEVENT\r
+CREATED:20060802T220609Z\r
+LAST-MODIFIED:20060817T200742Z\r
+DTSTAMP:20060817T200742Z\r
+UID:{c640032c-6828-404b-b547-69780fe8c1e3}\r
+SUMMARY:Code slush begins\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060825T220000\r
+DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060825T220500\r
+DESCRIPTION:No high risk patch will be accepted at this point.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060802T220716Z\r
+LAST-MODIFIED:20060817T200801Z\r
+DTSTAMP:20060817T200801Z\r
+UID:{035a81e6-5d4e-7642-97e4-e464bf7de96d}\r
+SUMMARY:String freeze\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060902T220000\r
+DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060902T220000\r
+DESCRIPTION:No strings may be changed or added after this point.  \r
+ Localization can begin.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060802T220800Z\r
+LAST-MODIFIED:20060816T191907Z\r
+DTSTAMP:20060816T191907Z\r
+UID:{bbf22425-1530-8040-ad11-aef02ba840d5}\r
+SUMMARY:Release Candidate 1\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060906\r
+DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060907\r
+DESCRIPTION:A proposed release candidate will be built for each target \r
+ platform.  Final QA tests begin.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060802T220844Z\r
+LAST-MODIFIED:20060816T191940Z\r
+DTSTAMP:20060816T191940Z\r
+UID:{9bd2970a-4dc9-b645-846c-9f68f6860985}\r
+SUMMARY:Sunbird/Lightning 0.3 release\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060909\r
+DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060910\r
+DESCRIPTION:Release of both Sunbird and Lightning 0.3 for en-US on all \r
+ platforms.  Any other locales which are ready will also be released.\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060816T192125Z\r
+LAST-MODIFIED:20060817T201332Z\r
+DTSTAMP:20060817T201332Z\r
+UID:{4637c9fa-b45b-4001-a124-aa638db20d20}\r
+SUMMARY:Calendar Test Day\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060822T070000\r
+DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060822T210000\r
+URL:http://wiki.mozilla.org/Calendar:QA_TestDays\r
+LOCATION:#calendar-qa\r
+DESCRIPTION:Join us for the Calendar Test Day!\nhttp:\r
+ //wiki.mozilla.org/Calendar:QA_TestDays\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060816T192330Z\r
+LAST-MODIFIED:20060816T192649Z\r
+DTSTAMP:20060816T192649Z\r
+UID:{81fd8527-d5fd-454a-86ea-050c42ca065b}\r
+SUMMARY:Calendar QA Chat\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TH\r
+DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060817T113000\r
+DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060817T123000\r
+DESCRIPTION:This meeting happens at 16:30 UTC every Thursday and lasts \r
+ one hour\r
+LOCATION:#calendar-qa\r
+URL:http://wiki.mozilla.org/Calendar:Current_QA_Chat\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060817T200857Z\r
+LAST-MODIFIED:20060817T201032Z\r
+DTSTAMP:20060817T201032Z\r
+UID:{4e13cc09-7f21-447b-8c76-00fe558fd46a}\r
+SUMMARY:Status Meeting\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\r
+DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060816T110000\r
+DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060816T120000\r
+LOCATION:http://wiki.mozilla.org/Calendar:Status\r
+DESCRIPTION:Weekly Calendar Status Meeting\n\nhttp:\r
+ //wiki.mozilla.org/Calendar:Status\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID:/mozilla.org/20050126_1/America/Chicago\r
+X-LIC-LOCATION:America/Chicago\r
+BEGIN:STANDARD\r
+TZOFFSETFROM:-0500\r
+TZOFFSETTO:-0600\r
+TZNAME:CST\r
+DTSTART:19701025T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+TZOFFSETFROM:-0600\r
+TZOFFSETTO:-0500\r
+TZNAME:CDT\r
+DTSTART:19700405T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID:/mozilla.org/20050126_1/America/Chicago\r
+X-LIC-LOCATION:America/Chicago\r
+BEGIN:DAYLIGHT\r
+TZOFFSETFROM:-0600\r
+TZOFFSETTO:-0500\r
+TZNAME:CDT\r
+DTSTART:19700405T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+TZOFFSETFROM:-0500\r
+TZOFFSETTO:-0600\r
+TZNAME:CST\r
+DTSTART:19701025T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
+END:STANDARD\r
+END:VTIMEZONE\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/SpanishHolidays.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/SpanishHolidays.ics
new file mode 100644 (file)
index 0000000..31dae01
--- /dev/null
@@ -0,0 +1,316 @@
+BEGIN:VCALENDAR
+METHOD
+ :PUBLISH
+VERSION
+ :2.0
+PRODID
+ :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :946822600
+SUMMARY
+ :Fiesta del Trabajo
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=5
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020501
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020502
+DTSTAMP
+ :20020924T114931Z
+LAST-MODIFIED
+ :20041116T225632Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :981227758
+SUMMARY
+ :Fiesta Nacional
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=10
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021012
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021013
+DTSTAMP
+ :20020924T115005Z
+LAST-MODIFIED
+ :20041116T225642Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :981227549
+SUMMARY
+ :Natividad del Señor
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=12
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021225
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021226
+DTSTAMP
+ :20020924T115110Z
+LAST-MODIFIED
+ :20041116T225700Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :947864734
+SUMMARY
+ :Todos los Santos
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021101
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021102
+DTSTAMP
+ :20020924T115030Z
+LAST-MODIFIED
+ :20041116T225722Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :913583658
+SUMMARY
+ :Viernes Santo
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=3
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020329
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020330
+DTSTAMP
+ :20020924T114908Z
+LAST-MODIFIED
+ :20041116T225737Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :959908481
+SUMMARY
+ :Asunción de la Virgen
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=8
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020815
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020816
+DTSTAMP
+ :20020924T114948Z
+LAST-MODIFIED
+ :20041116T225750Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :967837191
+SUMMARY
+ :Año Nuevo
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=1
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020101
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20020102
+DTSTAMP
+ :20020924T114801Z
+LAST-MODIFIED
+ :20041116T225801Z
+END:VEVENT
+BEGIN:VTIMEZONE
+TZID
+ :/Mozilla.org/BasicTimezones/GMT
+LOCATION
+ :GMT
+END:VTIMEZONE
+BEGIN:VEVENT
+UID
+ :911083728
+SUMMARY
+ :Constitución Española
+CATEGORIES
+ :Public Holiday
+STATUS
+ :TENTATIVE
+CLASS
+ :PRIVATE
+X-MOZILLA-RECUR-DEFAULT-UNITS
+ :years
+RRULE
+ :FREQ=YEARLY;INTERVAL=1;BYMONTH=12
+DTSTART
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021206
+DTEND
+ ;VALUE=DATE
+ ;TZID=/Mozilla.org/BasicTimezones/GMT
+ :20021207
+DTSTAMP
+ :20020924T115050Z
+LAST-MODIFIED
+ :20041116T225812Z
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/allcategories.vcs b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/allcategories.vcs
new file mode 100644 (file)
index 0000000..c66be74
--- /dev/null
@@ -0,0 +1,166 @@
+BEGIN:VCALENDAR
+BEGIN:VTIMEZONE
+TZID:US/Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-2a27
+SUMMARY:NSS ISDC 2006
+LOCATION:Los Angeles\, CA
+DTSTART;TZID=US/Eastern:20060504
+DTEND;TZID=US/Eastern:20060507
+DESCRIPTION:  Centennial Challenges participation at the NSS ISDC
+  2006\, including panel and mini-workshop.
+URL:http://isdc.nss.org/2006/
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges Appearances*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:df4bfc:109fa68b68b:-6bd6
+SUMMARY:VSE Trailer Ohio State Tour
+LOCATION:Ohio
+DTSTART;TZID=US/Eastern:20060508T080000
+DTEND;TZID=US/Eastern:20060604T170000
+DESCRIPTION:  In partnership with the Glenn Research Center the trailer
+  will visit Cleveland\, COlumbus\, Cincinnati\, and
+  Troy.
+ORGANIZER;CN="Derek Wang":MAILTO:derek.wang-1@nasa.gov
+CATEGORIES:Outreach*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-2833
+SUMMARY:AIAA International Energy Conversion Conference
+LOCATION:San Diego\, CA
+DTSTART;TZID=US/Eastern:20060626
+DTEND;TZID=US/Eastern:20060629
+DESCRIPTION:  Centennial Challenges participation at AIAA International
+  Energy Conversion Conference in San Diego\, CA\, including
+  paper session and mini-workshop.
+URL:www.aiaa.org/events/iecec/
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges Appearances*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-26be
+SUMMARY:42nd AIAA/ASME/SAE/ASEE Joint Propulsion Conference
+LOCATION:Sacramento\, CA
+DTSTART;TZID=US/Eastern:20060709
+DTEND;TZID=US/Eastern:20060712
+DESCRIPTION:  Centennial Challenges participation at 42nd AIAA/ASME/SAE/ASEE
+  Joint Propulsion Conference in Sacramento\, CA\, including
+  panel participation.
+URL:http://www.aiaa.org/content.cfm?pageid=230&lumeetingid=1178
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges Appearances*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-1e77
+SUMMARY:2006 Beam Power Challenge
+LOCATION:Mountain View\, CA
+DTSTART;TZID=US/Eastern:20060804
+DTEND;TZID=US/Eastern:20060806
+URL:http://www.elevator2010.org/site/competitionClimber2006.html
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-1dc5
+SUMMARY:2006 Tether Challenge
+LOCATION:Mountain View\, CA
+DTSTART;TZID=US/Eastern:20060804
+DTEND;TZID=US/Eastern:20060806
+URL:http://www.elevator2010.org/site/competitionTether2006.html
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-24c2
+SUMMARY:X PRIZE Cup Spaceflight Exposition
+LOCATION:Las Cruces\, NM
+DTSTART;TZID=US/Eastern:20061021
+DTEND;TZID=US/Eastern:20061022
+DESCRIPTION:  Centennial Challenges Exhibit at X PRIZE Cup Spaceflight
+  Exposition.
+URL:http://www.xpcup.com/
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges Appearances*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:14b2f1a:10aba5a6339:3fcd
+SUMMARY:2007 Astronaut Glove Challenge: APRIL DATE TBD
+LOCATION:To be determined (TBD)
+DTSTART;TZID=US/Eastern:20070401
+DTEND;TZID=US/Eastern:20070401
+URL:www.astronaut-glove.us
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:18ed77a:10a2cde985c:-1630
+SUMMARY:2007 Regolith Excavation Challenge
+LOCATION:Santa Maria Fair Park\, Santa Maria\, California
+DTSTART;TZID=US/Eastern:20070512
+DTEND;TZID=US/Eastern:20070512
+URL:http://www.californiaspaceauthority.org/regolith/
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:14b2f1a:10aba5a6339:437d
+SUMMARY:2007 Personal Air Vehicle (PAV) Challenge: DATE TBD
+LOCATION:Santa Rosa\, California
+DTSTART;TZID=US/Eastern:20070601
+DTEND;TZID=US/Eastern:20070601
+URL:www.cafefoundation.org/pav.htm
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+BEGIN:VEVENT
+UID:14b2f1a:10aba5a6339:4575
+SUMMARY:2008 MoonROx (Moon Regolith Oxygen) Challenge
+LOCATION:To be determined
+DTSTART;TZID=US/Eastern:20080601
+DTEND;TZID=US/Eastern:20080601
+URL:www.MoonROx.org
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+END:VCALENDAR
\ No newline at end of file
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/arsenal32FC.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/arsenal32FC.ics
new file mode 100644 (file)
index 0000000..e726a4e
--- /dev/null
@@ -0,0 +1,3594 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:Arsenal32FC\r
+PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
+X-WR-RELCALID:546BD00E-C1C1-4EFA-BF00-4CB891A57F6A\r
+X-WR-TIMEZONE:Europe/Oslo\r
+CALSCALE:GREGORIAN\r
+METHOD:PUBLISH\r
+X-WR-CALDESC:All the fixtures (PL\, CL\, FA-cup\, League-cup and friendl\r
+ ies) with results and goalscorers. All coming fixtures are updated with \r
+ the opposition and kick-off times as they are confirmed by Arsenal FC.\n\r
+ \nComments or errors can be reported to piri@start.no\r
+BEGIN:VTIMEZONE\r
+TZID:Europe/Oslo\r
+LAST-MODIFIED:20060901T112450Z\r
+BEGIN:DAYLIGHT\r
+DTSTART:20040328T010000\r
+TZOFFSETTO:+0200\r
+TZOFFSETFROM:+0000\r
+TZNAME:CEST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20041031T030000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0200\r
+TZNAME:CET\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20050327T030000\r
+TZOFFSETTO:+0200\r
+TZOFFSETFROM:+0100\r
+TZNAME:CEST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20051030T030000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0200\r
+TZNAME:CET\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20060326T030000\r
+TZOFFSETTO:+0200\r
+TZOFFSETFROM:+0100\r
+TZNAME:CEST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20061029T030000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0200\r
+TZNAME:CET\r
+END:STANDARD\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID:Europe/London\r
+LAST-MODIFIED:20060901T112450Z\r
+BEGIN:DAYLIGHT\r
+DTSTART:20010325T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20011028T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20020331T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20021027T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20030330T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20031026T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20040328T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20041031T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20050327T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20051030T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20060326T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20061029T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+DTSTART:20070325T010000\r
+TZOFFSETTO:+0100\r
+TZOFFSETFROM:+0000\r
+TZNAME:BST\r
+END:DAYLIGHT\r
+BEGIN:STANDARD\r
+DTSTART:20071028T020000\r
+TZOFFSETTO:+0000\r
+TZOFFSETFROM:+0100\r
+TZNAME:GMT\r
+END:STANDARD\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+LOCATION:Bramall Lane\nFA Cup 5th round replay\r
+DTSTAMP:20050521T181342Z\r
+UID:DD11D698-C0BB-4C5F-A5E1-258D877A84F3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=259072\r
+DTSTART;TZID=Europe/London:20050301T200500\r
+SUMMARY:Sheffield Utd (2)0-0(4) Arsenal\r
+DTEND;TZID=Europe/London:20050301T215000\r
+DESCRIPTION:SHEFFIELD UNITED 0\n\nARSENAL 0\n\nArsenal win 4-2 on penalt\r
+ ies\n\nFA Cup 5th round replay\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20040822T171229Z\r
+UID:BDEE4C5D-5EFF-4568-85EB-48B30B4587C1-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=220756\r
+DTSTART;TZID=Europe/London:20040822T160500\r
+SUMMARY:Arsenal 5-3 Middlesbrough\r
+DTEND;TZID=Europe/London:20040822T175000\r
+DESCRIPTION:ARSENAL 5\nHenry 25\, 90\nBergkamp 54\nPires 65\nReyes 65\n \r
+ \nMIDDLESBROUGH 3\nJob 43\nHasselbaink 50\nQueudrue 53\n\nFA Barclays Pr\r
+ emiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Upton Park\nBarclays Premiership\r
+DTSTAMP:20050924T161228Z\r
+UID:0BFCF965-270C-4432-87DC-49E762B7E541-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=309882\r
+DTSTART;TZID=Europe/London:20050924T150000\r
+SUMMARY:West Ham Utd 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20050924T164500\r
+DESCRIPTION:WEST HAM UNITED 0\n\nARSENAL 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T151953Z\r
+UID:3DC146C7-3CEB-43B5-ACCF-04C4A12718EC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235144\r
+DTSTART;TZID=Europe/London:20031108T150000\r
+SUMMARY:Arsenal 2-1 Tottenham\r
+DTEND;TZID=Europe/London:20031108T164500\r
+DESCRIPTION:ARSENAL 2\nRobert Pires 69\nFreddie Ljungberg 79\n\nTOTTENHA\r
+ M HOTSPUR 1\nDarren Anderton 5\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:St. Andrews\nFA Barclays Premiership\r
+DTSTAMP:20050522T190846Z\r
+UID:DEBB97E4-FD20-4B4D-A6B9-2AD8064FE5B0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=276363\r
+DTSTART;TZID=Europe/London:20050515T150000\r
+SUMMARY:Birmingham City 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20050515T164500\r
+DESCRIPTION:BIRMINGHAM CITY 2\nPandiani 80\nHeskey 90\n\nARSENAL 1\nBerg\r
+ kamp 88\n\nFA Barclays Premiership\n\nChelsea 38  29-8-1      72-15  95\\r
+ nARSENAL      38  25-8-5      87-36  83\nMan Utd      38  22-11-5    58-26  77\nEv\r
+ erton 38  18-7-13    45-46  61\nLiverpool     38  17-7-14    52-41  58\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Millennium Stadium\, Cardiff\r
+DTSTAMP:20060623T173011Z\r
+UID:993737EB-27E0-4587-AF8D-3C871E770AFF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070225T150000\r
+SUMMARY:Carling Cup Final\r
+DTEND;TZID=Europe/London:20070225T164500\r
+DESCRIPTION:Carling Cup Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Craven Cottage\nFA Barclays Premiership\r
+DTSTAMP:20040911T165738Z\r
+UID:C4D0B23D-9911-423F-971E-4B24B97F4C04-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=224868\r
+DTSTART;TZID=Europe/London:20040911T150000\r
+SUMMARY:Fulham 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20040911T164500\r
+DESCRIPTION:FULHAM 0\n\nARSENAL 3\nLjungberg 62\nKnight (og) 65\nReyes 7\r
+ 1\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup Third Round\nElland Road\r
+DTSTAMP:20040604T150758Z\r
+UID:E90EF253-43D6-4A8F-AD7F-6575B69D9C0A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=248109\r
+DTSTART;TZID=Europe/London:20040104T160500\r
+SUMMARY:Leeds United 1-4 Arsenal\r
+DTEND;TZID=Europe/London:20040104T175000\r
+DESCRIPTION:LEEDS UNITED 1\nViduka 8\n\nARSENAL 4\nHenry 26\nEdu 32\nPir\r
+ es 87\nToure 92\n\nFA Cup Third Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stade de France\, Paris\nUEFA Champions League\r
+DTSTAMP:20060809T113424Z\r
+UID:A0718603-83F8-4D8F-BE86-DD628C513434-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:19\r
+URL;VALUE=URI:http://www.uefa.com/Competitions/UCL/index.html\r
+DTSTART;TZID=Europe/London:20060517T194500\r
+SUMMARY:Barcelona 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20060517T213000\r
+DESCRIPTION:BARCELONA 2\nEto`o 77\nBelletti 81\n\nARSENAL 1\nCampbell 37\r
+ \n\nUEFA Champions League Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:City of Manchester Stadium\nBarclays Premiership\r
+DTSTAMP:20060809T121458Z\r
+UID:13FA08DC-5869-43FB-A4A3-8F7A8EA8B01B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20060504T194500\r
+SUMMARY:Manchester City 1-3 Arsenal\r
+DESCRIPTION:MANCHESTER CITY 1\nSommeil 39\n\nARSENAL 3\nLjungberg 30\nRe\r
+ yes 78\, 84\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060819T193244Z\r
+UID:0F8E5701-6ED3-4742-8FA0-8548906310BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20060819T150000\r
+SUMMARY:Arsenal 1-1 Aston Villa\r
+DTEND;TZID=Europe/London:20060819T164500\r
+DESCRIPTION:ARSENAL 1\nGilberto 83\n\nASTON VILLA 1\nMellberg 54\n\nBarc\r
+ lays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Amsterdam Tournament\nArenA Amsterdam\r
+DTSTAMP:20040801T202146Z\r
+UID:2F72FFCD-A2B5-447D-A25F-C40BD7CEC5EE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216698\r
+DTSTART;TZID=Europe/Oslo:20040730T190000\r
+SUMMARY:River Plate 0-0 Arsenal\r
+DTEND;TZID=Europe/Oslo:20040730T204500\r
+DESCRIPTION:RIVER PLATE 0\n\nARSENAL 0\n\nPre-season friendly\nAmsterdam\r
+  Tournament\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Weiz\nPre-Season Friendly\r
+DTSTAMP:20050720T191321Z\r
+UID:5CBA3725-55A6-4665-85AD-36FF841251F7-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:19\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=292922\r
+DTSTART;TZID=Europe/London:20050720T180000\r
+SUMMARY:Weiz 0-5 Arsenal\r
+DTEND;TZID=Europe/London:20050720T194500\r
+DESCRIPTION:WEIZ 0\n\nARSENAL 5\nFlamini 1\nHenry 4\, 37\nBentley 15\nBe\r
+ rgkamp 50\n\nAustrian Tour\nPre-Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Meadow Park\r
+DTSTAMP:20060809T113314Z\r
+UID:738BB2CB-4734-45E0-9BB5-FAB00032399F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:23\r
+DTSTART;TZID=Europe/London:20060804T193000\r
+SUMMARY:Boreham Wood 0-4 Arsenal XI\r
+DTEND;TZID=Europe/London:20060804T211500\r
+DESCRIPTION:BOREHAM WOOD 0\n\nARSENAL 4\nLupoli 31\, 90\nMerida Perez 49\r
+ \nBarazite 55\n\nFriendly match\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070124T200000\r
+SUMMARY:Carling Cup Semi-Final (2)\r
+UID:FF3C28A5-1B4B-49DB-8D61-F50C0029DD5A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T165935Z\r
+DESCRIPTION:Carling Cup Semi-final (2)\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060704T214320Z\r
+UID:A3605A71-6D29-496A-91F9-7569E0D8475D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20061112T160000\r
+SUMMARY:Arsenal - Liverpool\r
+DTEND;TZID=Europe/London:20061112T174500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060622T110924Z\r
+UID:43ED76B3-AFF9-46BE-8CB9-7E24081053ED-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061118T150000\r
+SUMMARY:Arsenal - Newcastle Utd\r
+DTEND;TZID=Europe/London:20061118T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150308Z\r
+UID:948C672E-DAAD-472A-AF6C-EE0852365A90-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235084\r
+DTSTART;TZID=Europe/London:20040320T150000\r
+SUMMARY:Arsenal 2-1 Bolton Wanderers\r
+DTEND;TZID=Europe/London:20040320T164500\r
+DESCRIPTION:ARSENAL 2\nPires 16\nBergkamp 24\n\nBOLTON WANDERERS 1\nCamp\r
+ o 41\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Valley\nFA Barclays Premiership\r
+DTSTAMP:20050101T171929Z\r
+UID:13935549-7B90-406B-9F7A-90819D3E2C3A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=246972\r
+DTSTART;TZID=Europe/London:20050101T150000\r
+SUMMARY:Charlton Athletic 1-3 Arsenal\r
+DTEND;TZID=Europe/London:20050101T164500\r
+DESCRIPTION:CHARLTON ATHLETIC 1\nEl Karkouri 45\n\nARSENAL 3\nLjungberg \r
+ 35\, 48\nVan Persie 71\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070127T150000\r
+SUMMARY:F.A. Cup 4rth round\r
+UID:5512BB18-D83F-4046-9F9D-C8CD5DFE787C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T172538Z\r
+DESCRIPTION:F.A. Cup 4rth round\r
+SEQUENCE:7\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:St. Mary's Stadium\nFA Barclays Premiership\r
+DTSTAMP:20050227T195350Z\r
+UID:C68FEB23-6B11-43D2-8636-AC63B9321FB6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=258285\r
+DTSTART;TZID=Europe/London:20050226T124500\r
+SUMMARY:Southampton 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20050226T143000\r
+DESCRIPTION:SOUTHAMPTON 1\nCrouch 67\n\nARSENAL 1\nLjungberg 45\n\nFA Ba\r
+ rclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Ritzing\nPre-Season Friendly\r
+DTSTAMP:20060809T122610Z\r
+UID:CF304487-DCC8-44F2-9A54-66F71AF6153F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=293432\r
+DTSTART;TZID=Europe/London:20050724T150000\r
+SUMMARY:Ritzing 2-5 Arsenal\r
+DTEND;TZID=Europe/London:20050724T164500\r
+DESCRIPTION:RITZING 2\nPajer 38\nSchiffer 75\n\nARSENAL 5\nBergkamp 10\n\r
+ Henry 17\nReyes (pen) 35\nHleb 79\nLarsson 90\n\nAustrian Tour\nPre-Seas\r
+ on Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050402T214701Z\r
+UID:D89D0B30-95D5-4541-8E2A-0E16B1ACD844-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=260128\r
+DTSTART;TZID=Europe/London:20050305T150000\r
+SUMMARY:Arsenal 3-0 Portsmouth\r
+DTEND;TZID=Europe/London:20050305T164500\r
+DESCRIPTION:ARSENAL 3\nHenry 39\, 53\, 85\n\nPORTSMOUTH 0\n\nFA Barclays\r
+  Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nKSK Beveren FC\r
+DTSTAMP:20040805T113442Z\r
+UID:3DE04A4B-9A50-41E7-BA56-7CF096E4B93F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:1\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=217614\r
+DTSTART;TZID=Europe/Oslo:20040804T193000\r
+SUMMARY:Beveren 0-0 Arsenal XI\r
+DTEND;TZID=Europe/Oslo:20040804T211500\r
+DESCRIPTION:KSK BEVEREN 0\n\nARSENAL XI 0\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nMolineux\r
+DTSTAMP:20040604T150601Z\r
+UID:FFCDBB9E-50AA-4477-85A3-76532EDFE9DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235003\r
+DTSTART;TZID=Europe/London:20040207T150000\r
+SUMMARY:Wolverhampton 1-3 Arsenal\r
+DTEND;TZID=Europe/London:20040207T164500\r
+DESCRIPTION:WOLVERHAMPTON 1\nIoan Ganea 26\n\nARSENAL 3\nBergkamp 9\nHen\r
+ ry 58\nToure 63\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Craven Cottage\r
+DTSTAMP:20060622T110755Z\r
+UID:6B4B93A2-4BA4-484F-AE7D-F53E851AA5AF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:51\r
+DTSTART;TZID=Europe/London:20061129T194500\r
+SUMMARY:Fulham - Arsenal\r
+DTEND;TZID=Europe/London:20061129T213000\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:AOL - Arena\r
+DTSTAMP:20060825T091034Z\r
+UID:15AE6DB9-9B00-4870-AAB9-7044922FAEA0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20060913T194500\r
+SUMMARY:Hamburg - Arsenal\r
+DESCRIPTION:UEFA Champions League matchday 1\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070306T194500\r
+SUMMARY:Champions League knockout round 2\r
+UID:89BB2B1A-C5E0-461E-BD2C-C452C910263C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T170807Z\r
+DESCRIPTION:Champions League knockout round 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T121950Z\r
+UID:808E335F-99F1-4BD9-8ACE-9DD8DB1D31A9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235226\r
+DTSTART;TZID=Europe/London:20030926T200000\r
+SUMMARY:Arsenal 3-2 Newcastle United\r
+DTEND;TZID=Europe/London:20030926T214500\r
+DESCRIPTION:ARSENAL 3\nHenry 18\, 79 (pen)\nGilberto 67\n\nNEWCASTLE UNI\r
+ TED 2\nRobert 26\nBernard 71\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150247Z\r
+UID:71A375EE-E5F8-4461-91FB-E3AB0513A9D6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235094\r
+DTSTART;TZID=Europe/London:20040328T160500\r
+SUMMARY:Arsenal 1-1 Manchester United\r
+DTEND;TZID=Europe/London:20040328T175000\r
+DESCRIPTION:ARSENAL 1\nHenry 50\n\nMANCHESTER UTD 1\nSaha 86\n\nFA Barcl\r
+ aycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T122807Z\r
+UID:406FCBBB-339B-459C-81C6-75E044F5E29A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235064\r
+DTSTART;TZID=Europe/London:20040201T160500\r
+SUMMARY:Arsenal 2-1 Manchester City\r
+DTEND;TZID=Europe/London:20040201T175000\r
+DESCRIPTION:ARSENAL 2\nTarnat (og) 37\nHenry 82\n\nMANCHESTER CITY 1\nAn\r
+ elka 88\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20051208T091322Z\r
+UID:E24F789D-7189-4F04-B83C-AE8C7F96BCDB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=332048\r
+DTSTART;TZID=Europe/London:20051207T194500\r
+SUMMARY:Arsenal 0-0 AFC Ajax\r
+DESCRIPTION:ARSENAL 0\n\nAJAX 0\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nHighbury\r
+DTSTAMP:20040604T152055Z\r
+UID:5FA11B6C-7436-4FB0-BF0F-AB721273C156-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243484\r
+DTSTART;TZID=Europe/London:20031210T194500\r
+SUMMARY:Arsenal 2-0 Lokomotiv Moscow\r
+DTEND;TZID=Europe/London:20031210T213000\r
+DESCRIPTION:ARSENAL 2\nPires 12\nLjungberg 67\n\nLOKOMOTIV MOSCOW 0\n\nU\r
+ EFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Millennium Stadium\, Cardiff\nFA Cup Final\r
+DTSTAMP:20050521T181209Z\r
+UID:B24D3055-80AC-4069-9D43-448432A86997-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=277548\r
+STATUS:CONFIRMED\r
+DTSTART;TZID=Europe/London:20050521T150000\r
+SUMMARY:Arsenal (5)0-0(4) Manchester Utd\r
+DTEND;TZID=Europe/London:20050521T164500\r
+DESCRIPTION:ARSENAL 0\n\nMANCHESTER UNITED 0\n\nArsenal win 5-4 on penal\r
+ ties.\n\nFA Cup Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nLokomotiv Stadium\r
+DTSTAMP:20040604T151803Z\r
+UID:1A5325F2-48CE-43BE-8A0B-31D12B9146D5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243418\r
+DTSTART;TZID=Europe/London:20030930T173000\r
+SUMMARY:Lokomotiv Moscow 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20030930T191500\r
+DESCRIPTION:LOKOMOTIV MOSCOW 0\n\nARSENAL 0\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T151836Z\r
+UID:0D2BD950-DA7B-4A87-9CF0-0DB3881463E8-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235184\r
+DTSTART;TZID=Europe/London:20031018T150000\r
+SUMMARY:Arsenal 2-1 Chelsea\r
+DTEND;TZID=Europe/London:20031018T164500\r
+DESCRIPTION:ARSENAL 2\nEdu 4\nHenry 75\n\nCHELSEA 1\nCrespo 8\n\nFA Barc\r
+ laycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nOld Trafford\r
+DTSTAMP:20040604T151742Z\r
+UID:83C8DCDD-14B5-43EF-8903-9D1ED17701C9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235220\r
+DTSTART;TZID=Europe/London:20030921T160500\r
+SUMMARY:Manchester Utd 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20030921T175000\r
+DESCRIPTION:MANCHESTER UNITED 0\nVan Nistelrooy missed pen 90\n\nARSENAL\r
+  0\nVieira sent off 79\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nClarence Park\, St Albans\r
+DTSTAMP:20040604T151527Z\r
+UID:09F56274-70F9-4938-9C54-345758F27CAD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241527\r
+DTSTART;TZID=Europe/London:20030731T193000\r
+SUMMARY:St Albans City 1-3 Arsenal XI\r
+DTEND;TZID=Europe/London:20030731T211500\r
+DESCRIPTION:ST ALBANS CITY 1\nMcDonnell 44\n\nARSENAL XI 3\nVolz 19\, 51\r
+ \nHalls 60\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stamford Bridge\nBarclays Premiership\r
+DTSTAMP:20050821T175116Z\r
+UID:D1C9C24D-54A8-4F0A-98DE-95664FAFED08-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:15\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=299569\r
+DTSTART;TZID=Europe/London:20050821T160000\r
+SUMMARY:Chelsea 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20050821T174500\r
+DESCRIPTION:CHELSEA 1\nDrogba 73\n\nARSENAL 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:City of Manchester Stadium\r
+DTSTAMP:20060826T181937Z\r
+UID:503BC001-B8C4-4AD9-89F0-C640100E1E74-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+DTSTART;TZID=Europe/London:20060826T171500\r
+SUMMARY:Manchester City 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060826T190000\r
+DESCRIPTION:MANCHESTER CITY 1\nBarton 41 (pen)\n\nARSENAL 0\n\nBarclays \r
+ Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060104T074101Z\r
+UID:B5669563-3A5E-44E8-BBD4-56468D1014BB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:29\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=349879\r
+DTSTART;TZID=Europe/London:20060103T200000\r
+SUMMARY:Arsenal 0-0 Manchester Utd\r
+DTEND;TZID=Europe/London:20060103T214500\r
+DESCRIPTION:ARSENAL 0\n\nMANCHESTER UNITED 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Ewood Park\nBarclays Premiership\r
+DTSTAMP:20060225T195303Z\r
+UID:7549B043-643B-4BC9-8E0D-D90646B36C76-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=366342\r
+DTSTART;TZID=Europe/London:20060225T150000\r
+SUMMARY:Blackburn Rovers 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060225T164500\r
+DESCRIPTION:BLACKBURN ROVERS 1\nPedersen 18\n\nARSENAL 0\n\nBarclays Pre\r
+ miership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Estadio do Dragao\r
+DTSTAMP:20060825T090935Z\r
+UID:7DEC6928-F5CD-45EB-BEE6-31F026F612F6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20061206T194500\r
+SUMMARY:FC Porto - Arsenal\r
+DESCRIPTION:UEFA Champions League matchday 6\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nReebok Stadium\r
+DTSTAMP:20040604T152138Z\r
+UID:4EE0796B-6C1A-4E9E-9683-9440F26018DF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234966\r
+DTSTART;TZID=Europe/London:20031220T150000\r
+SUMMARY:Bolton W 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20031220T164500\r
+DESCRIPTION:BOLTON WANDERERS 1\nPedersen 83\n\nARSENAL 1\nPires 57\n\nFA\r
+  Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Villa Park\r
+DTSTAMP:20060623T172316Z\r
+UID:1FD6BCDD-A429-4451-8ED3-4F3F3AEA7580-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070224T150000\r
+SUMMARY:Aston Villa - Arsenal\r
+DTEND;TZID=Europe/London:20070224T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Santiago Bernabéu\nUEFA Champions League\r
+DTSTAMP:20060221T231549Z\r
+UID:1658A9A7-CB4E-4592-8521-501A850778FA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=365276\r
+DTSTART;TZID=Europe/London:20060221T194500\r
+SUMMARY:Real Madrid 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20060221T213000\r
+DESCRIPTION:REAL MADRID 0\n\nARSENAL 1\nHenry 47\n\nUEFA Champions Leagu\r
+ e\nRound of 16 - First leg\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041120T233806Z\r
+UID:C6261B81-7716-45C5-840F-36304430CDA3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=238106\r
+DTSTART;TZID=Europe/London:20041120T150000\r
+SUMMARY:Arsenal 1-1 West Bromwich Albion\r
+DTEND;TZID=Europe/London:20041120T164500\r
+DESCRIPTION:ARSENAL 1\nPires 54\n\nWEST BROMWICH ALBION 1\nEarnshaw 79\n\r
+ \nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Reebok Stadium\nBarclays Premiership\r
+DTSTAMP:20051203T174744Z\r
+UID:FAB58070-B7CA-4898-B0B2-B738D4BC59BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=330807\r
+DTSTART;TZID=Europe/London:20051203T150000\r
+SUMMARY:Bolton Wanderers 2-0 Arsenal\r
+DTEND;TZID=Europe/London:20051203T164500\r
+DESCRIPTION:BOLTON WANDERERS 2\nFaye 20\nStelios 32\n\nARSENAL 0\n\nBarc\r
+ lays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Old Trafford\r
+DTSTAMP:20060711T140535Z\r
+UID:8293EFFE-4B34-4E8B-BE3F-6060CD336FF5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20060917T160000\r
+SUMMARY:Manchester Utd - Arsenal\r
+DTEND;TZID=Europe/London:20060917T174500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172437Z\r
+UID:071EA2F2-ACC6-4B00-915F-A645F5D45C07-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070303T150000\r
+SUMMARY:Arsenal - Reading\r
+DTEND;TZID=Europe/London:20070303T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20051023T100152Z\r
+UID:17669441-6749-4279-92E6-9C0778D0B794-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=318610\r
+DTSTART;TZID=Europe/London:20051022T150000\r
+SUMMARY:Arsenal 1-0 Manchester City\r
+DTEND;TZID=Europe/London:20051022T164500\r
+DESCRIPTION:ARSENAL 1\nPires 61 (pen)\n\nMANCHESTER CITY 0\n\nBarclays P\r
+ remiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172504Z\r
+UID:FADFCA7D-FF68-41D0-8101-DD0705FEED74-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070505T150000\r
+SUMMARY:Arsenal - Chelsea\r
+DTEND;TZID=Europe/London:20070505T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070307T194500\r
+SUMMARY:Champions League knockout round 2\r
+UID:726C05A2-1DCD-4A1B-8EEA-FC8F00D51943-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T170818Z\r
+DESCRIPTION:Champions League knockout round 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:DSB Stadium\, Netherlands\r
+DTSTAMP:20060809T113344Z\r
+UID:984B5155-B453-4C54-AB2E-AA1B28D6470F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:22\r
+DTSTART;TZID=Europe/Oslo:20060804T190000\r
+SUMMARY:AZ Alkmaar 0-3 Arsenal\r
+DTEND;TZID=Europe/Oslo:20060804T204500\r
+DESCRIPTION:AZ ALKMAAR 0\n\nARSENAL 3\nGilberto 36\nAdebayor 52\nVan Per\r
+ sie 74 (pen)\n\nPre-Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Goodison Park\nFA Barclays Premiership\r
+DTSTAMP:20040818T214802Z\r
+UID:CB68CA39-4400-4FA7-8BF0-BF7BF2B4136B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=219470\r
+DTSTART;TZID=Europe/London:20040815T140000\r
+SUMMARY:Everton 1-4 Arsenal\r
+DTEND;TZID=Europe/London:20040815T154500\r
+DESCRIPTION:EVERTON 1\nCarsley 64\n\nARSENAL 4\nBergkamp 23\nReyes 39\nL\r
+ jungberg 54\nPires 83\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Madejski Stadium\r
+DTSTAMP:20060704T214235Z\r
+UID:C18A4E98-B99C-4E49-AB4E-FEBE4911102C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20061022T160000\r
+SUMMARY:Readling - Arsenal\r
+DTEND;TZID=Europe/London:20061022T174500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Riverside Stadium\nBarclays Premiership\r
+DTSTAMP:20050911T092135Z\r
+UID:068F415C-7248-40AA-8568-ACEED555ED5D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:15\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=305615\r
+DTSTART;TZID=Europe/London:20050910T171500\r
+SUMMARY:Middlesbrough 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20050910T190000\r
+DESCRIPTION:MIDDLESBROUGH 2\nYakubu 40\nMaccarone 58\n\nARSENAL 1\nReyes\r
+  90\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Underhill Stadium\, Barnet FC\nPre-Season Friendly\r
+DTSTAMP:20060809T122551Z\r
+UID:C46CDC63-BCED-4DA4-B35D-FC4B4931528E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=290980\r
+DTSTART;TZID=Europe/London:20050716T150000\r
+SUMMARY:Barnet 1-4 Arsenal\r
+DTEND;TZID=Europe/London:20050716T164500\r
+DESCRIPTION:BARNET 1\nSinclair 74\n\nARSENAL 4\nHleb 2\nHenry 15 (pen)\n\r
+ Bergkamp 28\,\nHoyte 35\n\nPre-Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070425T194500\r
+SUMMARY:Champions League semi-final 1\r
+UID:295A452C-8547-41CF-89CF-2B37B466C42E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171714Z\r
+DESCRIPTION:Champions League semi-final 1\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Dynamo Stadium\r
+DTSTAMP:20060830T131541Z\r
+UID:D0C0E9ED-BAEA-4919-9E42-863C17BC147A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:22\r
+DTSTART;TZID=Europe/London:20061017T173000\r
+SUMMARY:CSKA Moscow - Arsenal\r
+DESCRIPTION:UEFA Champions League matchday 3\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060809T113404Z\r
+UID:42BC0BBA-940D-4170-89AA-52A38FB515EC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:30\r
+DTSTART;TZID=Europe/London:20060722T170000\r
+SUMMARY:Arsenal 2-1 Ajax\r
+DTEND;TZID=Europe/London:20060722T184500\r
+DESCRIPTION:ARSENAL 2\nHenry 55\nKanu 80\n\nAJAX 1\nHuntelaar 37\n\nDenn\r
+ is Bergkamp testimonial\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T114551Z\r
+UID:61DA3E4F-41A3-40BE-97F7-0DA5DDA65EDA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=311970\r
+DTSTART;TZID=Europe/London:20051002T133000\r
+SUMMARY:Arsenal 1-0 Birmingham City\r
+DTEND;TZID=Europe/London:20051002T151500\r
+DESCRIPTION:ARSENAL 1\nVan Persie 81\n\nBIRMINGHAM 0\n\nBarclays Premier\r
+ ship\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041030T183137Z\r
+UID:48DEEEF9-0226-4CD2-8B7C-0A14CEDC774C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=234427\r
+DTSTART;TZID=Europe/London:20041030T150000\r
+SUMMARY:Arsenal 2-2 Southampton\r
+DTEND;TZID=Europe/London:20041030T164500\r
+DESCRIPTION:ARSENAL 2\nHenry 67\nVan Persie 90\n\nSOUTHAMPTON 2\nDelap 8\r
+ 0\, 85\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Goodison Park\r
+DTSTAMP:20060623T172324Z\r
+UID:C62B71C3-B92D-45BA-B6CF-AD07227B6353-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070317T150000\r
+SUMMARY:Everton - Arsenal\r
+DTEND;TZID=Europe/London:20070317T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Schwadorf\, Austria\r
+DTSTAMP:20060809T113334Z\r
+UID:6F77FE30-994F-4E30-B718-ACAF214649C1-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/Oslo:20060731T170000\r
+SUMMARY:Schwadorf 1-8 Arsenal\r
+DTEND;TZID=Europe/Oslo:20060731T184500\r
+DESCRIPTION:SCHWADORF 1\nLabaska 86\n\nARSENAL 8\nVan Persie 6\, 47\nDjo\r
+ urou 15\nAdebayor 39\, 45\nToure 53\nBendtner 74\nHleb 84\n\nPre-Season \r
+ Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League (knock-out)\nEstadio de Balaidos\r
+DTSTAMP:20040604T150508Z\r
+UID:9FBE54FE-5DE4-4E46-8EC5-C7ED4F31B747-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249279\r
+DTSTART;TZID=Europe/London:20040224T194500\r
+SUMMARY:Celta de Vigo 2-3 Arsenal\r
+DTEND;TZID=Europe/London:20040224T213000\r
+DESCRIPTION:CELTA DE VIGO 2\nEdu 27\nIgnacio 64\n\nARSENAL 3\nEdu 16\, 5\r
+ 8\nPires 80\n\nUEFA Champions League (knock-out)\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Bramall Lane\r
+DTSTAMP:20060622T110435Z\r
+UID:264BCC4B-23C0-4E62-9DF0-28D65A1FADFA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061230T150000\r
+SUMMARY:Sheffield Utd - Arsenal\r
+DTEND;TZID=Europe/London:20061230T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nCarling Cup 4th round\r
+DTSTAMP:20041110T084850Z\r
+UID:B96B3EDA-E4F8-4D4E-A38D-E68A0FAC4DAC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20041109T194500\r
+SUMMARY:Arsenal 3-1 Everton\r
+DTEND;TZID=Europe/London:20041109T213000\r
+DESCRIPTION:ARSENAL 3\nOwusu-Abeyie 25\nLupoli 52\, 85\n\nEVERTON 1\nGra\r
+ vesen 8\n\nCarling Cup 4th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20050814T143934Z\r
+UID:419B8042-6F04-4BFF-BBFB-87ECD69BA6AC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:19\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=298360\r
+DTSTART;TZID=Europe/London:20050814T133000\r
+SUMMARY:Arsenal 2-0 Newcastle\r
+DTEND;TZID=Europe/London:20050814T151500\r
+DESCRIPTION:ARSENAL 2\nHenry 81 (pen)\nVan Persie 87\n\nNEWCASTLE UNITED\r
+  0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060318T171313Z\r
+UID:02D02AAB-CA95-4836-9BFC-7F6070769027-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTART;TZID=Europe/London:20060318T150000\r
+SUMMARY:Arsenal 3-0 Charlton Athletic\r
+DTEND;TZID=Europe/London:20060318T164500\r
+DESCRIPTION:Arsenal 3\nPires 13\, Adebayor 32\, Hleb 49\n\nCharlton Athl\r
+ etic 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T165213Z\r
+UID:A2331E3F-6636-4FCC-976C-A7BE0F267F94-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/London:20070101T150000\r
+SUMMARY:Arsenal - Charlton Athletic\r
+DTEND;TZID=Europe/London:20070101T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172444Z\r
+UID:AE4E258B-D379-497E-B9A1-7705198D684B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070407T150000\r
+SUMMARY:Arsenal - West Ham\r
+DTEND;TZID=Europe/London:20070407T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup 5th round\nHighbury\r
+DTSTAMP:20040604T150528Z\r
+UID:E3CD3E04-6B11-4C2E-9941-D3655DBA30AA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249914\r
+DTSTART;TZID=Europe/London:20040215T113000\r
+SUMMARY:Arsenal 2-1 Chelsea\r
+DTEND;TZID=Europe/London:20040215T131500\r
+DESCRIPTION:ARSENAL 2\nReyes 56\, 62\n\nCHELSEA 1\nMutu 40\n\nFA Cup 5th\r
+  round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Fratton Park\nFA Barclays Premiership\r
+DTSTAMP:20041219T184527Z\r
+UID:3B019F51-AD5D-4D1F-9A08-1B5CDF33D3A6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=244606\r
+DTSTART;TZID=Europe/London:20041219T160500\r
+SUMMARY:Portsmouth 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20041219T175000\r
+DESCRIPTION:PORTSMOUTH 0\n\nARSENAL 1\nCampbell 75\n\nFA Barclays Premie\r
+ rship\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20060809T114753Z\r
+UID:A903EEC3-8FDF-4C88-AD72-027667EDD57B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/matchreport.asp?thisNav=fixtures&fx\r
+ id=291995\r
+DTSTART;TZID=Europe/London:20060308T194500\r
+SUMMARY:Arsenal 0-0 Real Madrid\r
+DESCRIPTION:ARSENAL 0\n\nREAL MADRID 0\n\n(Arsenal win 1-0 on agg.)\n\nU\r
+ EFA Champions League\nRound of 16 - Second leg\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070414T150000\r
+DTEND;TZID=Europe/London:20070414T164500\r
+SUMMARY:F.A. Cup Semi-Final\r
+UID:536C873E-82D3-46AE-BF78-18BC335208E3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTAMP:20060623T172648Z\r
+DESCRIPTION:F.A. Cup Semi-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070424T194500\r
+DTEND;TZID=Europe/London:20070424T213000\r
+SUMMARY:Champions League semi-final 1\r
+UID:34E0D7F1-6ADA-42D4-83F8-8E7A9D6E199A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTAMP:20060623T171711Z\r
+DESCRIPTION:Champions League semi-final 1\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T152030Z\r
+UID:4E482D40-6A2D-47F1-827C-E43334F989E3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235164\r
+DTSTART;TZID=Europe/London:20031130T140000\r
+SUMMARY:Arsenal 0-0 Fulham\r
+DTEND;TZID=Europe/London:20031130T154500\r
+DESCRIPTION:ARSENAL 0\n\nFULHAM 0\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T122517Z\r
+UID:3E361BD1-C2F8-4CFA-A461-0190E7EDC18E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235124\r
+DTSTART;TZID=Europe/London:20040515T150000\r
+SUMMARY:Arsenal 2-1 Leicester City\r
+DTEND;TZID=Europe/London:20040515T164500\r
+DESCRIPTION:ARSENAL 2\nHenry 47 (pen)\nVieira 66\n\nLEICESTER CITY 1\nDi\r
+ ckov 26\n\nFA Barclaycard Premiership\n\nARSENAL 38 26 12 0 73-26 90\nCh\r
+ elsea   38 24  7 7  67-30 79\nManUtd   38 23  6 9  64-35 75\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20051106T093933Z\r
+UID:992DC227-70DD-4078-8EDD-E1ECE4B64329-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=322549\r
+DTSTART;TZID=Europe/London:20051105T150000\r
+SUMMARY:Arsenal 3-1 Sunderland\r
+DTEND;TZID=Europe/London:20051105T164500\r
+DESCRIPTION:ARSENAL 3\nVan Persie 12\nHenry 36\, 82\n\nSUNDERLAND 1\nStu\r
+ bbs 75\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nHighbury\r
+DTSTAMP:20040604T151942Z\r
+UID:2BA39EB6-8A68-4CBA-964C-ED241DE756AB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243454\r
+DTSTART;TZID=Europe/London:20031105T194500\r
+SUMMARY:Arsenal 1-0 Dynamo Kyiv\r
+DTEND;TZID=Europe/London:20031105T213000\r
+DESCRIPTION:ARSENAL 1\nCole 88\n\nDYNAMO KYIV 0\n\nUEFA Champions League\r
\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Bad Waltersdorf\nPre-Season Friendly\r
+DTSTAMP:20060809T122621Z\r
+UID:F6EC7FCD-BF15-4285-81FA-D7F9E12A33BC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=294355\r
+DTSTART;TZID=Europe/London:20050726T170000\r
+SUMMARY:FC Utrecht 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20050726T184500\r
+DESCRIPTION:FC UTRECHT 0\n\nARSENAL 3\nPires (pen) 13\nReyes 54\nHenry 7\r
+ 7\n\nAustrian Tour\nPre-Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League quarter-final 1st leg\nStamford Bridge\r
+DTSTAMP:20040604T150255Z\r
+UID:5BE9DF57-153E-4C6E-819D-D4A2A8F5F029-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251918\r
+DTSTART;TZID=Europe/London:20040324T194500\r
+SUMMARY:Chelsea 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20040324T213000\r
+DESCRIPTION:CHELSEA 1\nGudjohnsen 53\nDesailly sent off 83\n\nARSENAL 1\\r
+ nPires 59\n\nUEFA Champions League quarter-final 1st leg\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nCity of Manchester Stadium\r
+DTSTAMP:20040604T151701Z\r
+UID:75E6FF81-7E90-4687-ABDA-E4BE2A7B52B8-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234938\r
+DTSTART;TZID=Europe/London:20030831T160500\r
+SUMMARY:Manchester City 1-2 Arsenal\r
+DTEND;TZID=Europe/London:20030831T175000\r
+DESCRIPTION:MANCHESTER CITY 1\nLauren (og) 10\n\nARSENAL 2\nWiltord 47\n\r
+ Ljungberg 71\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Old Trafford\nCarling Cup 5th round\r
+DTSTAMP:20041201T220238Z\r
+UID:2F02A638-9F94-4E40-AC02-BB576C3A9A1E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=241175\r
+DTSTART;TZID=Europe/London:20041201T194500\r
+SUMMARY:Man Utd 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20041201T213000\r
+DESCRIPTION:MANCHESTER UNITED 1\nBellion 1\n\nARSENAL 0\n\nCarling Cup 5\r
+ th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T152105Z\r
+UID:9AAFC224-471D-4CC5-B774-312462078030-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234954\r
+DTSTART;TZID=Europe/London:20031214T140000\r
+SUMMARY:Arsenal 1-0 Blackburn Rovers\r
+DTEND;TZID=Europe/London:20031214T154500\r
+DESCRIPTION:ARSENAL 1\nBergkamp 11\n\nBLACKBURN ROVERS 0\n\nFA Barclayca\r
+ rd Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:JJB Stadium\r
+DTSTAMP:20060704T214914Z\r
+UID:E8745B4A-A27B-459F-8A0C-2A2DDDEFD10A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:29\r
+DTSTART;TZID=Europe/London:20061213T194500\r
+SUMMARY:Wigan Athletic - Arsenal\r
+DTEND;TZID=Europe/London:20061213T213000\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20051102T221749Z\r
+UID:B48AA317-3109-4FE6-8CCF-0DD909DB31AA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=321734\r
+DTSTART;TZID=Europe/London:20051102T194500\r
+SUMMARY:Arsenal 3-0 Sparta Prague\r
+DTEND;TZID=Europe/London:20051102T213000\r
+DESCRIPTION:ARSENAL 3\nHenry 23\nVan Persie 81\, 86\n\nSPARTA PRAGUE 0\n\r
+ \nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T121850Z\r
+UID:BC8BD6D1-A4AF-4DC3-9578-8830BF44CF8D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235206\r
+DTSTART;TZID=Europe/London:20030913T150000\r
+SUMMARY:Arsenal 1-1 Portsmouth\r
+DTEND;TZID=Europe/London:20030913T164500\r
+DESCRIPTION:ARSENAL 1\nHenry (pen) 40\n\nPORTSMOUTH 1\nSheringham 26\n\n\r
+ FA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060824T150059Z\r
+UID:DC03BAD0-598F-4EFA-9ED4-353BA396DFBB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+DTSTART;TZID=Europe/London:20060823T200500\r
+SUMMARY:Arsenal 2-1 Dinamo Zagreb\r
+DESCRIPTION:ARSENAL 2\nLjungberg 77\nFlamini 90\n\n\nDINAMO ZAGREB 1\nda\r
+  Silva 12\n\nUEFA Champions League 3rd Qualification round\, leg 2\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nSt. Andrews\r
+DTSTAMP:20040604T152004Z\r
+UID:FF5B1C2F-E920-4BA8-A94C-67DAA1B87D82-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235154\r
+DTSTART;TZID=Europe/London:20031122T150000\r
+SUMMARY:Birmingham City 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20031122T164500\r
+DESCRIPTION:BIRMINGHAM CITY 0\n\nARSENAL 3\nFreddie Ljungberg 4\nDennis \r
+ Bergkamp 80\nRobert Pires 88\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070404T194500\r
+SUMMARY:Champions League quarter-final 1\r
+UID:A40FE1FA-E3A6-48C1-85D7-7DDE8D162D38-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171102Z\r
+DESCRIPTION:Champions League quarter-final 1\r
+SEQUENCE:1\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Underhill\r
+DTSTAMP:20060715T170512Z\r
+UID:45C4A339-9185-4CD9-9090-3907A4D8D347-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20060715T150000\r
+SUMMARY:Barnet 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20060715T164500\r
+DESCRIPTION:BARNET 0\n\nARSENAL 0\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20040918T141854Z\r
+UID:703995B1-2360-4A6E-B147-F051B35E23D4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=226030\r
+DTSTART;TZID=Europe/London:20040918T124500\r
+SUMMARY:Arsenal 2-2 Bolton Wanderers\r
+DTEND;TZID=Europe/London:20040918T143000\r
+DESCRIPTION:ARSENAL 2\nHenry 31\nPires 66\n\nBOLTON WANDERERS 2\nJaidi 6\r
+ 3\nPederson 85\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060711T140526Z\r
+UID:1B4A04D1-4777-46BA-8412-2D703EF4E4C2-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20060909T150000\r
+SUMMARY:Arsenal - Middlesbrough\r
+DTEND;TZID=Europe/London:20060909T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nOlimpiyskiy Stadion\r
+DTSTAMP:20040604T151855Z\r
+UID:13D0B6CF-49EB-41AC-9E81-BB32B522F1A9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243432\r
+DTSTART;TZID=Europe/London:20031021T194500\r
+SUMMARY:Dynamo Kyiv 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20031021T213000\r
+DESCRIPTION:DYNAMO KYIV 2\nShatskikh 27\nBelkevich 64\n\nARSENAL 1\nHenr\r
+ y 80\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041016T161511Z\r
+UID:2417891F-6F94-4AD1-8EF5-FB0D01CD5CF5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=231260\r
+DTSTART;TZID=Europe/London:20041016T150000\r
+SUMMARY:Arsenal 3-1 Aston Villa\r
+DTEND;TZID=Europe/London:20041016T164500\r
+DESCRIPTION:ARSENAL 3\nPires 19\, 72\nHenry 45\n\nASTON VILLA 1\nHendrie\r
+  3\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060622T110841Z\r
+UID:4C08120D-A096-485F-B108-DF82A6A718DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20061014T150000\r
+SUMMARY:Arsenal - Watford\r
+DTEND;TZID=Europe/London:20061014T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nFratton Park\r
+DTSTAMP:20040604T145742Z\r
+UID:05A511E4-BE81-4EDA-8C53-491E883B8B48-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=253047\r
+DTSTART;TZID=Europe/London:20040504T200000\r
+SUMMARY:Portsmouth 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20040504T214500\r
+DESCRIPTION:PORTSMOUTH 1\nYakubu 30\n\nARSENAL 1\nReyes 49\n\nFA Barclay\r
+ card Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Letná (Toyota Arena)\nUEFA Champions League\r
+DTSTAMP:20051022T113140Z\r
+UID:C10386CB-577B-40FA-B264-BB452E8F3516-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=316290\r
+DTSTART;TZID=Europe/London:20051018T194500\r
+SUMMARY:Sparta Prague 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20051018T213000\r
+DESCRIPTION:SPARTA PRAGUE 0\n\nARSENAL 2\nHenry 21\, 74\n(Henry breaks t\r
+ he record as Arsenal's top scorer with his 185th and 186th goal for Arse\r
+ nal)\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Reebok Stadium\nFA Cup Quarter-Final\r
+DTSTAMP:20050623T152217Z\r
+UID:C84E4E80-C1A8-403B-A7A2-6E8FBFCA537B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=261752\r
+DTSTART;TZID=Europe/London:20050312T121500\r
+SUMMARY:Bolton 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20050312T140000\r
+DESCRIPTION:BOLTON WANDERERS 0\n\nARSENAL 1\nLjungberg 3\n\nFA Cup Quart\r
+ er-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060211T202910Z\r
+UID:D4F80617-14CD-44C4-A318-1A0C77958BC0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=362331\r
+DTSTART;TZID=Europe/London:20060211T150000\r
+SUMMARY:Arsenal 1-1 Bolton Wanderers\r
+DTEND;TZID=Europe/London:20060211T164500\r
+DESCRIPTION:ARSENAL 1\nGilberto 93\n\nBOLTON WANDERERS 1\nNolan 11\n\nBa\r
+ rclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20051127T063810Z\r
+UID:3E131558-78BD-4D53-B3C9-B6E1D8A026E7-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=328532\r
+DTSTART;TZID=Europe/London:20051126T150000\r
+SUMMARY:Arsenal 3-0 Blackburn Rovers\r
+DTEND;TZID=Europe/London:20051126T164500\r
+DESCRIPTION:ARSENAL 3\nFabregas 4\nHenry 45\nVan Persie 90\n\nBLACKBURN \r
+ ROVERS 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Community Shield\nMillennium Stadium\, Cardiff\r
+DTSTAMP:20040818T214707Z\r
+UID:3C060C0E-D004-4886-808F-A0253C4C8E7C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=218062\r
+DTSTART;TZID=Europe/London:20040808T150000\r
+SUMMARY:Arsenal 3-1 ManUtd\r
+DTEND;TZID=Europe/London:20040808T164500\r
+DESCRIPTION:ARSENAL 3\nGilberto 49\nReyes 59 \nSilvestre 79 (og)\n\nMANC\r
+ HESTER UNITED 1\nSmith 54\n\nFA Community Shield\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070502T194500\r
+SUMMARY:Champions League semi-final 2\r
+UID:52A2AAC0-899A-42C8-9C9C-D761094F8E15-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171734Z\r
+DESCRIPTION:Champions League semi-final 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060704T214926Z\r
+UID:7EF6FEA7-C59E-42E8-BD99-430CDB8A5A74-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTART;TZID=Europe/London:20070210T150000\r
+SUMMARY:Arsenal - Wigan Athletic\r
+DTEND;TZID=Europe/London:20070210T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Stadium of Light\nBarclays Premiership\r
+DTSTAMP:20060809T121441Z\r
+UID:2A8C05B3-7CCE-4591-8E50-95F0AF8CF449-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+DTSTART;TZID=Europe/London:20060501T171500\r
+SUMMARY:Sunderland 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20060501T190000\r
+DESCRIPTION:SUNDERLAND 0\n\nARSENAL 3\nCollins 28 (og)\nFabregas 40\nHen\r
+ ry 43\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060717T153613Z\r
+UID:19EBD194-F2D9-406D-B1EF-985E096EF6D9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+DTSTART;TZID=Europe/London:20061202T124500\r
+SUMMARY:Arsenal - Tottenham\r
+DTEND;TZID=Europe/London:20061202T143000\r
+DESCRIPTION:Live on Sky Sports PremPlus\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:El Madrigal\nUEFA Champions League Semi-Final 2nd Leg\r
+DTSTAMP:20060809T121430Z\r
+UID:CF307027-1716-4479-B75A-EE6467E30B28-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+DTSTART;TZID=Europe/London:20060425T194500\r
+SUMMARY:Villarreal CF 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20060425T213000\r
+DESCRIPTION:VILLAREAL 0\n\nARSENAL 0\n\nUEFA Champions League Semi-Final\r
\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172454Z\r
+UID:DFE534AD-2FC2-4AA7-8D7B-8DD017EC4612-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070428T150000\r
+SUMMARY:Arsenal - Fulham\r
+DTEND;TZID=Europe/London:20070428T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League Quarter-final 2nd leg\nHighbury\r
+DTSTAMP:20040604T150211Z\r
+UID:426D2286-0D1E-4CB5-9A79-826BE2B7F2FC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251919\r
+DTSTART;TZID=Europe/London:20040406T194500\r
+SUMMARY:Arsenal 1-2 Chelsea\r
+DTEND;TZID=Europe/London:20040406T213000\r
+DESCRIPTION:ARSENAL 1\nReyes 45\n\nCHELSEA 2\nLampard 51\nBridge 87\n\nU\r
+ EFA Champions League quarter-final 2nd leg\nChelsea win 3-2 on aggregate\r
\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070217T150000\r
+DTEND;TZID=Europe/London:20070217T164500\r
+SUMMARY:F.A. Cup 5th round\r
+UID:32F08781-3022-44AB-8D66-84E55B90B00C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTAMP:20060623T172558Z\r
+DESCRIPTION:F.A. Cup 5th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nCarling Cup 4th round\r
+DTSTAMP:20051130T071822Z\r
+UID:A4A1C7D0-7AC8-45A8-888F-B41E30301ED2-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=329487\r
+DTSTART;TZID=Europe/London:20051129T194500\r
+SUMMARY:Arsenal 3-0 Reading\r
+DTEND;TZID=Europe/London:20051129T213000\r
+DESCRIPTION:ARSENAL 3\nReyes 12\nVan Persie 42\nLupoli 65\n\nREADING 0\n\r
+ \nCarling Cup 4th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Millennium Stadium\, Cardiff\nFA Cup Semi-Final\r
+DTSTAMP:20050417T200307Z\r
+UID:70094E6E-6783-4B69-8E16-14FDDA94C047-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=269980\r
+DTSTART;TZID=Europe/London:20050416T121500\r
+SUMMARY:Arsenal 3-0 Blackburn Rovers\r
+DTEND;TZID=Europe/London:20050416T140000\r
+DESCRIPTION:ARSENAL 3\nPires 42\nVan Persie 86\, 90\n\nBLACKBURN ROVERS \r
+ 0\n\nFA Cup Semi-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Anfield\nBarclays Premiership\r
+DTSTAMP:20060215T060540Z\r
+UID:C5D76CAF-567F-44B3-BCCF-9DBA8BECEE67-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:49\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=363382\r
+DTSTART;TZID=Europe/London:20060214T200000\r
+SUMMARY:Liverpool 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060214T214500\r
+DESCRIPTION:LIVERPOOL 1\nGarcia 87\n\nARSENAL 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Amsterdam Tournament\nArenA Amsterdam\r
+DTSTAMP:20060414T115522Z\r
+UID:D0FD6050-D64C-436F-8558-735C4CF9BFFD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216699\r
+DTSTART;TZID=Europe/Oslo:20040801T204500\r
+SUMMARY:Ajax 0-0 Arsenal\r
+DTEND;TZID=Europe/Oslo:20040801T223000\r
+DESCRIPTION:AJAX 0\n\nARSENAL 0\n\nPre-season friendly\nAmsterdam Tourna\r
+ ment\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Reebok Stadium\nFA Barclays Premiership\r
+DTSTAMP:20050115T194414Z\r
+UID:897F94A8-1A95-4E30-970A-30807951D575-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=249732\r
+DTSTART;TZID=Europe/London:20050115T171500\r
+SUMMARY:Bolton Wanderers 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20050115T190000\r
+DESCRIPTION:BOLTON WANDERERS 1\nGiannakopoulos 41\n\nARSENAL 0\n\nFA Bar\r
+ clays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nCarling Cup Semi-Final 2nd Leg\r
+DTSTAMP:20060129T004945Z\r
+UID:22F348B2-0194-45AC-8247-39E621BCFEA7-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=356504\r
+DTSTART;TZID=Europe/London:20060124T194500\r
+SUMMARY:Arsenal 2-1 Wigan Athletic\r
+DTEND;TZID=Europe/London:20060124T213000\r
+DESCRIPTION:ARSENAL 2\nHenry 65\nVan Persie 108\n\nWIGAN ATHLETIC 1\nRob\r
+ erts 120\n\n(agg. 2-2 Wigan wins on away goals)\n\nCarling Cup Semi-Fina\r
+ l\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Villa Park\nBarclays Premiership\r
+DTSTAMP:20051231T150645Z\r
+UID:48442716-45AD-4A01-8C72-A0D4D85B2C38-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346483\r
+DTSTART;TZID=Europe/London:20051231T124500\r
+SUMMARY:Aston Villa 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20051231T143000\r
+DESCRIPTION:ASTON VILLA 0\n\nARSENAL 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Maksimir Stadium\, Croatia\r
+DTSTAMP:20060809T113209Z\r
+UID:E186DB7A-0894-448A-89BE-0B0BE1AB626E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:18\r
+DTSTART;TZID=Europe/London:20060808T200500\r
+SUMMARY:Dinamo Zagreb 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20060808T215000\r
+DESCRIPTION:DINAMO ZAGREB 0\n\nARSENAL 3\nFabregas 63\, 79\nVan Persie 6\r
+ 4\n\nUEFA Champions League 3rd Qualification round\, leg 1\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070409T150000\r
+LOCATION:St. James' Park\r
+DTEND;TZID=Europe/London:20070409T164500\r
+SUMMARY:Newcastle Utd - Arsenal\r
+UID:8EB7AC23-EA1E-4532-8918-EF495E82405F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTAMP:20060623T171234Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nJudenburg (Austria)\r
+DTSTAMP:20040726T195042Z\r
+UID:1F0EFAA8-F4BF-493E-8812-95A5F56BE2D8-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=208968\r
+DTSTART;TZID=Europe/Oslo:20040724T180000\r
+SUMMARY:Grazer AK 1-2 Arsenal\r
+DTEND;TZID=Europe/Oslo:20040724T194500\r
+DESCRIPTION:GRAZER AK 1\nSkoro 24\n\nARSENAL 2\nBergkamp 6\nVan Persie 5\r
+ 7\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070110T200000\r
+DTEND;TZID=Europe/London:20070110T214500\r
+SUMMARY:Carling Cup Semi-Final (1)\r
+UID:37140F55-2259-4268-A255-20837322733C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTAMP:20060623T165804Z\r
+DESCRIPTION:Carling Cup Semi-final (1)\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Goodison Park\nBarclays Premiership\r
+DTSTAMP:20060121T171925Z\r
+UID:17A2E135-14AC-4A63-B317-7F6DC3C7C374-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:15\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=355324\r
+DTSTART;TZID=Europe/London:20060121T124500\r
+SUMMARY:Everton 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060121T143000\r
+DESCRIPTION:EVERTON 1\nBeattie 13\n\nARSENAL 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Amsterdam Arena\nPre-Season Friendly\r
+DTSTAMP:20050731T191357Z\r
+UID:66FECE64-263F-4C68-B76A-D3D60AE02240-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:18\r
+DTSTART;TZID=Europe/London:20050731T173000\r
+SUMMARY:Porto 1-2 Arsenal\r
+DTEND;TZID=Europe/London:20050731T191500\r
+DESCRIPTION:PORTO 1\nLisandro 37\n\nARSENAL 2\nLjungberg 49\, 58\n\nAmst\r
+ erdam Tournament\nPre-Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Olympic Stadium\, Munich\nUEFA Champions League\r
+DTSTAMP:20050222T220730Z\r
+UID:8AD7015D-6C0C-4D33-BB7A-6EC49CD3C735-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=257563\r
+DTSTART;TZID=Europe/London:20050222T194500\r
+SUMMARY:Bayern München 3-1 Arsenal\r
+DTEND;TZID=Europe/London:20050222T213000\r
+DESCRIPTION:BAYERN MUNICH 3\nPizarro 4\, 58\nSalihamidzic 65\n\nARSENAL \r
+ 1\nToure 88\n\nUEFA Champions League\nKnockout\, 1st leg\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150155Z\r
+UID:D4802891-6EC9-4964-975C-1B977B7C4FF1-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234864\r
+DTSTART;TZID=Europe/London:20040409T123000\r
+SUMMARY:Arsenal 4-2 Liverpool\r
+DTEND;TZID=Europe/London:20040409T141500\r
+DESCRIPTION:ARSENAL 4\nHenry 31\, 50\, 78\nPires 49\n\nLIVERPOOL 2\nHyyp\r
+ ia 5\nOwen 42\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T114806Z\r
+UID:50E3810D-B9C2-4DB7-8FE1-B8CD479D4B79-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/matchreport.asp?thisNav=first%20tea\r
+ m&fxid=291996&cpid=703&clid=4421\r
+DTSTART;TZID=Europe/London:20060312T160000\r
+SUMMARY:Arsenal 2-1 Liverpool\r
+DTEND;TZID=Europe/London:20060312T174500\r
+DESCRIPTION:ARSENAL 2\nHenry 21\, 84\n\nLIVERPOOL 1\nLuis García 75\n\nB\r
+ arclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nUnderhill Stadium\, Barnet\r
+DTSTAMP:20040718T171057Z\r
+UID:5D8C9C3B-72DA-48C7-AAAE-62A382C1A9F9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=214145\r
+DTSTART;TZID=Europe/London:20040717T150000\r
+SUMMARY:Barnet 1-10 Arsenal\r
+DTEND;TZID=Europe/London:20040717T164500\r
+DESCRIPTION:BARNET 1\nGraham 12\n\nARSENAL 10\nReyes 19\, 21\, 42\nvan P\r
+ ersie 29\nBergkamp 44\, 67\nJeffers 53\, 55\, 64\nOwusu-Abeyie 70\n\nPre\r
+ -season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060622T110941Z\r
+UID:32AC335F-D09A-446B-A321-BC7A56173D5C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061216T150000\r
+SUMMARY:Arsenal - Portsmouth\r
+DTEND;TZID=Europe/London:20061216T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Vicarage Road\r
+DTSTAMP:20060704T214454Z\r
+UID:157D0C10-02AA-4459-A812-4ED052F13E0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/London:20061226T173000\r
+SUMMARY:Watford - Arsenal\r
+DTEND;TZID=Europe/London:20061226T191500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carling Cup 3rd Round\nHighbury\r
+DTSTAMP:20040604T151917Z\r
+UID:29050B7B-BC7C-4863-BE79-74E3BD5045CA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=246035\r
+DTSTART;TZID=Europe/London:20031028T194500\r
+SUMMARY:Arsenal 1(9)-1(8) Rotherham United\r
+DTEND;TZID=Europe/London:20031028T213000\r
+DESCRIPTION:ARSENAL 1(9)\nJeremie Aliadiere 11\n\nROTHERHAM UNITED 1(8)\\r
+ nDarren Byfield 90\nMike Pollitt s.o. 100\n\nCarling Cup 3rd Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Old Trafford\nFA Barclays Premiership\r
+DTSTAMP:20060809T113940Z\r
+UID:4BC6EFC3-2F24-4242-8C36-58DE1B6CCE2F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=232920\r
+DTSTART;TZID=Europe/London:20041024T160500\r
+SUMMARY:Manchester Utd 2-0 Arsenal\r
+DTEND;TZID=Europe/London:20041024T175000\r
+DESCRIPTION:MANCHESTER UNITED 2\nVan Nistelrooy 73 (pen)\nRooney 90\n\nA\r
+ RSENAL 0\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nVilla Park\r
+DTSTAMP:20060809T122040Z\r
+UID:370B96EE-D9DB-4D94-BDA6-F26AA60EEB7E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235054\r
+DTSTART;TZID=Europe/London:20040118T140000\r
+SUMMARY:Aston Villa 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20040118T154500\r
+DESCRIPTION:ASTON VILLA 0\n\nARSENAL 2\nHenry 28\, 52 (pen)\n\nFA Barcla\r
+ ycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Meadow Lodge\, Broughinge Road\nPre-Season Friendly\r
+DTSTAMP:20060809T122643Z\r
+UID:2A9156A9-4218-4037-9DCA-9FD4B1121101-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:25\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=297925\r
+DTSTART;TZID=Europe/London:20050810T193000\r
+SUMMARY:Boreham Wood 2-6 Arsenal XI\r
+DTEND;TZID=Europe/London:20050810T211500\r
+DESCRIPTION:BOREHAM WOOD 2\nArcher 55\nCooper 66 (pen)\n\nARSENAL XI 6\n\r
+ Van Persie 6\, 14\nReyes 33 (pen)\, 45\, 71 (pen)\nPires 39\n\nPre-Seaso\r
+ n Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070411T194500\r
+SUMMARY:Champions League quarter-final 2\r
+UID:1B5492F8-2E40-4667-9225-3432559E98BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171323Z\r
+DESCRIPTION:Champions League quarter-final 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Reebok Stadium\nFA Cup 4th Round\r
+DTSTAMP:20060129T005104Z\r
+UID:6EA00A92-F433-4EE9-AD9E-6EF8A52D4E00-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=357676\r
+DTSTART;TZID=Europe/London:20060128T174000\r
+SUMMARY:Bolton 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060128T192500\r
+DESCRIPTION:BOLTON WANDERERS 1\nStelios 84\n\nARSENAL 0\n\nFA Cup 4th Ro\r
+ und\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070501T194500\r
+SUMMARY:Champions League semi-final 2\r
+UID:A7A4F3CC-AAE6-4B05-BA75-EE65C74C0A05-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171740Z\r
+DESCRIPTION:Champions League semi-final 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Hawthorns\nFA Barclays Premiership\r
+DTSTAMP:20050503T142456Z\r
+UID:53BCBAC7-C3E0-4B79-997F-40B9580E3FCD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=273320\r
+DTSTART;TZID=Europe/London:20050502T200000\r
+SUMMARY:West Bromwich Albion 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20050502T214500\r
+DESCRIPTION:WEST BROMWICH ALBION 0\n\nARSENAL 2\nVan Persie 66\nEdu 90\n\r
+ \nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Rebook Stadium\r
+DTSTAMP:20060717T153551Z\r
+UID:205B447A-02C0-4546-B73A-D186D76E6D7B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/London:20061125T171500\r
+SUMMARY:Bolton Wanderers - Arsenal\r
+DTEND;TZID=Europe/London:20061125T190000\r
+DESCRIPTION:Live on Sky Sports PremPlus\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Cup 5th round\r
+DTSTAMP:20050220T070742Z\r
+UID:792614F3-3B1A-4D78-8001-FBFDFF33A8B5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=256784\r
+DTSTART;TZID=Europe/London:20050219T123000\r
+SUMMARY:Arsenal 1-1 Sheffield Utd\r
+DTEND;TZID=Europe/London:20050219T141500\r
+DESCRIPTION:ARSENAL 1\nPires 78\n\nSHEFFIELD UNITED 1\nGray 90 (pen)\n\n\r
+ FA Cup 5th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060622T110947Z\r
+UID:E674357E-C2E4-409E-93CE-1C18FFA677F3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061223T150000\r
+SUMMARY:Arsenal - Blackburn Rovers\r
+DTEND;TZID=Europe/London:20061223T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20061025T200000\r
+DTEND;TZID=Europe/London:20061025T214500\r
+SUMMARY:Carling Cup 3rd round\r
+UID:EA2700D9-0FD4-431C-8C5F-38E54619DECD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+DTSTAMP:20060622T104844Z\r
+DESCRIPTION:Carling Cup 3rd round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T121242Z\r
+UID:D4479C5C-AA03-4337-9B17-C456D99DCB62-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/London:20060401T150000\r
+SUMMARY:Arsenal 5-0 Aston Villa\r
+DTEND;TZID=Europe/London:20060401T164500\r
+DESCRIPTION:ARSENAL 5\nAdebayor 18\nHenry 25\, 46\nVan Persie 72\nDiaby \r
+ 81\n\nASTON VILLA 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stadium of Light\nCarling Cup 3rd round\r
+DTSTAMP:20051026T130414Z\r
+UID:45C56563-C9C8-43ED-B282-217844AF8744-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=319640\r
+DTSTART;TZID=Europe/London:20051025T194500\r
+SUMMARY:Sunderland 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20051025T213000\r
+DESCRIPTION:SUNDERLAND 0\n\nARSENAL 3\nEboue 61\nVan Persie 67 (pen)\, 8\r
+ 7\n\nCarling Cup 3rd round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150452Z\r
+UID:1F9E3A34-42A9-47C9-84C5-DCA4168BE002-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235024\r
+DTSTART;TZID=Europe/London:20040228T150000\r
+SUMMARY:Arsenal 2-1 Charlton Athletic\r
+DTEND;TZID=Europe/London:20040228T164500\r
+DESCRIPTION:ARSENAL 2\nPires 2\nHenry 4\n\nCHARLTON 1\nJensen 59\n\nFA B\r
+ arclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150741Z\r
+UID:1159A274-CE6A-476A-8E7C-1CFE18881F59-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235044\r
+DTSTART;TZID=Europe/London:20040110T150000\r
+SUMMARY:Arsenal 4-1 Middlesbrough\r
+DTEND;TZID=Europe/London:20040110T164500\r
+DESCRIPTION:ARSENAL 4\nHenry 38 (pen)\nQuedrue 45 (o.g.)\nPires 57\nLjun\r
+ gberg 68\n\nMIDDLESBROUGH 1\nMaccarone 86 (pen)\n\nFA Barclaycard Premie\r
+ rship\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050123T200851Z\r
+UID:4098B064-EE52-48BB-8CF2-111CB788DBD6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=250892\r
+DTSTART;TZID=Europe/London:20050123T160500\r
+SUMMARY:Arsenal 1-0 Newcastle\r
+DTEND;TZID=Europe/London:20050123T175000\r
+DESCRIPTION:ARSENAL 1\nBergkamp 19\n\nNEWCASTLE UNITED 0\n\nFA Barclays \r
+ Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041229T220436Z\r
+UID:573F2D10-2364-4D2E-9F87-E70556231A45-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=245320\r
+DTSTART;TZID=Europe/London:20041226T130000\r
+SUMMARY:Arsenal 2-0 Fulham\r
+DTEND;TZID=Europe/London:20041226T144500\r
+DESCRIPTION:ARSENAL 2\nHenry 12\nPires 71\n\nFULHAM 0\n\nFA Barclays Pre\r
+ miership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nFreethiel Stadium\, Beveren\, Belgium\r
+DTSTAMP:20040604T151539Z\r
+UID:A3BE1B50-F69A-4375-9EFC-300CCE7FE5B0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20030803T170000\r
+SUMMARY:KSK Beveren 2-2 Arsenal XI\r
+DTEND;TZID=Europe/London:20030803T184500\r
+DESCRIPTION:KSK BEVEREN 2\nConstant Kaïper 85\nGilles Yapi Yapo 88\n\nAR\r
+ SENAL XI 2\nNicky Nicolau 55\nQuincy Owusu Abeyie 76\n\nPre-season frien\r
+ dly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Stadio Delle Alpi\nUEFA Champions League Quarter-Final 2nd Leg\r
+DTSTAMP:20060809T121304Z\r
+UID:522D73F1-4887-4556-A62C-EBEF99F7E556-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+DTSTART;TZID=Europe/London:20060405T194500\r
+SUMMARY:Juventus 0-0 Arsenal\r
+DESCRIPTION:JUVENTUS 0\n\nARSENAL 0\n\n(Arsenal wins 2-0 on aggregate)\n\r
+ \nUEFA Champions League Quarter-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T121717Z\r
+UID:0AC7A6F9-CDD8-4635-B760-2914CB284B7F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:15\r
+DTSTART;TZID=Europe/London:20060507T150000\r
+SUMMARY:Arsenal 4-2 Wigan Athletic\r
+DTEND;TZID=Europe/London:20060507T164500\r
+DESCRIPTION:ARSENAL 4\nPires 8\nHenry 35\, 56\, 76 (pen)\n\nWIGAN ATHLET\r
+ IC 2\nScharner 10\nThompson 34\n\nBarclays Premiership\n\nThe final matc\r
+ h at Highbury!\n\nChelsea       38  29-4-5    72-22  91\nMan Utd         38  25-\r
+ 8-5   72-34  83\nLiverpool     38  25-7-6     57-25  82\nArsenal         38  20-7-1\r
+ 1     68-31  67\nTottenham  38  18-11-9       53-38  65\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:St James' Park\nFA Barclays Premiership\r
+DTSTAMP:20041229T220527Z\r
+UID:497FA544-3DFC-4EB7-BB1F-C540C8A4748B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20041229T200000\r
+SUMMARY:Newcastle Utd 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20041229T214500\r
+DESCRIPTION:NEWCASTLE UNITED 0\n\nARSENAL 1\nVieira 45\n\nFA Barclays Pr\r
+ emiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:City of Manchester Stadium\nFA Barclays Premiership\r
+DTSTAMP:20040925T181218Z\r
+UID:2B9C752E-C90B-47E6-B890-520A90AD2866-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=227192\r
+DTSTART;TZID=Europe/London:20040925T150000\r
+SUMMARY:Manchester City 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20040925T164500\r
+DESCRIPTION:MANCHESTER CITY 0\n\nARSENAL 1\nCole 14\n\nFA Barclays Premi\r
+ ership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Riverside\r
+DTSTAMP:20051213T180511Z\r
+UID:72978E0E-68EA-4CA6-B9F7-3E574DDCB450-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/sportsappcontroller.jsp?command=for\r
+ wardOnly&nextPage=/matchday/reports/200102/middlesbrough18082001.jsp\r
+STATUS:CONFIRMED\r
+DTSTART;TZID=Europe/London:20010818T150000\r
+SUMMARY:Middlesbrough 0-4 Arsenal\r
+DTEND;TZID=Europe/London:20010818T164500\r
+DESCRIPTION:MIDDLESBROUGH 0\n Ugo Ehiogu s.o. 85\n\n ARSENAL 4\n Thierry\r
+  Henry 43\n Ray Parlour s.o. 51\n Robert Pires 85 (pen)\n Dennis Bergkam\r
+ p 87\, 88\n\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070220T194500\r
+DTEND;TZID=Europe/London:20070220T213000\r
+SUMMARY:Champions League knockout round 1\r
+UID:52155DF8-6458-4074-B277-EFCD4B37AD44-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTAMP:20060623T170502Z\r
+DESCRIPTION:Champions League knockout round 1\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nRiverside Stadium\r
+DTSTAMP:20040604T151646Z\r
+UID:4B967B52-4C17-4C3E-A923-D587ED7596D1-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234919\r
+DTSTART;TZID=Europe/London:20030824T160500\r
+SUMMARY:Middlesbrough 0-4 Arsenal\r
+DTEND;TZID=Europe/London:20030824T175000\r
+DESCRIPTION:MIDDLESBROUGH 0\n\nARSENAL 4\nHenry 5\nGilberto 13\nWiltord \r
+ 22\, 60\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nGoodison Park\r
+DTSTAMP:20040604T150750Z\r
+UID:72C792B1-55E9-4A51-AD60-28E30464FA0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235037\r
+DTSTART;TZID=Europe/London:20040107T200000\r
+SUMMARY:Everton 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20040107T214500\r
+DESCRIPTION:EVERTON 1\nRadzinski 75\n\nARSENAL 1\nKanu 29\n\nFA Barclayc\r
+ ard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Fratton Park\r
+DTSTAMP:20060623T172355Z\r
+UID:894B1BF5-97DA-4B14-8B31-3ABC6D0EA6FD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070513T150000\r
+SUMMARY:Portsmouth - Arsenal\r
+DTEND;TZID=Europe/London:20070513T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:White Hart Lane\nBarclays Premiership\r
+DTSTAMP:20051029T181848Z\r
+UID:14E6270C-5BB7-4D60-9580-616D767992AD-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=320563\r
+DTSTART;TZID=Europe/London:20051029T130000\r
+SUMMARY:Tottenham Hotspur 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20051029T144500\r
+DESCRIPTION:TOTTENHAM HOTSPUR 1\nKing 17\n\nARSENAL 1\nPires 77\n\nBarcl\r
+ ays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070410T194500\r
+SUMMARY:Champions League quarter-final 2\r
+UID:D1F4686F-B73D-4E8C-AA3D-8F48900407DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T171314Z\r
+DESCRIPTION:Champions League quarter-final 2\r
+SEQUENCE:3\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041204T170053Z\r
+UID:FA62CA4A-3B2D-407A-AC23-D02F996019B4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=241472\r
+DTSTART;TZID=Europe/London:20041204T150000\r
+SUMMARY:Arsenal 3-0 Birmingham City\r
+DTEND;TZID=Europe/London:20041204T164500\r
+DESCRIPTION:ARSENAL 3\nPires 33\nHenry 79\nHenry 86\n\nBIRMINGHAM CITY 0\r
+ \n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T121347Z\r
+UID:689F407D-FF0B-4C03-808C-0B0DAA92F673-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20060415T150000\r
+SUMMARY:Arsenal 3-1 West Bromwich Albion\r
+DTEND;TZID=Europe/London:20060415T164500\r
+DESCRIPTION:ARSENAL 3\nHleb 44\nPires 76\nBergkamp 89\n\nWEST BROMWICH A\r
+ LBION 1\nQuashie 72\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nElland Road\r
+DTSTAMP:20040604T151928Z\r
+UID:7CEC9125-0F28-459A-94B2-719E36EFB503-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235137\r
+DTSTART;TZID=Europe/London:20031101T150000\r
+SUMMARY:Leeds United 1-4 Arsenal\r
+DTEND;TZID=Europe/London:20031101T164500\r
+DESCRIPTION:LEEDS UNITED 1\nAlan Smith 64\n\nARSENAL 4\nThierry Henry 8\\r
+ , 33\nRobert Pires 18\nGilberto 50\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041212T201820Z\r
+UID:7BD47DF1-3D25-405C-96E3-53143F3124C9-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=242880\r
+DTSTART;TZID=Europe/London:20041212T160500\r
+SUMMARY:Arsenal 2-2 Chelsea\r
+DTEND;TZID=Europe/London:20041212T175000\r
+DESCRIPTION:ARSENAL 2\nHenry 2\, 29\n\nCHELSEA 2\nTerry 17\nGudjohnsen 4\r
+ 6\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20061108T200000\r
+DTEND;TZID=Europe/London:20061108T214500\r
+SUMMARY:Carling Cup 4th round\r
+UID:D55DACF9-4E4A-4E06-8FA3-9BE0D543098F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+DTSTAMP:20060622T105044Z\r
+DESCRIPTION:Carling Cup 4th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nMaribor (Slovenia)\r
+DTSTAMP:20040726T195100Z\r
+UID:DD833159-DEDD-4E8D-A442-56BD95BB8B31-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=215261\r
+DTSTART;TZID=Europe/Oslo:20040722T193000\r
+SUMMARY:NK Maribor 2-3 Arsenal\r
+DTEND;TZID=Europe/Oslo:20040722T211500\r
+DESCRIPTION:NK MARIBOR 2\nRakic 62\, 86\n\nARSENAL 3\nBergkamp 4\nAliadi\r
+ ere 16\nvan Persie 84\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nUnderhill\, Barnet\r
+DTSTAMP:20040604T151411Z\r
+UID:ECE59CCB-BA5C-4F69-81DA-09CB5DBAE95B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241305\r
+DTSTART;TZID=Europe/London:20030719T150000\r
+SUMMARY:Barnet 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20030719T164500\r
+DESCRIPTION:BARNET 0\n\nARSENAL 0\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:JJB Stadium\nCarling Cup Semi-Final 1st Leg\r
+DTSTAMP:20060111T003811Z\r
+UID:B1F22B2D-EDA2-4F57-A861-317625F5E68C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=351860\r
+DTSTART;TZID=Europe/London:20060110T194500\r
+SUMMARY:Wigan Athletic 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20060110T213000\r
+DESCRIPTION:WIGAN ATHLETIC 1\nScharner 77\n\nARSENAL 0\n\nCarling Cup Se\r
+ mi-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carrow Road\nFA Barclays Premiership\r
+DTSTAMP:20040911T165657Z\r
+UID:FC8E3299-F87C-48F1-810D-3FD04D379FB0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=222332\r
+DTSTART;TZID=Europe/London:20040828T171500\r
+SUMMARY:Norwich City 1-4 Arsenal\r
+DTEND;TZID=Europe/London:20040828T190000\r
+DESCRIPTION:NORWICH CITY 1\nHuckerby 50 (pen)\n\nARSENAL 4\nReyes 22\nHe\r
+ nry 36\nPires 40\nBergkamp 90\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup 6th Round\nFratton Park\r
+DTSTAMP:20040604T150343Z\r
+UID:A3533E11-D054-4E19-B2CC-B7F0A4C4E9D3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=250685\r
+DTSTART;TZID=Europe/London:20040306T180000\r
+SUMMARY:Portsmouth 1-5 Arsenal\r
+DTEND;TZID=Europe/London:20040306T194500\r
+DESCRIPTION:PORTSMOUTH 1\nSheringham 90\n\nARSENAL 5\nHenry 25\, 50\nLju\r
+ ngberg 43\, 57\nToure 45\n\nFA Cup 6th Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nEwood Park\r
+DTSTAMP:20040604T150316Z\r
+UID:442C8C92-8482-466E-9993-8D4E326B2FA0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235075\r
+DTSTART;TZID=Europe/London:20040313T150000\r
+SUMMARY:Blackburn Rovers 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20040313T164500\r
+DESCRIPTION:BLACKBURN ROVERS 0\n       \nARSENAL 2\nHenry 56\nPires 87\n\nFA \r
+ Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:White Hart Lane\r
+DTSTAMP:20060623T172341Z\r
+UID:9713C2DE-37D8-451B-A358-BBC748AD850D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070421T150000\r
+SUMMARY:Tottenham - Arsenal\r
+DTEND;TZID=Europe/London:20070421T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Anfield\r
+DTSTAMP:20060623T172330Z\r
+UID:EC355FCA-B9D6-4269-8B24-86FB5B2107E0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070331T150000\r
+SUMMARY:Liverpool - Arsenal\r
+DTEND;TZID=Europe/London:20070331T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20050915T082543Z\r
+UID:9DF1956F-858F-4D58-BF87-A6FA9700BA52-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=307637\r
+DTSTART;TZID=Europe/London:20050914T194500\r
+SUMMARY:Arsenal 2-1 FC Thun\r
+DESCRIPTION:ARSENAL 2\nGilberto 51\nBergkamp 90\n\nFC THUN 1\nFerreira 5\r
+ 3 \n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Reebok Stadium\r
+DTSTAMP:20060623T165849Z\r
+UID:B5BD4095-3C40-45D9-B4DF-20BBCC2D3D9E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070113T150000\r
+SUMMARY:Blackburn Rovers - Arsenal\r
+DTEND;TZID=Europe/London:20070113T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20040826T080023Z\r
+UID:01E2121F-041C-4232-B922-9386227E81C4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=221872\r
+DTSTART;TZID=Europe/London:20040825T194500\r
+SUMMARY:Arsenal 3-0 Blackburn Rovers\r
+DTEND;TZID=Europe/London:20040825T213000\r
+DESCRIPTION:ARSENAL 3\nHenry 50\nFabregas 58\nReyes 79\n\nBLACKBURN ROVE\r
+ RS 0\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T151653Z\r
+UID:A1568B33-EE9F-4082-BEC7-6B72DAC08F0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234924\r
+DTSTART;TZID=Europe/London:20030827T194500\r
+SUMMARY:Arsenal 2-0 Aston Villa\r
+DTEND;TZID=Europe/London:20030827T213000\r
+DESCRIPTION:ARSENAL 2\nCampbell 57\nHenry 90\n\nASTON VILLA 0\n\nFA Barc\r
+ laycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Riverside Stadium\r
+DTSTAMP:20060623T172308Z\r
+UID:26BEA88C-A703-4B58-BC90-0CC7D1DD31DF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070203T150000\r
+SUMMARY:Middlesbrough - Arsenal\r
+DTEND;TZID=Europe/London:20070203T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Cup 3rd Round\r
+DTSTAMP:20060107T223140Z\r
+UID:97C0F4C8-8966-44BC-9632-92F172E00D4B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:16\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=350760\r
+DTSTART;TZID=Europe/London:20060107T130000\r
+SUMMARY:Arsenal 2-1 Cardiff City\r
+DTEND;TZID=Europe/London:20060107T144500\r
+DESCRIPTION:ARSENAL 2\nPires 6\, 18\n\nCARDIFF CITY 1\nJerome 86\n\nFA C\r
+ up 3rd Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050509T142242Z\r
+UID:9B91852C-9DCF-4206-9BCF-64DFCDE45E85-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=274644\r
+DTSTART;TZID=Europe/London:20050508T160500\r
+SUMMARY:Arsenal 3-1 Liverpool\r
+DTEND;TZID=Europe/London:20050508T175000\r
+DESCRIPTION:ARSENAL 3\nPires 25\nReyes 29\nFabregas 90\n\nLIVERPOOL 1\nG\r
+ errard 51\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070403T194500\r
+DTEND;TZID=Europe/London:20070403T213000\r
+SUMMARY:Champions League quarter-final 1\r
+UID:C54107A9-DA6B-42F6-AEB9-52E0897774A5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTAMP:20060623T171056Z\r
+DESCRIPTION:Champions League quarter-final 1\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup semi-final\nVilla Park\r
+DTSTAMP:20040604T150235Z\r
+UID:651D5D1B-199C-44B7-B8CA-4DB1E816D8CE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251863\r
+DTSTART;TZID=Europe/London:20040403T120000\r
+SUMMARY:Arsenal 0-1 Manchester Utd\r
+DTEND;TZID=Europe/London:20040403T134500\r
+DESCRIPTION:ARSENAL 0\n\nMANCHESTER UTD 1\nScholes 32\n\nFA Cup semi-fin\r
+ al\n\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Riverside Stadium\nFA Barclays Premiership\r
+DTSTAMP:20050410T073659Z\r
+UID:4CD548C4-C06E-4709-B0B5-47D309E77AFE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=268765\r
+DTSTART;TZID=Europe/London:20050409T150000\r
+SUMMARY:Middlesbrough 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20050409T164500\r
+DESCRIPTION:MIDDLESBROUGH 0\n\nARSENAL 1\nPires 73\n\nFA Barclays Premie\r
+ rship\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stade de Suisse\nUEFA Champions League\r
+DTSTAMP:20051122T224142Z\r
+UID:AE260A19-3BA3-46E0-B060-2AB0502FD2D0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=326177\r
+DTSTART;TZID=Europe/London:20051122T194500\r
+SUMMARY:FC Thun 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20051122T213000\r
+DESCRIPTION:FC THUN 0\n\nARSENAL 1\nPires 88 (pen)\n\nUEFA Champions Lea\r
+ gue\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Apostolos Nikolaidis Stadium\nUEFA Champions League\r
+DTSTAMP:20041020T210440Z\r
+UID:44B78CE2-0B08-47BD-8A44-7FC8512C7296-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=232660\r
+DTSTART;TZID=Europe/London:20041020T194500\r
+SUMMARY:Panathinaikos 2-2 Arsenal\r
+DTEND;TZID=Europe/London:20041020T213000\r
+DESCRIPTION:PANATHINAIKOS 2\nGonzalez 65\nOlisadebe 81\n\nARSENAL 2\nLju\r
+ ngberg 17\nHenry 74\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Upton Park\r
+DTSTAMP:20060704T214300Z\r
+UID:BBD1F297-E666-4847-8177-168652487E1E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+DTSTART;TZID=Europe/London:20061105T133000\r
+SUMMARY:West Ham Utd - Arsenal\r
+DTEND;TZID=Europe/London:20061105T151500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nThe Valley\r
+DTSTAMP:20040604T151907Z\r
+UID:A9E5A5D3-5BA6-4E23-B072-DB80657F5602-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235198\r
+DTSTART;TZID=Europe/London:20031026T140000\r
+SUMMARY:Charlton Athletic 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20031026T154500\r
+DESCRIPTION:CHARLTON ATHLETIC 1\nPaolo di Canio 27 (pen)\n\nARSENAL 1\nT\r
+ hierry Henry 39\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060622T110850Z\r
+UID:3DC9077C-ADE0-4AD4-8900-85E58FBB7513-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20061028T150000\r
+SUMMARY:Arsenal - Everton\r
+DTEND;TZID=Europe/London:20061028T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060117T200554Z\r
+UID:3F0EFA88-F26C-46DF-A5EA-35F1C0B97953-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=353089\r
+DTSTART;TZID=Europe/London:20060114T150000\r
+SUMMARY:Arsenal 7-0 Middlesbrough\r
+DTEND;TZID=Europe/London:20060114T164500\r
+DESCRIPTION:ARSENAL 7\nHenry 20\, 30\, 68\nSenderos 22\nPires 47\nGilber\r
+ to 59\nHleb 84\n\nMIDDLESBROUGH 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nSt. James' Park\r
+DTSTAMP:20040604T150145Z\r
+UID:382B585F-8359-4082-BDD5-11D1991347CF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234880\r
+DTSTART;TZID=Europe/London:20040411T160500\r
+SUMMARY:Newcastle Utd 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20040411T175000\r
+DESCRIPTION:NEWCASTLE 0\n\nARSENAL 0\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Philips Stadion\nUEFA Champions League\r
+DTSTAMP:20041124T214054Z\r
+UID:85BB0787-0CFA-4258-8465-3F41309293E6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+DTSTART;TZID=Europe/London:20041124T194500\r
+SUMMARY:PSV Eindhoven 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20041124T213000\r
+DESCRIPTION:PSV EINDHOVEN 1\nOoijer 8\n\nARSENAL 1\nHenry 31\n\nUEFA Cha\r
+ mpions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Valley\r
+DTSTAMP:20060622T110239Z\r
+UID:90619B46-7496-4450-B30C-49FABCB4A0FF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20060930T150000\r
+SUMMARY:Charlton Athletic - Arsenal\r
+DTEND;TZID=Europe/London:20060930T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League Quarter-Final 1st Leg\r
+DTSTAMP:20060809T121227Z\r
+UID:EE9D710E-2EE4-4106-9CA3-BBC363FEAB82-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:16\r
+DTSTART;TZID=Europe/London:20060328T194500\r
+SUMMARY:Arsenal 2-0 Juventus\r
+DTEND;TZID=Europe/London:20060328T213000\r
+DESCRIPTION:ARSENAL 2\nFabregas 40\nHenry 69\n\nJUVENTUS 0\n\nUEFA Champ\r
+ ions League Quarter-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070310T150000\r
+DTEND;TZID=Europe/London:20070310T164500\r
+SUMMARY:F.A. Cup 6th round\r
+UID:E6958D10-786F-479D-962E-AF00388FC773-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTAMP:20060623T172621Z\r
+DESCRIPTION:F.A. Cup 6th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060825T090844Z\r
+UID:EF8B2B6B-1A75-4DBB-9C93-D4DA34D639CE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061121T194500\r
+SUMMARY:Arsenal - Hamburg\r
+DESCRIPTION:UEFA Champions League matchday 5\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Fratton Park\nBarclays Premiership\r
+DTSTAMP:20060809T121330Z\r
+UID:1C81DAEE-369F-4597-9BEB-DC070157D3CC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:53\r
+DTSTART;TZID=Europe/London:20060412T200000\r
+SUMMARY:Portsmouth 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20060412T214500\r
+DESCRIPTION:PORTSMOUTH 1\nLua Lua 66\n\nARSENAL 1\nHenry 37\n\nBarclays \r
+ Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carling Cup quarter-final\nThe Hawthorns\r
+DTSTAMP:20040604T152130Z\r
+UID:E6E4CB6D-2997-42B5-BF61-EDF582A3DCB0-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=248104\r
+DTSTART;TZID=Europe/London:20031216T200000\r
+SUMMARY:West Bromwich Albion 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20031216T214500\r
+DESCRIPTION:W.B.A. 0\n\nARSENAL 2\nKanu 25\nAliadiere 57\n\nCarling Cup \r
+ quarter-final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070221T194500\r
+SUMMARY:Champions League knockout round 1\r
+UID:A15D1562-B880-4CD9-B718-8BE2B7877CCE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+DTSTAMP:20060623T170505Z\r
+DESCRIPTION:Champions League knockout round 1\r
+SEQUENCE:1\r
+DURATION:PT1H45M\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Higbury\nBarclays Premiership\r
+DTSTAMP:20060809T121417Z\r
+UID:A306990B-5831-4E5D-826F-BCDA1529ABDA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:18\r
+DTSTART;TZID=Europe/London:20060422T124500\r
+SUMMARY:Arsenal 1-1 Tottenham Hotspur\r
+DTEND;TZID=Europe/London:20060422T143000\r
+DESCRIPTION:ARSENAL 1\nHenry 84\n\nTOTTENHAM HOTSPUR 1\nKeane 66\n\nBarc\r
+ lays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup 3rd round\r
+DTSTAMP:20050109T161653Z\r
+UID:52CB1ED9-06C5-430C-BBDD-CDE163169675-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=248392\r
+DTSTART;TZID=Europe/London:20050109T140000\r
+SUMMARY:Arsenal 2-1 Stoke City\r
+DTEND;TZID=Europe/London:20050109T154500\r
+DESCRIPTION:ARSENAL 2\nReyes 50\nVan Persie 70\n\nSTOKE CITY 1\nThomas 4\r
+ 5\n\nFA Cup 3rd round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:St Andrews\nBarclays Premiership\r
+DTSTAMP:20060204T171455Z\r
+UID:C9101475-0446-4183-A7AC-9A97E9CB9F20-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=359958\r
+DTSTART;TZID=Europe/London:20060204T150000\r
+SUMMARY:Birmingham City 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20060204T164500\r
+DESCRIPTION:BIRMINGHAM CITY 0\n\nARSENAL 2\nAdebayor 21\nHenry 63\n\nBar\r
+ clays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T150540Z\r
+UID:6E247FD6-13A5-4E96-97ED-D0D0010C4003-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235004\r
+DTSTART;TZID=Europe/London:20040210T194500\r
+SUMMARY:Arsenal 2-0 Southampton\r
+DTEND;TZID=Europe/London:20040210T213000\r
+DESCRIPTION:ARSENAL 2\nHenry 31\, 90\n\nSOUTHAMPTON 0\n\nFA Barclaycard \r
+ Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060202T062136Z\r
+UID:6B926B4F-B15E-4894-A490-401931CFD770-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:30\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=359253\r
+DTSTART;TZID=Europe/London:20060201T200000\r
+SUMMARY:Arsenal 2-3 West Ham Utd\r
+DTEND;TZID=Europe/London:20060201T214500\r
+DESCRIPTION:ARSENAL 2\nHenry 45\nPires 89\n\nWEST HAM UNITED 3\nReo-Coke\r
+ r 25\nZamora 32\nEtherington 80\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20051218T203711Z\r
+UID:CC0A5B34-7ADA-45AF-B438-867EB05AF0FC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=345687\r
+DTSTART;TZID=Europe/London:20051218T160000\r
+SUMMARY:Arsenal 0-2 Chelsea\r
+DTEND;TZID=Europe/London:20051218T174500\r
+DESCRIPTION:ARSENAL 0\n\nCHELSEA 2\nRobben 39\nCole 73\n\nBarclays Premi\r
+ ership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nSt. Mary's Stadium\r
+DTSTAMP:20040604T152155Z\r
+UID:41C6700B-EC5F-4B1B-8CBC-B90FBF4447CB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234991\r
+DTSTART;TZID=Europe/London:20031229T200000\r
+SUMMARY:Southampton 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20031229T214500\r
+DESCRIPTION:SOUTHAMPTON 0\n\nARSENAL 1\nPires 35\n\nFA Barclaycard Premi\r
+ ership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050104T221511Z\r
+UID:B7BBA94C-C883-4857-8AD0-779E1F2F8EA4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=247736\r
+DTSTART;TZID=Europe/London:20050104T194500\r
+SUMMARY:Arsenal 1-1 Manchester City\r
+DTEND;TZID=Europe/London:20050104T213000\r
+DESCRIPTION:ARSENAL 1\nLjungberg 75\n\nMANCHESTER CITY 1\nS. Wright-Phil\r
+ lips 31\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nWhite Hart Lane\r
+DTSTAMP:20060809T122115Z\r
+UID:4E35FCFA-DD3D-4F6A-AE6C-42E31DC41874-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234903\r
+DTSTART;TZID=Europe/London:20040425T160500\r
+SUMMARY:Tottenham 2-2 Arsenal\r
+DTEND;TZID=Europe/London:20040425T175000\r
+DESCRIPTION:TOTTENHAM HOTSPUR 2\nRedknapp 62\nKeane 94 (pen)\n\nARSENAL \r
+ 2\nVieira 3\nPires 35\n\nCHAMPIONS!!!\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nWalkers Stadium\r
+DTSTAMP:20040604T152049Z\r
+UID:116B4332-9E81-4015-8EC2-50F8417CA5A3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234948\r
+DTSTART;TZID=Europe/London:20031206T150000\r
+SUMMARY:Leicester City 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20031206T164500\r
+DESCRIPTION:LEICESTER CITY 1\nHignett 90\n\nARSENAL 1\nGilberto 60\n\nFA\r
+  Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Cup 4th Round\nHighbury\r
+DTSTAMP:20040604T150640Z\r
+UID:EB03F776-88E2-4FDE-8947-3CCFDCA3D3FE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249304\r
+DTSTART;TZID=Europe/London:20040124T150000\r
+SUMMARY:Arsenal 4-1 Middlesbrough\r
+DTEND;TZID=Europe/London:20040124T164500\r
+DESCRIPTION:ARSENAL 4\nBergkamp 19\nLjungberg 28\, 68\nBentley 90\n\nMID\r
+ DLESBROUGH 1\nJob 23\ns.o. Boateng 86\n\nFA Cup 4th Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:White Hart Lane\nFA Barclays Premiership\r
+DTSTAMP:20041113T153253Z\r
+UID:EECD6309-4C3D-4633-94DD-772D77E9ED49-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=237415\r
+DTSTART;TZID=Europe/London:20041113T120000\r
+SUMMARY:Tottenham Hotspur 4-5 Arsenal\r
+DTEND;TZID=Europe/London:20041113T134500\r
+DESCRIPTION:TOTTENHAM HOTSPUR 4\nNaybet 37\nDefoe 61\nKing 74\nKanoute 8\r
+ 8\n\nARSENAL 5\nHenry 45\nLauren 55 (pen)\nVieira 60\nLjungberg 69\nPire\r
+ s 81\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050425T205834Z\r
+UID:3DD81530-4938-4AA7-AD7F-7D8B3B059CA7-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=272363\r
+DTSTART;TZID=Europe/London:20050425T200000\r
+SUMMARY:Arsenal 1-0 Tottenham Hotspur\r
+DTEND;TZID=Europe/London:20050425T214500\r
+DESCRIPTION:ARSENAL 1\nReyes 22\n\nTOTTENHAM HOTSPUR 0\n\nFA Barclays Pr\r
+ emiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:St James' Park\nBarclays Premiership\r
+DTSTAMP:20051211T092023Z\r
+UID:CE8D24D4-5A6C-4CB8-BF5B-E92C1C74EF26-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=332057\r
+DTSTART;TZID=Europe/London:20051210T171500\r
+SUMMARY:Newcastle Utd 1-0 Arsenal\r
+DTEND;TZID=Europe/London:20051210T190000\r
+DESCRIPTION:NEWCASTLE UNITED 1\nSolano 82\n\nARSENAL 0\n\nBarclays Premi\r
+ ership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Community Shield\nMillennium Stadium\, Cardiff\r
+DTSTAMP:20040604T151623Z\r
+UID:1998AD3F-D167-409C-BAF8-E69525D73E34-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241828\r
+DTSTART;TZID=Europe/London:20030810T140000\r
+SUMMARY:Arsenal 1(3)-1(4) ManUtd\r
+DTEND;TZID=Europe/London:20030810T154500\r
+DESCRIPTION:ARSENAL 1(3)\nThierry Henry 20\ns.o. Francis Jeffers 74\npen\r
+  Edu\npen Sylvain Wiltord\npen Lauren\n\nMANCHESTER UNITED 1(4)\nMikael \r
+ Silvestre 15\npen Paul Scholes\npen Rio Ferdinand\npen Ole Gunnar Solskj\r
+ aer\npen Diego Forlan\n\nFA Community Shield\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nGiuseppe Meazza Stadium (San Siro)\r
+DTSTAMP:20040604T152013Z\r
+UID:552F971A-B238-4DB0-8C7B-4E10E4419023-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243462\r
+DTSTART;TZID=Europe/London:20031125T194500\r
+SUMMARY:Inter Milan 1-5 Arsenal\r
+DTEND;TZID=Europe/London:20031125T213000\r
+DESCRIPTION:INTER MILAN 1\nVieri 32\n\nARSENAL 5\nHenry 25\, 85\nLjungbe\r
+ rg 49\nEdu 87\nPires 89\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Hawthorns\nBarclays Premiership\r
+DTSTAMP:20051016T101059Z\r
+UID:7E533838-66CD-47C3-B81A-D47A31433BE2-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=315472\r
+DTSTART;TZID=Europe/London:20051015T150000\r
+SUMMARY:West Bromwich Albion 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20051015T164500\r
+DESCRIPTION:WEST BROMWICH ALBION 2\nKanu 38\nCarter 77\n\nARSENAL 1\nSen\r
+ deros 18\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Ewood Park\nFA Barclays Premiership\r
+DTSTAMP:20050319T232331Z\r
+UID:31469719-54CB-431E-B11C-3058F5D618AC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=263607\r
+DTSTART;TZID=Europe/London:20050319T124500\r
+SUMMARY:Blackburn Rovers 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20050319T143000\r
+DESCRIPTION:BLACKBURN ROVERS 0\n\nARSENAL 1\nVan Persie 43\n\nFA Barclay\r
+ s Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Old Trafford\nBarclays Premiership\r
+DTSTAMP:20060809T121318Z\r
+UID:A9C34DC3-FD26-4B13-BEDB-7667F1380E00-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+DTSTART;TZID=Europe/London:20060409T160000\r
+SUMMARY:Manchester Utd 2-0 Arsenal\r
+DTEND;TZID=Europe/London:20060409T174500\r
+DESCRIPTION:MANCHESTER UTD 2\nRooney 54\nPark 78\n\nARSENAL 0\n\nBarclay\r
+ s Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nSchwechat Stadium\, Vienna\, Austria\r
+DTSTAMP:20040604T151430Z\r
+UID:69D37CCD-B789-4107-83EE-533A7BD8138D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241547\r
+DTSTART;TZID=Europe/London:20030725T190000\r
+SUMMARY:Austria Vienna 0-2 Arsenal\r
+DTEND;TZID=Europe/London:20030725T204500\r
+DESCRIPTION:AUSTRIA VIENNA 0\n\nARSENAL 2\nDennis Bergkamp 29\nFrancis J\r
+ effers 44\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T121844Z\r
+UID:EA6BDD8F-969D-4D20-B13A-9B40C2C487EF-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234904\r
+DTSTART;TZID=Europe/London:20030816T150000\r
+SUMMARY:Arsenal 2-1 Everton\r
+DTEND;TZID=Europe/London:20030816T164500\r
+DESCRIPTION:ARSENAL 2\nHenry 35 (pen)\nPires 58\nCampbell sent off 25\n\\r
+ nEVERTON 1\nRadzinski 84\nLi Tie sent off 87\n\nFA Barclaycard Premiersh\r
+ ip\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T152148Z\r
+UID:9738F998-0356-499D-B5F4-AAA7442EC126-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234974\r
+DTSTART;TZID=Europe/London:20031226T120000\r
+SUMMARY:Arsenal 3-0 Wolverhampton W\r
+DTEND;TZID=Europe/London:20031226T134500\r
+DESCRIPTION:ARSENAL 3\nCraddock og 13\nHenry 20\, 89\n\nWOLVES 0\n\nFA B\r
+ arclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Amsterdam ArenA\nUEFA Champions League\r
+DTSTAMP:20060809T122657Z\r
+UID:00FAFD97-7947-493F-8CE9-DAFB64BBEE0B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:17\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=311047\r
+DTSTART;TZID=Europe/London:20050927T194500\r
+SUMMARY:AFC Ajax 1-2  Arsenal\r
+DTEND;TZID=Europe/London:20050927T213000\r
+DESCRIPTION:AJAX 1\nRosenberg 70\n\nARSENAL 2\nLjungberg 2\nPires (pen) \r
+ 68 \n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060711T140543Z\r
+UID:1822C525-9209-430E-9B19-1D7D858C44FE-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20060923T150000\r
+SUMMARY:Arsenal - Sheffield Utd\r
+DTEND;TZID=Europe/London:20060923T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:City of Manchester Stadium\nCarling Cup 3rd round\r
+DTSTAMP:20041028T071910Z\r
+UID:07E51C76-F7DD-4259-A3C3-B17D4F53CC11-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=234108\r
+DTSTART;TZID=Europe/London:20041027T194500\r
+SUMMARY:Manchester City 1-2 Arsenal\r
+DTEND;TZID=Europe/London:20041027T213000\r
+DESCRIPTION:MANCHESTER CITY 1\nFowler 90\n\nARSENAL 2\nvan Persie 78 \nK\r
+ arbassyioon 90 \n\nCarling Cup 3rd round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050511T213934Z\r
+UID:06232CAD-0D08-4C7C-BBCC-5B979297B901-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=275961\r
+DTSTART;TZID=Europe/London:20050511T200000\r
+SUMMARY:Arsenal 7-0 Everton\r
+DTEND;TZID=Europe/London:20050511T214500\r
+DESCRIPTION:ARSENAL 7\nVan Persie 8\nPires 12\, 50\nVieira 37\nEdu 70 (p\r
+ en)\nBergkamp 77\nFlamini 85\n\nEVERTON 0\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Selhurst Park\nFA Barclays Premiership\r
+DTSTAMP:20041107T082059Z\r
+UID:1B876000-2824-415D-BE23-419DF4FA05FA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=236035\r
+DTSTART;TZID=Europe/London:20041106T171500\r
+SUMMARY:Crystal Palace 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20041106T190000\r
+DESCRIPTION:CRYSTAL PALACE 1\nRiihilahti 65\n\nARSENAL 1\nHenry 63\n\nFA\r
+  Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nBad Waltersdorf\, Austria\r
+DTSTAMP:20040604T151440Z\r
+UID:F689C6A4-861D-4FC5-BEFD-9239A88D003E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241627\r
+DTSTART;TZID=Europe/London:20030729T180000\r
+SUMMARY:Arsenal 1-0 Besiktas\r
+DTEND;TZID=Europe/London:20030729T194500\r
+DESCRIPTION:ARSENAL 1\nDennis Bergkamp 48\n\nBESIKTAS 0\n\nPre-season fr\r
+ iendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060825T091024Z\r
+UID:F11AC3FC-63DA-4BDF-971E-7A57DECB3C95-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20060926T194500\r
+SUMMARY:Arsenal - FC Porto\r
+DESCRIPTION:UEFA Champions League matchday 2\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nIbrox\, Glasgow\r
+DTSTAMP:20040604T151611Z\r
+UID:91E54F30-153B-48A6-A660-EB6C79B290F5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241307\r
+DTSTART;TZID=Europe/London:20030805T194500\r
+SUMMARY:Rangers 0-3 Arsenal\r
+DTEND;TZID=Europe/London:20030805T213000\r
+DESCRIPTION:RANGERS 0\n\nARSENAL 3\nEdu 31\nLauren 47 (pen)\nSol Campbel\r
+ l 58\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Anfield\nFA Barclays Premiership\r
+DTSTAMP:20041128T203220Z\r
+UID:868B9421-E562-4E63-8F19-487B5AB5BE08-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=238116\r
+DTSTART;TZID=Europe/London:20041128T160500\r
+SUMMARY:Liverpool 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20041128T175000\r
+DESCRIPTION:LIVERPOOL 2\nAlonso 41\nMellor 90\n\nARSENAL 1\nVieira 57\n\\r
+ nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20040914T221002Z\r
+UID:F5D8FCCA-0A22-4AF0-AB18-978502AA1022-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=225565\r
+DTSTART;TZID=Europe/London:20040914T194500\r
+SUMMARY:Arsenal 1-0 PSV Eindhoven\r
+DTEND;TZID=Europe/London:20040914T213000\r
+DESCRIPTION:ARSENAL 1\nAlex 42 (og)\n\nPSV EINDHOVEN 0\n\nUEFA Champions\r
+  League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nAnfield\r
+DTSTAMP:20040604T151813Z\r
+UID:CB6539B4-58D6-41D5-AF92-438402ECA1A4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235177\r
+DTSTART;TZID=Europe/London:20031004T123000\r
+SUMMARY:Liverpool 1-2 Arsenal\r
+DTEND;TZID=Europe/London:20031004T141500\r
+DESCRIPTION:LIVERPOOL 1\nKewell 14\n\nARSENAL 2\nHyypia (og) 31\nPires 6\r
+ 8\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172413Z\r
+UID:6A8F5322-40FE-453F-8533-1C6D25193C3D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070120T150000\r
+SUMMARY:Arsenal - Manchester Utd\r
+DTEND;TZID=Europe/London:20070120T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Valley\nBarclays Premiership\r
+DTSTAMP:20051226T150410Z\r
+UID:4B295DEE-5F97-4022-BE7A-9D1ED2EDB824-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:16\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346472\r
+DTSTART;TZID=Europe/London:20051226T124500\r
+SUMMARY:Charlton Athletic 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20051226T143000\r
+DESCRIPTION:CHARLTON ATHLETIC 0\n\nARSENAL 1\nReyes 58\n\nBarclays Premi\r
+ ership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20050310T183941Z\r
+UID:75B251E8-B36A-4ACD-AB66-0085283EE048-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=261721\r
+DTSTART;TZID=Europe/London:20050309T194500\r
+SUMMARY:Arsenal 1-0 Bayern München\r
+DTEND;TZID=Europe/London:20050309T213000\r
+DESCRIPTION:ARSENAL 1\nHenry 66\n\nBAYERN MUNICH 0\n\nUEFA Champions Lea\r
+ gue\nKnockout\, 2nd leg\n\nBayern München win 3-2 on aggregate\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20041208T010508Z\r
+UID:57BE5241-9FAD-4E87-BDF3-759FF103CB42-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=242378\r
+DTSTART;TZID=Europe/London:20041207T194500\r
+SUMMARY:Arsenal 5-1 Rosenborg\r
+DTEND;TZID=Europe/London:20041207T213000\r
+DESCRIPTION:ARSENAL 5\nReyes 3\nHenry 24\nFabregas 29\nPires 41 (pen)\nV\r
+ an Persie 84\n\nROSENBORG 1\nHoftun 38\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Millennium Stadium\, Cardiff\nFA Community Shield\r
+DTSTAMP:20050807T160523Z\r
+UID:25784440-F3EE-412D-9B90-740FD42D653D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:15\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=296981\r
+DTSTART;TZID=Europe/London:20050807T150000\r
+SUMMARY:Chelsea 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20050807T164500\r
+DESCRIPTION:ARSENAL 1\nFabregas 65\n\nCHELSEA 2\nDrogba 8\, 57\n\nFA Com\r
+ munity Shield\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The Olympic Stadium\, Athens \r
+DTSTAMP:20060623T172219Z\r
+UID:AF9F83A4-8D24-4964-9141-795073619BB3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20070523T194500\r
+SUMMARY:Champions League Final\r
+DTEND;TZID=Europe/London:20070523T213000\r
+DESCRIPTION:Champions League Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League\nHighbury\r
+DTSTAMP:20040604T151729Z\r
+UID:27230D3A-A02E-4DDF-AD56-0DD26514535C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243409\r
+DTSTART;TZID=Europe/London:20030917T194500\r
+SUMMARY:Arsenal 0-3 Inter Milan\r
+DTEND;TZID=Europe/London:20030917T213000\r
+DESCRIPTION:ARSENAL 0\nHenry missed pen 32\n\nINTER MILAN 3\nCruz 22\nVa\r
+ n der Meyde 24\nMartins 41\n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nLoftus Road\r
+DTSTAMP:20040604T145730Z\r
+UID:A5BBD55C-8552-4734-97AB-C33E59272032-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235116\r
+DTSTART;TZID=Europe/London:20040509T160500\r
+SUMMARY:Fulham 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20040509T175000\r
+DESCRIPTION:FULHAM 0\n\nARSENAL 1\nReyes 9\n\nFA Barclaycard Premiership\r
\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carling Cup semi-final 1st leg\nHighbury\r
+DTSTAMP:20040604T150700Z\r
+UID:502AD471-18AB-4157-9237-61E00A5EAA79-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249184\r
+DTSTART;TZID=Europe/London:20040120T194500\r
+SUMMARY:Arsenal 0-1 Middlesbrough\r
+DTEND;TZID=Europe/London:20040120T213000\r
+DESCRIPTION:ARSENAL 0\n\nMIDDLESBROUGH 1\nJuninho 53\n\nCarling Cup semi\r
+ -final 1st leg\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060825T090820Z\r
+UID:BBBE4A20-F903-42D0-BC4F-9EEA5962C740-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+DTSTART;TZID=Europe/London:20061101T194500\r
+SUMMARY:Arsenal - CSKA Moscow\r
+DESCRIPTION:UEFA Champions League matchday 4\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nUEFA Champions League\r
+DTSTAMP:20041102T223439Z\r
+UID:6FB64DB7-24F6-4980-843A-F6CE7FA476D6-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=235392\r
+DTSTART;TZID=Europe/London:20041102T194500\r
+SUMMARY:Arsenal 1-1 Panathinaikos\r
+DTEND;TZID=Europe/London:20041102T213000\r
+DESCRIPTION:ARSENAL 1\nHenry 16 (pen)\n\nPANATHINAIKOS 1\nCygan 74 (og)\\r
+ n\nUEFA Champions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stamford Bridge\r
+DTSTAMP:20060704T214429Z\r
+UID:6B16A0FE-9169-4399-A0E9-CC77BA3FE76B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+DTSTART;TZID=Europe/London:20061210T160000\r
+SUMMARY:Chelsea - Arsenal\r
+DTEND;TZID=Europe/London:20061210T174500\r
+DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Villa Park\nFA Barclays Premiership\r
+DTSTAMP:20050206T132557Z\r
+UID:9F97ADE0-9344-436C-9899-6E3BA6BF04A5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:21\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=254039\r
+DTSTART;TZID=Europe/London:20050205T171500\r
+SUMMARY:Aston Villa 1-3 Arsenal\r
+DTEND;TZID=Europe/London:20050205T190000\r
+DESCRIPTION:ASTON VILLA 1\nAngel 74\n\nARSENAL 3\nLjungberg 10\nHenry 14\r
+ \nCole 28\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:UEFA Champions League (knock-out)\nHighbury\r
+DTSTAMP:20040604T150431Z\r
+UID:3FA9A70F-B1CE-4F90-ACB0-E14F4CDE2B13-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249288\r
+DTSTART;TZID=Europe/London:20040310T194500\r
+SUMMARY:Arsenal 2-0 Celta de Vigo\r
+DTEND;TZID=Europe/London:20040310T213000\r
+DESCRIPTION:ARSENAL 2\nHenry 14\, 34\n\nCELTA DE VIGO 0\ns.o. Contreras \r
+ 74\n\nUEFA Champions League (knock-out)\nArsenal win 5-2 on aggregate\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20060809T122101Z\r
+UID:86FE8303-D009-4952-B90E-99A6C5275F26-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234884\r
+DTSTART;TZID=Europe/London:20040416T200000\r
+SUMMARY:Arsenal 5-0 Leeds\r
+DTEND;TZID=Europe/London:20040416T214500\r
+DESCRIPTION:ARSENAL 5\nPires 6\nHenry 27\, 33 (pen)\, 50\, 67\n\nLEEDS U\r
+ NITED 0\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050215T095354Z\r
+UID:82D06749-E8E4-4BF2-B2EE-7DAEB7AE7B1C-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20050214T200000\r
+SUMMARY:Arsenal 5-1 Crystal Palace\r
+DTEND;TZID=Europe/London:20050214T214500\r
+DESCRIPTION:ARSENAL 5\nBergkamp 32\nReyes 35\nHenry 39\, 37\nVieira 54\n\r
+ \nCRYSTAL PALACE 1\nJohnson 63 (pen)\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Craven Cottage\nBarclays Premiership\r
+DTSTAMP:20060304T171231Z\r
+UID:6DBA655D-5522-409A-9EE0-76388DF14F4F-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=368249\r
+DTSTART;TZID=Europe/London:20060304T150000\r
+SUMMARY:Fulham 0-4 Arsenal\r
+DTEND;TZID=Europe/London:20060304T164500\r
+DESCRIPTION:FULHAM 0\n\nARSENAL 4\nHenry 31\, 77\nAdebayor 35\nFabregas \r
+ 86\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20051228T230659Z\r
+UID:25470AFA-6111-42A0-964B-E2A3083CE53E-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346477\r
+DTSTART;TZID=Europe/London:20051228T194500\r
+SUMMARY:Arsenal 4-0 Portsmouth\r
+DTEND;TZID=Europe/London:20051228T213000\r
+DESCRIPTION:ARSENAL 4\nBergkamp 7\nReyes 13\nHenry 36\, 42 (pen)\n\nPORT\r
+ SMOUTH 0\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172419Z\r
+UID:AF026105-91E1-43D2-82AB-BB4EB3A0D6A3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:56\r
+DTSTART;TZID=Europe/London:20070130T194500\r
+SUMMARY:Arsenal - Manchester City\r
+DTEND;TZID=Europe/London:20070130T213000\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nRitzing Stadium\, Ritzing\, Austria\r
+DTSTAMP:20040604T151422Z\r
+UID:56BC0F1C-DCA5-44A0-9859-EDBE3B762A1A-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241454\r
+DTSTART;TZID=Europe/London:20030722T190000\r
+SUMMARY:Ritzing 2-2 Arsenal\r
+DTEND;TZID=Europe/London:20030722T204500\r
+DESCRIPTION:RITZING 2\nSebasta 20\nEl Senosy 25\n\nARSENAL 2\nCygan 60\n\r
+ Ljungberg (pen) 85\n\nPre-season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050201T222828Z\r
+UID:A572A1C4-DF43-4FFE-9E71-9168B2DC0234-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:8\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=253081\r
+DTSTART;TZID=Europe/London:20050201T200000\r
+SUMMARY:Arsenal 2-4 Manchester Utd\r
+DTEND;TZID=Europe/London:20050201T214500\r
+DESCRIPTION:ARSENAL 2\nVieira 8\nBergkamp 36\n\nMANCHESTER UNITED 4\nGig\r
+ gs 18\nRonaldo 54\, 58\nO'Shea 89\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Emirates Stadium\r
+DTSTAMP:20060623T172449Z\r
+UID:7477F2CC-005E-49AC-941E-86D7F7097136-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:7\r
+DTSTART;TZID=Europe/London:20070414T150000\r
+SUMMARY:Arsenal - Bolton Wanderers\r
+DTEND;TZID=Europe/London:20070414T164500\r
+DESCRIPTION:Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DURATION:PT1H45M\r
+LOCATION:Highbury\nUEFA Champions League Semi-Final 1st Leg\r
+DTSTAMP:20060809T121358Z\r
+UID:6348F912-F6D7-43BE-A143-35CB7BA20358-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+DTSTART;TZID=Europe/London:20060419T194500\r
+SUMMARY:Arsenal 1-0 Villarreal CF\r
+DESCRIPTION:ARSENAL 1\nToure 41\n\nVILLAREAL 0\n\nUEFA Champions League \r
+ Semi-Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carling Cup 4th Round\nHighbury\n\r
+DTSTAMP:20040604T152039Z\r
+UID:C1F69575-3690-42C5-A4A4-95042ADF4BE5-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=247503\r
+DTSTART;TZID=Europe/London:20031202T194500\r
+SUMMARY:Arsenal 5-1 Wolverhampton W.\r
+DTEND;TZID=Europe/London:20031202T213000\r
+DESCRIPTION:ARSENAL 5\nAliadiere 24\, 71\nKanu 67\nWiltord 79\nFabregas \r
+ 88\n\nWOLVERHAMPTON W. 1\nRae 81\n\nCarling Cup 4th Round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nCeltic Park\, Glasgow\r
+DTSTAMP:20040604T151534Z\r
+UID:01A4C130-ADAD-4A5E-BC8E-6BC4CF12C268-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241306\r
+DTSTART;TZID=Europe/London:20030802T150000\r
+SUMMARY:Celtic 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20030802T164500\r
+DESCRIPTION:CELTIC 1\nLiam Miller 57\n\nARSENAL 1\nKanu 70\n\nPre-season\r
+  friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Wembley\r
+DTSTAMP:20060623T172711Z\r
+UID:9F1E2513-7E31-435D-B3AB-6DAE679CE375-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+DTSTART;TZID=Europe/London:20070519T150000\r
+SUMMARY:F.A. Cup Final\r
+DTEND;TZID=Europe/London:20070519T164500\r
+DESCRIPTION:F.A. Cup Final\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Cup 4th round\r
+DTSTAMP:20050129T173246Z\r
+UID:C1EAB9E3-FA90-4E6F-8F0B-703586DDE8EB-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:5\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=252357\r
+DTSTART;TZID=Europe/London:20050129T150000\r
+SUMMARY:Arsenal 2-0 Wolverhampton Wanderers\r
+DTEND;TZID=Europe/London:20050129T164500\r
+DESCRIPTION:ARSENAL 2\nVieira 53\nLjungberg 82\n\nWOLVERHAMPTON W. 0\n\n\r
+ FA Cup 4th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nLondon Road\r
+DTSTAMP:20040604T151400Z\r
+UID:45E12578-92AD-456A-984B-3A6CD212F978-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:6\r
+DTSTART;TZID=Europe/London:20030711T193000\r
+SUMMARY:Peterborough 1-0 Arsenal XI\r
+DTEND;TZID=Europe/London:20030711T211500\r
+DESCRIPTION:PETERBOROUGH UNITED 1\nGreen 29\n\nARSENAL XI 0\n\nPre-seaso\r
+ n friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20050919T212818Z\r
+UID:A899DA80-AFD5-463E-9CCF-B1EA5AD27D7B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:18\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=305234\r
+DTSTART;TZID=Europe/London:20050919T200000\r
+SUMMARY:Arsenal 2-0 Everton\r
+DTEND;TZID=Europe/London:20050919T214500\r
+DESCRIPTION:ARSENAL 2\nCampbell 11\, 30\n \nEVERTON 0\n\nBarclays Premie\r
+ rship\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20041003T060617Z\r
+UID:7DEFC598-A3B1-4A80-8146-1403DB62A092-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=229026\r
+DTSTART;TZID=Europe/London:20041002T150000\r
+SUMMARY:Arsenal 4-0 Charlton Athletic\r
+DTEND;TZID=Europe/London:20041002T164500\r
+DESCRIPTION:ARSENAL 4\nLjungberg 33\nHenry 48\, 69\nReyes 70\n\nCHARLTON\r
+  ATHLETIC 0\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nBarclays Premiership\r
+DTSTAMP:20060809T114516Z\r
+UID:D1D0E52B-9A0E-41A0-96B5-274D27E2021B-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=301475\r
+DTSTART;TZID=Europe/London:20050824T194500\r
+SUMMARY:Arsenal 4-1 Fulham\r
+DTEND;TZID=Europe/London:20050824T213000\r
+DESCRIPTION:ARSENAL 4\nCygan 32\, 90\nHenry 53\, 83\n\nFULHAM 1\nJensen \r
+ 22\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Stamford Bridge\nFA Barclays Premiership\r
+DTSTAMP:20050421T081926Z\r
+UID:8543F179-5E2C-46B0-A76E-74D2D1DE5934-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:10\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=270910\r
+DTSTART;TZID=Europe/London:20050420T200000\r
+SUMMARY:Chelsea 0-0 Arsenal\r
+DTEND;TZID=Europe/London:20050420T214500\r
+DESCRIPTION:CHELSEA 0\n\nARSENAL 0\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Belle Vue Stadium\nCarling Cup 5th Round\r
+DTSTAMP:20051222T114529Z\r
+UID:2924AA1A-8E7B-4F3F-81C1-81898501A027-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:18\r
+DTSTART;TZID=Europe/London:20051221T194500\r
+SUMMARY:Doncaster Rovers 2-2P Arsenal\r
+DTEND;TZID=Europe/London:20051221T213000\r
+DESCRIPTION:DONCASTER ROVERS 2\nMcIndoe 4\nGreen 104\n\nARSENAL 2\nQuinc\r
+ y 63\nGilberto 120\n\nArsenal win 3-1 on penalties\n\nCarling Cup 5th Ro\r
+ und\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nBad Waltersdorf (Austria)\r
+DTSTAMP:20040728T184023Z\r
+UID:62A1186B-DE78-4F2A-B7B2-E1D55CE4B8C3-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216410\r
+DTSTART;TZID=Europe/Oslo:20040728T183000\r
+SUMMARY:Sturm Graz 0-2 Arsenal\r
+DTEND;TZID=Europe/Oslo:20040728T201500\r
+DESCRIPTION:STURM GRAZ 0\n\nARSENAL 2\nReyes 30 (pen)\nJeffers 74\n\nPre\r
+ -season friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Lerkendal stadium\nUEFA Champions League\r
+DTSTAMP:20040930T163019Z\r
+UID:EA88DB10-80AC-4301-A62D-428B6596B8BC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=228351\r
+DTSTART;TZID=Europe/London:20040929T194500\r
+SUMMARY:Rosenborg 1-1 Arsenal\r
+DTEND;TZID=Europe/London:20040929T213000\r
+DESCRIPTION:ROSENBORG 1\nStrand 52\n\nARSENAL 1\nLjungberg 6\n\nUEFA Cha\r
+ mpions League\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Keown Testimonial\nHighbury\r
+DTSTAMP:20040604T145655Z\r
+UID:3A11674E-A10F-41FD-8951-53C9471A51DA-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTART;TZID=Europe/London:20040517T194500\r
+SUMMARY:Arsenal 6-0 England XI\r
+DTEND;TZID=Europe/London:20040517T213000\r
+DESCRIPTION:ARSENAL 6\nCole 17\nAliadiere 23\, 77\nReyes 53\, 58\, 66\n\\r
+ nENGLAND XI 0\n\nKeown Testimonial\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Highbury\nFA Barclays Premiership\r
+DTSTAMP:20050402T214531Z\r
+UID:147595AD-C34A-4AC1-A840-5C5F25347280-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=26500\r
+DTSTART;TZID=Europe/London:20050402T150000\r
+SUMMARY:Arsenal 4-1 Norwich City\r
+DTEND;TZID=Europe/London:20050402T164500\r
+DESCRIPTION:ARSENAL 4\nHenry 19\, 22\, 66\nLjungberg 50\n\nNORWICH CITY \r
+ 1\nHuckerby 30\n\nFA Barclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nHighbury\r
+DTSTAMP:20040604T145755Z\r
+UID:F4E8FD39-31B9-49C3-8E33-CA2E70BC9699-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:11\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235104\r
+DTSTART;TZID=Europe/London:20040501T123000\r
+SUMMARY:Arsenal 0-0 Birmingham City\r
+DTEND;TZID=Europe/London:20040501T141500\r
+DESCRIPTION:ARSENAL 0\n\nBIRMINGHAM CITY 0\n\nFA Barclaycard Premiership\r
\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Carling Cup semi-final 2nd leg\nRiverside Stadium\r
+DTSTAMP:20040604T150613Z\r
+UID:6BE19946-6EFB-4205-B101-8B4F8E6E7CA4-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:12\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249913\r
+DTSTART;TZID=Europe/London:20040203T200000\r
+SUMMARY:Middlesbrough 2-1 Arsenal\r
+DTEND;TZID=Europe/London:20040203T214500\r
+DESCRIPTION:MIDDLESBROUGH 2\nZenden 69\nReyes o.g. 85\n\nARSENAL 1\nKeow\r
+ n sent off 44\nEdu 77\n\nCarling Cup semi-final 2nd leg\nMiddlesbrough w\r
+ in 3-1 on aggregate\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Amsterdam Arena\nPre-Season Friendly\r
+DTSTAMP:20050731T133943Z\r
+UID:AACA0049-8229-4DA7-A2B3-1D49C7C7B885-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:20\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=295084\r
+DTSTART;TZID=Europe/London:20050729T201500\r
+SUMMARY:Ajax 0-1 Arsenal\r
+DTEND;TZID=Europe/London:20050729T220000\r
+DESCRIPTION:AJAX 0\n\nARSENAL 1\nLupoli 87\n\nAmsterdam Tournament\nPre-\r
+ Season Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:FA Barclaycard Premiership\nStamford Bridge\r
+DTSTAMP:20040604T150520Z\r
+UID:A9782F2E-EDCB-4693-8FBD-EAD7C5353F25-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:2\r
+URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235017\r
+DTSTART;TZID=Europe/London:20040221T123000\r
+SUMMARY:Chelsea 1-2 Arsenal\r
+DTEND;TZID=Europe/London:20040221T141500\r
+DESCRIPTION:CHELSEA 1\nGudjohnsen 1\nGudjohnsen s.o. 60\n\nARSENAL 2\nVi\r
+ eira 15\nEdu 21\n\nFA Barclaycard Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pre-season friendly\nMeadow Lodge\, Broughinge Road\r
+DTSTAMP:20040804T141834Z\r
+UID:FE8DA48F-B209-4ABC-AB74-5E8A1DD57B61-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:3\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=217539\r
+DTSTART;TZID=Europe/London:20040803T194500\r
+SUMMARY:Boreham Wood 1-1 Arsenal XI\r
+DTEND;TZID=Europe/London:20040803T213000\r
+DESCRIPTION:BOREHAM WOOD 1\nMoore 85\n\nARSENAL XI 1\nStokes 47\n\nPre-s\r
+ eason friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20061220T200000\r
+DTEND;TZID=Europe/London:20061220T214500\r
+SUMMARY:Carling Cup 5th round\r
+UID:C9AA0DA8-F923-49C9-98DB-7B2127062298-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:4\r
+DTSTAMP:20060622T105658Z\r
+DESCRIPTION:Carling Cup 5th round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Freethiel Stadium\, Beveren\nPre-Season Friendly\r
+DTSTAMP:20050803T155047Z\r
+UID:923ACB4C-6B8E-480A-9728-EBEF6604866D-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:14\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=296135\r
+DTSTART;TZID=Europe/London:20050802T193000\r
+SUMMARY:KSK Beveren 3-3 Arsenal XI\r
+DTEND;TZID=Europe/London:20050802T211500\r
+DESCRIPTION:KSK BEVEREN 3\nAlain Koudou 37\nMahamadou Dissa 40\nGerjinho\r
+  84\n\nARSENAL XI 3\nArturo Lupoli 19\nRobin van Persie 74\, 79\n\nPre-S\r
+ eason Friendly\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:The JJB Stadium\nBarclays Premiership\r
+DTSTAMP:20051119T210208Z\r
+UID:8B89DDAA-B971-4CAA-8334-B407E8ED2DD7-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:13\r
+URL;VALUE=URI:http://www.arsenal.com/article.asp?article=326151\r
+DTSTART;TZID=Europe/London:20051119T124500\r
+SUMMARY:Wigan Athletic 2-3 Arsenal\r
+DTEND;TZID=Europe/London:20051119T143000\r
+DESCRIPTION:WIGAN ATHLETIC 2\nCamera 28\nBullard 45\n\nARSENAL 3\nVan Pe\r
+ rsie 11\nHenry 21\, 41\n\nBarclays Premiership\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;TZID=Europe/London:20070106T150000\r
+DTEND;TZID=Europe/London:20070106T164500\r
+SUMMARY:F.A. Cup 3rd round\r
+UID:B3908DFB-C6D6-403E-AC9E-485F448A2D08-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:9\r
+DTSTAMP:20060623T172525Z\r
+DESCRIPTION:F.A. Cup 4rth round\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+LOCATION:Pappelstadion\, Austria\r
+DTSTAMP:20060809T113354Z\r
+UID:1D806D3E-B6CF-4257-B5CA-D2A7FA5D8FDC-2793388E-0A6C-4052-AFA4-1B34D1E\r
+ 16656\r
+SEQUENCE:16\r
+DTSTART;TZID=Europe/Oslo:20060725T190000\r
+SUMMARY:SV Mattersburg 1-2 Arsenal\r
+DTEND;TZID=Europe/Oslo:20060725T204500\r
+DESCRIPTION:SV MATTERSBURG 1\nPatocka 68\n\nARSENAL 2\nAliadiere 5\nHoyt\r
+ e 53\n\nPre-Season Friendly\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/events.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/events.ics
new file mode 100644 (file)
index 0000000..d422cb1
--- /dev/null
@@ -0,0 +1,26 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:Carl Thompson's Calendar\r
+PRODID:-//The Horde Project//Horde iCalendar Library//EN\r
+METHOD:PUBLISH\r
+BEGIN:VEVENT\r
+DTSTART:20060905T130000Z\r
+DTEND:20060905T140000Z\r
+DTSTAMP:20060905T073750Z\r
+UID:20060905003740.d1f0ts6wocg@carlthompson.net\r
+SUMMARY:test cet 2\r
+TRANSP:OPAQUE\r
+ORGANIZER;CN=Carl Thompson:MAILTO:cet@carlthompson.net\r
+AALARM:20060905T124500Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+DTSTART;VALUE=DATE:20060905\r
+DTEND;VALUE=DATE:20060906\r
+DTSTAMP:20060905T073750Z\r
+UID:20060905003407.15x1fdrot9b4@carlthompson.net\r
+SUMMARY:test cet\r
+TRANSP:OPAQUE\r
+ORGANIZER;CN=Carl Thompson:MAILTO:cet@carlthompson.net\r
+AALARM:20060905T064500Z\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exchange.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exchange.ics
new file mode 100644 (file)
index 0000000..b714cfb
--- /dev/null
@@ -0,0 +1,53 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:Microsoft CDO for Microsoft Exchange
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:Eastern Time (US & Canada)
+X-MICROSOFT-CDO-TZID:10
+BEGIN:STANDARD
+DTSTART:16010101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20011115T211047Z
+DTSTART;TZID="Eastern Time (US & Canada)":20011116T140000
+SUMMARY:internal final review of mmc site changes
+UID:040000008200E00074C5B7101A82E00800000000B0549C15F06DC101000000000000000
+  0100000008BF784046BEC174CA6706A51BE3E8B33
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="MHMN002"
+:
+  MAILTO:MHMN002@bitgroup.com
+ORGANIZER;CN="Ann Cave":MAILTO:acave@bitgroup.com
+LOCATION:metcalfe
+DTEND;TZID="Eastern Time (US & Canada)":20011116T143000
+DESCRIPTION:Let's get together to finalize. Way to go team in the final hom
+  estretch!\N
+SEQUENCE:0
+PRIORITY:5
+CLASS:
+CREATED:20011115T212414Z
+LAST-MODIFIED:20011115T212414Z
+STATUS:CONFIRMED
+TRANSP:OPAQUE
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+X-MICROSOFT-CDO-INSTTYPE:0
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-IMPORTANCE:1
+BEGIN:VALARM
+ACTION:DISPLAY
+DESCRIPTION:REMINDER
+TRIGGER;RELATED=START:-PT00H15M00S
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exdate.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/exdate.ics
new file mode 100644 (file)
index 0000000..1b7644c
--- /dev/null
@@ -0,0 +1,16 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+X-WR-CALNAME:Nasa History\r
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
+X-WR-RELCALID:7A58AF63-46A0-11D7-BCDE-000A95673266-CALP\r
+X-WR-TIMEZONE;VALUE=TEXT:US/Central\r
+CALSCALE:GREGORIAN\r
+BEGIN:VEVENT\r
+DURATION:P1D\r
+EXDATE;VALUE=DATE:20030428\r
+DTSTAMP:20030926T233021Z\r
+UID:D2924923-RID\r
+DTSTART;VALUE=DATE:20020428\r
+SUMMARY:(1961) Little Joe 5B\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4\r
+END:VEVENT\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/iscw.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/iscw.ics
new file mode 100644 (file)
index 0000000..a057b37
--- /dev/null
@@ -0,0 +1,103 @@
+BEGIN:VCALENDAR\r
+CALSCALE:GREGORIAN\r
+METHOD:PUBLISH\r
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
+X-WR-RELCALID;VALUE=TEXT:2C1BAB64-E9F4-11D7-ACE3-000393161A98\r
+X-WR-CALNAME;VALUE=TEXT:ISCW-related events\, Florida\r
+VERSION:2.0\r
+BEGIN:VEVENT\r
+SEQUENCE:52\r
+DTSTAMP:20030918T161429Z\r
+SUMMARY:Ontoweb Day http://nextwebgeneration.com/meetings/ontoweb5/\r
+DTEND;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T180000\r
+UID:2C1B765F-E9F4-11D7-ACE3-000393161A98\r
+DTSTART;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T093000\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:48\r
+DTSTAMP:20030918T161420Z\r
+SUMMARY:Ontoweb SIG day http://nextwebgeneration.com/meetings/ontoweb5/\r
+DTEND;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031018T180000\r
+UID:2C1B809B-E9F4-11D7-ACE3-000393161A98\r
+DTSTART;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031018T093000\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:2\r
+DTSTAMP:20030918T161218Z\r
+SUMMARY:Beach Barbeque\r
+DTEND;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T210000\r
+UID:2C1B8490-E9F4-11D7-ACE3-000393161A98\r
+DTSTART;\r
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T200000\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:4\r
+UID:2C1B8832-E9F4-11D7-ACE3-000393161A98\r
+DTSTAMP:20030918T161537Z\r
+SUMMARY:DAML PI meeting - http:\r
+ //www.daml.org/listarchive/daml-all/0283.html\r
+DTSTART;VALUE=DATE:20031016\r
+DTEND;VALUE=DATE:20031019\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:2\r
+UID:2C1B8BE6-E9F4-11D7-ACE3-000393161A98\r
+DTSTAMP:20030918T161930Z\r
+SUMMARY:ISCW workshops & tutorials (including one on OWL)\r
+DTSTART;VALUE=DATE:20031020\r
+DURATION:P1D\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:3\r
+UID:2C1B8F73-E9F4-11D7-ACE3-000393161A98\r
+DTSTAMP:20030918T162117Z\r
+SUMMARY:ISCW conference - technical program\, including invited talks by \r
+ Jim and TBL.\r
+DTSTART;VALUE=DATE:20031021\r
+DTEND;VALUE=DATE:20031024\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:4\r
+UID:2C1B9326-E9F4-11D7-ACE3-000393161A98\r
+DTSTAMP:20030918T162014Z\r
+SUMMARY:K-CAP conference - http://sern.ucalgary.ca/ksi/K-CAP/K-CAP2003/\r
+DTSTART;VALUE=DATE:20031023\r
+DTEND;VALUE=DATE:20031026\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+SEQUENCE:5\r
+UID:2C1B96D2-E9F4-11D7-ACE3-000393161A98\r
+DTSTAMP:20030918T162022Z\r
+SUMMARY:K-CAP workshops\, including \"Knowledge Markup and Semantic \r
+ Annotation\"\r\"Knowledge Management and the Semantic Web\" - http:\r
+ //sern.ucalgary.ca/ksi/K-CAP/K-CAP2003/\r
+DTSTART;VALUE=DATE:20031025\r
+DTEND;VALUE=DATE:20031027\r
+END:VEVENT\r
+\r
+BEGIN:VTIMEZONE\r
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York\r
+X-LIC-LOCATION:America/New_York\r
+BEGIN:STANDARD\r
+TZOFFSETFROM:-0400\r
+TZOFFSETTO:-0500  \r
+TZNAME:EST\r
+DTSTART:19701025T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+TZOFFSETFROM:-0500\r
+TZOFFSETTO:-0400  \r
+TZNAME:EDT\r
+DTSTART:19700405T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+\r
+END:VCALENDAR\r
+\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/meeting.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/meeting.ics
new file mode 100644 (file)
index 0000000..a91e150
--- /dev/null
@@ -0,0 +1,71 @@
+BEGIN:VCALENDAR
+METHOD:REQUEST
+PRODID:Microsoft CDO for Microsoft Exchange
+VERSION:2.0
+BEGIN:VTIMEZONE
+TZID:(GMT-05.00) Eastern Time (US & Canada)
+X-MICROSOFT-CDO-TZID:10
+BEGIN:STANDARD
+DTSTART:16010101T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:16010101T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:20060524T175426Z
+DTSTART;TZID="(GMT-05.00) Eastern Time (US & Canada)":20060605T130000
+SUMMARY:Updated: Webex Training - Encryption Push
+UID:040000008200E00074C5B7101A82E008000000009067FAA5207FC601000000000000000
+ 010000000CE96E700B6553147A79107627E39018C
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="CT-Sales"
+ :MAILTO:CT-Sales@CipherTrust.com
+ORGANIZER;CN="Maribell Buchanan":MAILTO:Maribell.Buchanan@CipherTrust.com
+LOCATION:
+DTEND;TZID="(GMT-05.00) Eastern Time (US & Canada)":20060605T140000
+DESCRIPTION:Topic: Encryption Push Training (Note unlisted meeting)\NDate: 
+ Monday\, June 5\, 2006 \NTime: 1:00 pm\, Eastern Daylight Time (GMT -04:00
+ \, New York) \NMeeting number: 481 417 492 \NMeeting password: ctpush \N\N
+ Please click the following link to view or edit your meeting information\,
+  or to start your meeting. \N\N<https://ciphertrust.webex.com/ciphertrust/
+ j.php?ED=90368382> \N\NTeleconference: \NUS Dial In:  877.208.5357 or 770.
+ 659.4232\NUnited Kingdom Dial In:  08000320432\NConference Code:  67890491
+ 98 \N\NTo add this meeting to your calendar program (for example\, Microso
+ ft Outlook or Lotus Notes)\, do the following:  \N\N* For all calendar pro
+ grams (except Lotus Notes)\, click the following link\, or copy the link a
+ nd paste it into your Web browser: \N<https://ciphertrust.webex.com/cipher
+ trust/j.php?ED=90368382&UID=478103317&ICS=MS> \N\N*For Lotus Notes\, follo
+ w these steps: \N1.Right-click the attached iCalendar format (*.ics) file\
+ , and then choose View. \N2.Click Import All. A new broadcast email messag
+ e is added to your Inbox. \N3.Open the new message. \N4.Click Respond butt
+ on. A menu appears. \N5.Click Accept. \N\NTo check for compatibility of ri
+ ch media players for Universal Communications Format (UCF)\, click the fol
+ lowing link: \Nhttps://ciphertrust.webex.com/ciphertrust/systemdiagnosis.p
+ hp \N\Nhttp://www.webex.com\NWe've got to start meeting like this(TM) \N\N
+ \N
+SEQUENCE:0
+PRIORITY:5
+CLASS:
+CREATED:20060524T175427Z
+LAST-MODIFIED:20060524T175428Z
+STATUS:CONFIRMED
+TRANSP:OPAQUE
+X-MICROSOFT-CDO-BUSYSTATUS:BUSY
+X-MICROSOFT-CDO-INSTTYPE:0
+X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
+X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
+X-MICROSOFT-CDO-IMPORTANCE:1
+X-MICROSOFT-CDO-OWNERAPPTID:974673878
+BEGIN:VALARM
+ACTION:DISPLAY
+DESCRIPTION:REMINDER
+TRIGGER;RELATED=START:-PT00H15M00S
+END:VALARM
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/privacy_events.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/privacy_events.ics
new file mode 100644 (file)
index 0000000..14f51bd
--- /dev/null
@@ -0,0 +1,263 @@
+BEGIN:VCALENDAR\r
+VERSION:2.0\r
+PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060719T072322Z\r
+DTSTAMP:20060719T072322Z\r
+UID:uuid:1149656622168\r
+SUMMARY:Australian Smart Card Summit\r
+CLASS:PUBLIC\r
+DTSTART;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060628T140000\r
+DTEND;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060628T150000\r
+URL:http://www.acevents.com.au/cards2006/\r
+DESCRIPTION:The Summit brings together the users and suppliers of smart \r
+ card technology to discuss critical industry trends\, partnerships & \r
+ alliances\, developing standards\, new applications\, new business \r
+ opportunities and future direction.\r
+LOCATION:Sydney Convention and Exhibition Centre\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060719T072322Z\r
+DTSTAMP:20060719T072322Z\r
+UID:uuid:1149657736010\r
+SUMMARY:Privacy Laws & Business - 19th Annual International Conference\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20060702\r
+DTEND;VALUE=DATE:20060703\r
+URL:http://www.privacylaws.com/conferences.annual.html\r
+DESCRIPTION:Privacy Crisis Ahead? Investing enough in data protection to \r
+ strengthen and defend your reputation\nThe Privacy Laws & Business 19th \r
+ Annual International Conference features 50 speakers from 10 countries \r
+ over three intensive days. Over half of these speakers are giving a \r
+ presentation at this conference for the first time.\r
+LOCATION:St. John's College\, Cambridge\, UK\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060724T033326Z\r
+DTSTAMP:20060724T033326Z\r
+UID:uuid:1151539498937\r
+SUMMARY:Privacy in Practice 2006 - Introductory and Advanced sessions for \r
+ Privacy Contact Officers\, tailored for the public and private sectors\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20061024\r
+DTEND;VALUE=DATE:20061027\r
+LOCATION:Sydney CBD\r
+DESCRIPTION:Anna Johnston and Nigel Waters\, former Deputy Privacy \r
+ Commissioners for NSW and the Commonwealth respectively\, are offering \r
+ Privacy Contact Officers (PCOs) an opportunity to update their knowledge \r
+ and upgrade their skills in the practical implementation of privacy \r
+ laws.\n\nIntroductory half day sessions on 24 October offer newly \r
+ appointed PCOs the opportunity to familiarise themselves with the \r
+ relevant privacy principles as they are being interpreted and applied in \r
+ practice\, and to learn about the practical role of a PCO\, including \r
+ compliance strategies.\n\nSeparate advanced full day sessions will focus \r
+ on the law as it applies to the NSW public sector (25 October)\, and to \r
+ the private sector in NSW (26 October)\, exploring in more depth the \r
+ interpretation and enforcement of  privacy laws\, including new laws \r
+ covering health information\, workplace surveillance\, and \r
+ telecommunications.  The advanced sessions will also involve small group \r
+ workshopping of scenarios\, to further develop the practical skills and \r
+ compliance strategies needed to fulfil the PCO role.\r
+URL:http:\r
+ //home.iprimus.com.au/nigelwaters/Privacy%20in%20Practice%20seminar%202006\r
+ .htm\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060719T072322Z\r
+DTSTAMP:20060719T072322Z\r
+UID:uuid:1149656344744\r
+SUMMARY:Australian Biotechnology Summit 2006\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20060725\r
+DTEND;VALUE=DATE:20060727\r
+URL:http://www.acevents.com.au/bio2006\r
+DESCRIPTION:Now into its 4th year\, this summit attracts leading medical \r
+ practitioners\, policy heads\, project financiers\, thought leaders and \r
+ scientists. This July\, a distinguished panel of speakers is updating \r
+ attendees about advances in a sector valued globally at US$63 billion. \r
+ (Source: Chicago Tribune\, April 2006)\n\nBe there this July for a \r
+ first-hand look at how the big pharmas\, medical institutions\, partners \r
+ and consumers are benefiting from medical discoveries\, commercial \r
+ alliances and partnerships\, venture partnerships\, co-development\, as \r
+ well as mergers and acquisitions.\n\nMake sure you attend to share \r
+ practical and time-saving strategies to:\n\n- DELIVER profits across your \r
+ product pipeline\n- MOVE from trials to commercialisation\n- MAXIMISE the \r
+ value of your assets\n- STRENGHTEN branding and distribution\n- BENEFIT \r
+ from *mergers & acquisitions *co-licensing *joint ventures *capital \r
+ raisings\n- READY products for manufacturing and sales\r
+LOCATION:Sydney Convention and Exhibition Centre\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060719T072322Z\r
+DTSTAMP:20060719T072322Z\r
+UID:uuid:1149657358209\r
+SUMMARY:SOCAP Australia 2006 Symposium\r
+CLASS:PUBLIC\r
+DTSTART;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060815T133000\r
+DTEND;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060815T160000\r
+URL:http:\r
+ //socap.org.au/html/s02_article/article_view.asp?id=638&nav_cat_id=134&nav\r
+ _top_id=58&dsa=20\r
+DESCRIPTION:The Society of Consumer Affairs Professionals (SOCAP) \r
+ Australia Symposium is the oldest and most prestigious consumer affairs \r
+ and customer service event in Australia. Supported by the various \r
+ industry regulatory bodies in Australia\, the Symposium provides a forum \r
+ that promotes best practice and research into customer service and \r
+ consumer affairs.\r
+LOCATION:Sydney\, Manly Pacific\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060719T072322Z\r
+LAST-MODIFIED:20060719T072322Z\r
+DTSTAMP:20060719T072322Z\r
+UID:uuid:1151028064071\r
+SUMMARY:Health Informatics Conference\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20060819\r
+DTEND;VALUE=DATE:20060822\r
+URL:http://www.hic.org.au\r
+DESCRIPTION:Bridging the Digital Divide: Consumers\, Clinicians & \r
+ Computers\n\nHIC 2006 is Australia's premier health informatics \r
+ conference. This event brings national and international experts in \r
+ health information technology together to address some of the critical \r
+ information systems issues in Australian health care. It is also an \r
+ important opportunity to meet and exchange views with colleagues in the \r
+ health information technology sector.\r
+LOCATION:Sydney Convention Centre\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060720T041700Z\r
+LAST-MODIFIED:20060720T042923Z\r
+DTSTAMP:20060720T042923Z\r
+UID:uuid1153369107395\r
+SUMMARY:Security 2006\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20060829\r
+DTEND;VALUE=DATE:20060901\r
+DESCRIPTION:Security 2006 Conference & Exhibition is the event that \r
+ brings the industry's key decision makers\, leaders\, suppliers and \r
+ customers together to do business.\n\nNow entering its 21st year\, \r
+ Australia's premier security industry event offers a unique platform to \r
+ target a highly qualified audience of security professionals.\r
+LOCATION:Hall 5 and 6\, Sydney Convention and Exhibition Centre\, Darling \r
+ Harbour\r
+URL:http:\r
+ //www.asial.com.au/default.asp?page=security+expo/home&flashver=8.0.22\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060720T041921Z\r
+LAST-MODIFIED:20060720T042110Z\r
+DTSTAMP:20060720T042110Z\r
+UID:uuid1153369270069\r
+SUMMARY:Border Control & Port Security 2006\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20060807\r
+DTEND;VALUE=DATE:20060809\r
+DESCRIPTION:Border Control & Port Security 2006 will focus on the \r
+ legislative and technology challenges facilitating the transformation of \r
+ inter- agency initiatives to secure ports and strategic points of entry \r
+ into Australia. This event will analyse and review the progress\, \r
+ achievements and pitfalls of agency and industry initiatives and focus on \r
+ future directions.\r
+LOCATION:The Vibe Savoy Hotel\, Melbourne\, Victoria\r
+URL:http:\r
+ //www.iir.com.au/conferences/confdetail.html?detail=I0354.html&cat_code=se\r
+ curity&conf_code=I0354\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060728T011147Z\r
+LAST-MODIFIED:20060728T011338Z\r
+DTSTAMP:20060728T011338Z\r
+UID:uuid1154049185025\r
+SUMMARY:Identity Fraud Summit\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE:20061031\r
+DTEND;VALUE=DATE:20061103\r
+DESCRIPTION:The key meeting place for those involved with Fraud & \r
+ Identity Management in the public and private sector.\nDeveloping a \r
+ synthesis between public and private sector to produce a national \r
+ response.\n- DISCOVER... the latest Global trends in Identity Fraud\n- \r
+ FIND OUT... what the impact and cost of Identity Fraud is on Australia\n- \r
+ TAKE PART... in Seven Interactive Discussions\n- MEET... and swap ideas \r
+ with your industry peers at the Networking Drinks\n- LEARN... how \r
+ collaboration can help to combat Identity Fraud (trust centre concept)... \r
+ from Westpac & Australia Post\n- GET INFORMED... on the Hong Kong \r
+ National Identity Card featuring Raymond Wai-man Wong\n- UNDERSTAND... \r
+ the role and value of the government health and welfare access card\r
+LOCATION:Swissôtel Sydney\r
+URL:http:\r
+ //www.iir.com.au/conferences/confdetail.html?conf_code=L1282&cat_code=fina\r
+ nce&detail=L1282.html\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+CREATED:20060809T015738Z\r
+LAST-MODIFIED:20060809T023217Z\r
+DTSTAMP:20060809T023217Z\r
+UID:uuid1155089998351\r
+SUMMARY:Privacy Awareness Week\r
+PRIORITY:0\r
+CLASS:PUBLIC\r
+DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/Asia/Sakhalin:20060827\r
+DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/Asia/Sakhalin:20060903\r
+URL:http://www.privacy.gov.au/news/paw.html\r
+LOCATION:Victoria\, NSW\, NT and Federal\r
+DESCRIPTION:The week is an opportunity for organisations and agencies \r
+ affected by the Privacy Act 1998 (Cth) to promote privacy awareness to \r
+ their staff\, custotmers\, and to the wider community.\n\nPrivacy \r
+ Awareness Week is a promotional campaign first initiated by Privacy \r
+ Victoria in 2001. This year\, for the first time\, Privacy Awareness Week \r
+ has gone national and will be jointly promoted by the Office of the \r
+ Privacy Commissioner\, Privacy Victorian and Privacy NSW and the Office \r
+ of the Information Commissioner of the Northern Territory.\n\nThe theme \r
+ is \"Don't leave privacy to chance\".\n\nOPC - http:\r
+ //www.privacy.gov.au/news/paw.html\nVictoria - http:\r
+ //www.privacy.vic.gov.au/dir100/priweb.nsf\nNSW - http:\r
+ //www.lawlink.nsw.gov.au/lawlink/privacynsw/ll_pnsw.nsf/pages/PNSW_index\n\r
+ NT - http://www.privacy.nt.gov.au/\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID:/mozilla.org/20050126_1/Asia/Sakhalin\r
+X-LIC-LOCATION:Asia/Sakhalin\r
+BEGIN:STANDARD\r
+TZOFFSETFROM:+1100\r
+TZOFFSETTO:+1000\r
+TZNAME:SAKT\r
+DTSTART:19701025T030000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+TZOFFSETFROM:+1000\r
+TZOFFSETTO:+1100\r
+TZNAME:SAKST\r
+DTSTART:19700329T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID:/mozilla.org/20050126_1/Australia/Sydney\r
+X-LIC-LOCATION:Australia/Sydney\r
+BEGIN:STANDARD\r
+TZOFFSETFROM:+1100\r
+TZOFFSETTO:+1000\r
+TZNAME:EST\r
+DTSTART:19700329T030000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\r
+END:STANDARD\r
+BEGIN:DAYLIGHT\r
+TZOFFSETFROM:+1000\r
+TZOFFSETTO:+1100\r
+TZNAME:EST\r
+DTSTART:19701025T020000\r
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
+END:DAYLIGHT\r
+END:VTIMEZONE\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/rfc2445.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/rfc2445.ics
new file mode 100644 (file)
index 0000000..363231d
--- /dev/null
@@ -0,0 +1,305 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//hacksw/handcal//NONSGML v1.0//EN
+BEGIN:VEVENT
+DTSTART:19970714T170000Z
+DTEND:19970715T035959Z
+SUMMARY:Bastille Day Party
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123401@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970903T163000Z
+DTEND:19970903T190000Z
+SUMMARY:Annual Employee Review
+CLASS:PRIVATE
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123402@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970401T163000Z
+DTEND:19970402T010000Z
+SUMMARY:Laurel is in sensitivity awareness class.
+CLASS:PUBLIC
+CATEGORIES:BUSINESS,HUMAN RESOURCES
+TRANSP:TRANSPARENT
+END:VEVENT
+
+BEGIN:VEVENT
+UID:19970901T130000Z-123403@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19971102
+SUMMARY:Our Blissful Anniversary
+CLASS:CONFIDENTIAL
+CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
+RRULE:FREQ=YEARLY
+END:VEVENT
+
+BEGIN:VTODO
+UID:19970901T130000Z-123404@host.com
+DTSTAMP:19970901T1300Z
+DTSTART:19970415T133000Z
+DUE:19970416T045959Z
+SUMMARY:1996 Income Tax Preparation
+CLASS:CONFIDENTIAL
+CATEGORIES:FAMILY,FINANCE
+PRIORITY:1
+STATUS:NEEDS-ACTION
+END:VTODO
+BEGIN:VJOURNAL
+UID:19970901T130000Z-123405@host.com
+DTSTAMP:19970901T1300Z
+DTSTART;VALUE=DATE:19970317
+SUMMARY:Staff meeting minutes
+DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
+  and Bob. Aurora project plans were reviewed. There is currently
+  no budget reserves for this project. Lisa will escalate to
+  management. Next meeting on Tuesday.\n
+  2. Telephone Conference: ABC Corp. sales representative called
+  to discuss new printer. Promised to get us a demo by Friday.\n
+  3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
+  Is looking into a loaner car. 654-2323 (tel).
+END:VJOURNAL
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTART:19971015T050000Z
+DTEND:19971016T050000Z
+DTSTAMP:19970901T083000Z
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jane_doe@host1.com
+ATTENDEE:MAILTO:john_public@host2.com
+DTSTAMP:19970901T100000Z
+FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
+ 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
+URL:http://host2.com/pub/busy/jpublic-01.ifb
+COMMENT:This iCalendar file contains busy time information for
+  the next three months.
+END:VFREEBUSY
+BEGIN:VFREEBUSY
+ORGANIZER:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19971026T020000
+RDATE:19971026T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19971026T020000
+RDATE:19970406T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VTIMEZONE
+TZID:US--Fictitious-Eastern
+LAST-MODIFIED:19870101T000000Z
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+BEGIN:DAYLIGHT
+DTSTART:19990424T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19970317T133000Z
+REPEAT:4
+DURATION:PT15M
+ACTION:AUDIO
+ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-PT30M
+REPEAT:2
+DURATION:PT15M
+ACTION:DISPLAY
+DESCRIPTION:Breakfast meeting with executive\n
+ team at 8:30 AM EST.
+END:VALARM
+BEGIN:VALARM
+TRIGGER:-P2D
+ACTION:EMAIL
+ATTENDEE:MAILTO:john_doe@host.com
+SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
+DESCRIPTION:A draft agenda needs to be sent out to the attendees
+  to the weekly managers meeting (MGR-LIST). Attached is a
+  pointer the document template for the agenda file.
+ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
+ da.doc
+END:VALARM
+BEGIN:VALARM
+TRIGGER;VALUE=DATE-TIME:19980101T050000Z
+REPEAT:23
+DURATION:PT1H
+ACTION:PROCEDURE
+ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
+ procs/felizano.exe
+END:VALARM
+
+BEGIN:VTIMEZONE
+TZID:US-Eastern
+BEGIN:STANDARD
+DTSTART:19981025T020000
+RDATE:19981025T020000
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19990404T020000
+RDATE:19990404T020000
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTAMP:19980309T231000Z
+UID:guid-1.host1.com
+ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
+ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
+ MAILTO:employee-A@host.com
+DESCRIPTION:Project XYZ Review Meeting
+CATEGORIES:MEETING
+CLASS:PUBLIC
+CREATED:19980309T130000Z
+SUMMARY:XYZ Project Review
+DTSTART;TZID=US-Eastern:19980312T083000
+DTEND;TZID=US-Eastern:19980312T093000
+LOCATION:1CP Conference Room 4350
+END:VEVENT
+
+BEGIN:VEVENT
+DTSTAMP:19970324T1200Z
+SEQUENCE:0
+UID:uid3@host1.com
+ORGANIZER:MAILTO:jdoe@host1.com
+DTSTART:19970324T123000Z
+DTEND:19970324T210000Z
+CATEGORIES:MEETING,PROJECT
+CLASS:PUBLIC
+SUMMARY:Calendaring Interoperability Planning Meeting
+DESCRIPTION:Discuss how we can test c&s interoperability\n
+ using iCalendar and other IETF standards.
+LOCATION:LDB Lobby
+ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
+ conf/bkgrnd.ps
+END:VEVENT
+
+BEGIN:VTODO
+DTSTAMP:19980130T134500Z
+SEQUENCE:2
+UID:uid4@host1.com
+ORGANIZER:MAILTO:unclesam@us.gov
+ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
+DUE:19980415T235959
+STATUS:NEEDS-ACTION
+SUMMARY:Submit Income Taxes
+BEGIN:VALARM
+ACTION:AUDIO
+TRIGGER:19980403T120000
+ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
+ files/ssbanner.aud
+REPEAT:4
+DURATION:PT1H
+END:VALARM
+END:VTODO
+
+BEGIN:VJOURNAL
+DTSTAMP:19970324T120000Z
+UID:uid5@host1.com
+ORGANIZER:MAILTO:jsmith@host.com
+STATUS:DRAFT
+CLASS:PUBLIC
+CATEGORIES:Project Report, XYZ, Weekly Meeting
+DESCRIPTION:Project xyz Review Meeting Minutes\n
+ Agenda\n1. Review of project version 1.0 requirements.\n2.
+ Definition
+ of project processes.\n3. Review of project schedule.\n
+ Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
+  decided that the requirements need to be signed off by
+  product marketing.\n-Project processes were accepted.\n
+ -Project schedule needs to account for scheduled holidays
+  and employee vacation time. Check with HR for specific
+  dates.\n-New schedule will be distributed by Friday.\n-
+ Next weeks meeting is cancelled. No meeting until 3/23.
+END:VJOURNAL
+
+BEGIN:VFREEBUSY
+ORGANIZER:MAILTO:jsmith@host.com
+DTSTART:19980313T141711Z
+DTEND:19980410T141711Z
+FREEBUSY:19980314T233000Z/19980315T003000Z
+FREEBUSY:19980316T153000Z/19980316T163000Z
+FREEBUSY:19980318T030000Z/19980318T040000Z
+URL:http://www.host.com/calendar/busytime/jsmith.ifb
+END:VFREEBUSY
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test.vcs b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test.vcs
new file mode 100644 (file)
index 0000000..33476d1
--- /dev/null
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+BEGIN:VTIMEZONE
+TZID:US/Eastern
+LAST-MODIFIED:19870101T000000Z
+TZURL:http://zones.stds_r_us.net/tz/US-Eastern
+BEGIN:STANDARD
+DTSTART:19671029T020000
+RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19870405T020000
+RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+END:DAYLIGHT
+END:VTIMEZONE
+
+BEGIN:VEVENT
+UID:14b2f1a:10aba5a6339:3fcd
+SUMMARY:2007 Astronaut Glove Challenge: APRIL DATE TBD
+LOCATION:To be determined (TBD)
+DTSTART;TZID=US/Eastern:20021101
+DTEND;TZID=US/Eastern:20021101
+URL:www.astronaut-glove.us
+ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
+CATEGORIES:Centennial Challenges*
+STATUS:CONFIRMED
+END:VEVENT
+
+END:VCALENDAR
\ No newline at end of file
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test4.vcs b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test4.vcs
new file mode 100644 (file)
index 0000000..ef06c64
--- /dev/null
@@ -0,0 +1,39 @@
+BEGIN:VCALENDAR
+CALSCALE:GREGORIAN
+X-WR-TIMEZONE;VALUE=TEXT:America/New_York
+METHOD:PUBLISH
+PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
+X-WR-CALNAME;VALUE=TEXT:Chiefs
+X-WR-RELCALID;VALUE=TEXT:D60439DF-C1C9-11D6-9446-003065F198AC
+VERSION:2.0
+
+BEGIN:VEVENT
+DTSTAMP:20020906T031451Z
+SUMMARY:Chiefs vs. Buffalo @ Arrowhead Stadium
+DTEND;
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20021117T170000
+UID:D604022C-C1C9-11D6-9446-003065F198AC
+DTSTART;
+ TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20021117T140000
+END:VEVENT
+
+BEGIN:VTIMEZONE
+TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
+X-LIC-LOCATION:America/New_York
+BEGIN:STANDARD
+TZOFFSETFROM:-0400
+TZOFFSETTO:-0500
+TZNAME:EST
+DTSTART:19701025T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+TZOFFSETFROM:-0500
+TZOFFSETTO:-0400
+TZNAME:EDT
+DTSTART:19700405T020000
+RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
+END:DAYLIGHT
+END:VTIMEZONE
+
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test_recurring.vcs b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/test_recurring.vcs
new file mode 100644 (file)
index 0000000..8d01f59
--- /dev/null
@@ -0,0 +1,50 @@
+BEGIN:VCALENDAR
+X-LOTUS-CHARSET:UTF-8
+VERSION:2.0
+PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
+METHOD:REQUEST
+BEGIN:VTIMEZONE
+TZID:Central European
+BEGIN:STANDARD
+DTSTART:19501029T020000
+TZOFFSETFROM:+0200
+TZOFFSETTO:+0100
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
+END:STANDARD
+BEGIN:DAYLIGHT
+DTSTART:19500326T020000
+TZOFFSETFROM:+0100
+TZOFFSETTO:+0200
+RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3
+END:DAYLIGHT
+END:VTIMEZONE
+BEGIN:VEVENT
+DTSTART;TZID="Central European":20040417T110000
+DTEND;TZID="Central European":20040417T113000
+TRANSP:OPAQUE
+DTSTAMP:20040416T075254Z
+SEQUENCE:0
+ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="XXXX/UNSA"
+ ;RSVP=FALSE:mailto:XXXX@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:XXXX1@XXXX.com
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="XXXX2";RSVP=TRUE:mailto:XXXX2@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
+ ;CN="XXXX3";RSVP=TRUE:mailto:XXXX3@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:XXXX4@XXXX.ba
+ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
+ :mailto:vljubovic@smartnet.ba
+CLASS:PUBLIC
+SUMMARY:XXXStriked out XXX
+ORGANIZER;CN="XXXX/UNSA":mailto:XXXX@XXXX.ba
+UID:59A47452891243FCC1256E78002B082C-Lotus_Notes_Generated
+X-LOTUS-BROADCAST:FALSE
+X-LOTUS-UPDATE-SEQ:1
+X-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1
+X-LOTUS-NOTESVERSION:2
+X-LOTUS-NOTICETYPE:I
+X-LOTUS-CHILD_UID:59A47452891243FCC1256E78002B082C
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/wicca.ics b/framework/Icalendar/test/Horde/Icalendar/fixtures/vTimezone/wicca.ics
new file mode 100644 (file)
index 0000000..c5b198c
--- /dev/null
@@ -0,0 +1,568 @@
+BEGIN:VCALENDAR\r
+VERSION\r
+ :2.0\r
+PRODID\r
+ :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN\r
+BEGIN:VEVENT\r
+UID\r
+ :293f6ec0-7d5c-11d9-9edb-86b60372ed4f\r
+SUMMARY\r
+ :Wolf Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050125T103200\r
+DTEND\r
+ :20050125T103200\r
+DTSTAMP\r
+ :20050213T010920Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :4b796be0-7d5c-11d9-a79e-f521d81ef98e\r
+SUMMARY\r
+ :Snow Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050224T045400\r
+DTEND\r
+ :20050224T045400\r
+DTSTAMP\r
+ :20050213T011118Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :687d6650-7d5c-11d9-b9ce-d66b104d4c5c\r
+SUMMARY\r
+ :Worm Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050325T205800\r
+DTEND\r
+ :20050325T205800\r
+DTSTAMP\r
+ :20050213T011216Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :7fdedfc0-7d5c-11d9-9f01-8a1645cec7bc\r
+SUMMARY\r
+ :Pink Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050424T100600\r
+DTEND\r
+ :20050424T100600\r
+DTSTAMP\r
+ :20050213T011313Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :9b7bc120-7d5c-11d9-b9fd-fddd77a2f4ee\r
+SUMMARY\r
+ :Flower Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050523T201800\r
+DTEND\r
+ :20050523T201800\r
+DTSTAMP\r
+ :20050213T011346Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :b74fa540-7d5c-11d9-8bc4-c07a48ed7f9f\r
+SUMMARY\r
+ :Strawberry Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050622T041400\r
+DTEND\r
+ :20050622T041400\r
+DTSTAMP\r
+ :20050213T011447Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :cac83ae0-7d5c-11d9-83a6-c557260cbb42\r
+SUMMARY\r
+ :Buck Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050721T110000\r
+DTEND\r
+ :20050721T110000\r
+DTSTAMP\r
+ :20050213T011521Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :e29632a0-7d5c-11d9-8e39-c4ffeaa792b7\r
+SUMMARY\r
+ :Sturgeon Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050819T175300\r
+DTEND\r
+ :20050819T175300\r
+DTSTAMP\r
+ :20050213T011549Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :f755ca60-7d5c-11d9-834c-eca1a5a058a8\r
+SUMMARY\r
+ :Harvest Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20050918T020100\r
+DTEND\r
+ :20050918T020100\r
+DTSTAMP\r
+ :20050213T011634Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :0e53f0a0-7d5d-11d9-aa77-85a55723aa1a\r
+SUMMARY\r
+ :Hunter's Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20041017T121400\r
+DTEND\r
+ :20041017T121400\r
+DTSTAMP\r
+ :20050213T011711Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :1ef9be90-7d5d-11d9-a40c-bbc7de36c237\r
+SUMMARY\r
+ :Beaver Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20051116T005700\r
+DTEND\r
+ :20051116T005700\r
+DTSTAMP\r
+ :20050213T011742Z\r
+END:VEVENT\r
+BEGIN:VEVENT\r
+UID\r
+ :311774a0-7d5d-11d9-9276-c725d4bd91bb\r
+SUMMARY\r
+ :Cold Moon\r
+CATEGORIES\r
+ :Religious\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ :20051215T161500\r
+DTEND\r
+ :20051215T161500\r
+DTSTAMP\r
+ :20050213T011811Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :a35db050-7d57-11d9-acd7-80bf3de81f21\r
+SUMMARY\r
+ :Imbolc\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Imbolc\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050202\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050203\r
+DTSTAMP\r
+ :20050213T003803Z\r
+LAST-MODIFIED\r
+ :20050213T013635Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :ee441e90-7d58-11d9-9cee-8ded43aa4674\r
+SUMMARY\r
+ :Ostara (Spring Equinox)\r
+DESCRIPTION\r
+ :Vernal equinox - 2005-03-20 12:31\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Ostara\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050320\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050321\r
+DTSTAMP\r
+ :20050213T004630Z\r
+LAST-MODIFIED\r
+ :20050213T013646Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :ca2146f0-7d59-11d9-8273-cf31bbadf60d\r
+SUMMARY\r
+ :Beltane\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Beltane\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050501\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050502\r
+DTSTAMP\r
+ :20050213T005347Z\r
+LAST-MODIFIED\r
+ :20050213T013657Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :475aa800-7d59-11d9-8ed1-d5e698b9bd8a\r
+SUMMARY\r
+ :Litha (Summer Solstice)\r
+DESCRIPTION\r
+ :Summer solstice: 2005-06-21 06:37\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Midsummer\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050621\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050622\r
+DTSTAMP\r
+ :20050213T004839Z\r
+LAST-MODIFIED\r
+ :20050213T013708Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :efb2fd10-7d59-11d9-a277-a16bba33fd3b\r
+SUMMARY\r
+ :Lughnasadh\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Lughnasadh\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050801\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050802\r
+DTSTAMP\r
+ :20050213T005432Z\r
+LAST-MODIFIED\r
+ :20050213T013720Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :6bdc5ec0-7d59-11d9-8b46-f9c22fa24f9b\r
+SUMMARY\r
+ :Mabon (Autumnal Equinox)\r
+DESCRIPTION\r
+ :Autumnal equinox:  2005-09-22 22:15\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Mabon\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050922\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20050923\r
+DTSTAMP\r
+ :20050213T005052Z\r
+LAST-MODIFIED\r
+ :20050213T013736Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :052e88e0-7d5a-11d9-8b11-cf36bfaf3b82\r
+SUMMARY\r
+ :Samhain\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Samhain\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20051031\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20051101\r
+DTSTAMP\r
+ :20050213T005533Z\r
+LAST-MODIFIED\r
+ :20050213T013749Z\r
+END:VEVENT\r
+BEGIN:VTIMEZONE\r
+TZID\r
+ :/Mozilla.org/BasicTimezones/GMT\r
+LOCATION\r
+ :GMT\r
+END:VTIMEZONE\r
+BEGIN:VEVENT\r
+UID\r
+ :94627ab0-7d59-11d9-baa4-ff7960c01405\r
+SUMMARY\r
+ :Yule (Winter Solstice)\r
+DESCRIPTION\r
+ :Winter solstice:  2005-12-21 18:33\r
+CATEGORIES\r
+ :Religious\r
+URL\r
+ :http://en.wikipedia.org/wiki/Yule\r
+STATUS\r
+ :CONFIRMED\r
+CLASS\r
+ :PUBLIC\r
+X-MOZILLA-ALARM-DEFAULT-LENGTH\r
+ :0\r
+DTSTART\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20051221\r
+DTEND\r
+ ;VALUE=DATE\r
+ ;TZID=/Mozilla.org/BasicTimezones/GMT\r
+ :20051222\r
+DTSTAMP\r
+ :20050213T005154Z\r
+LAST-MODIFIED\r
+ :20050213T013804Z\r
+END:VEVENT\r
+END:VCALENDAR\r
diff --git a/framework/Icalendar/test/Horde/Icalendar/geo.phpt b/framework/Icalendar/test/Horde/Icalendar/geo.phpt
new file mode 100644 (file)
index 0000000..fa9d5e7
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+GEO test
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$data = 'BEGIN:VCARD
+VERSION:2.1
+GEO:37.24,-17.87
+END:VCARD';
+
+$ical->parseVCalendar($data);
+$vcard = $ical->getComponent(0);
+var_export($vcard->getAttribute('GEO'));
+echo "\n";
+
+$data = 'BEGIN:VCARD
+VERSION:3.0
+GEO:37.386013;-122.082932
+END:VCARD';
+
+$ical->parseVCalendar($data);
+$vcard = $ical->getComponent(0);
+var_export($vcard->getAttribute('GEO'));
+
+?>
+--EXPECT--
+array (
+  'latitude' => -17.87,
+  'longitude' => 37.24,
+)
+array (
+  'latitude' => 37.386013,
+  'longitude' => -122.082932,
+)
diff --git a/framework/Icalendar/test/Horde/Icalendar/iCalendar.phpt b/framework/Icalendar/test/Horde/Icalendar/iCalendar.phpt
new file mode 100644 (file)
index 0000000..e1c225e
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+Tests the date parsing in iCalendar.php
+--FILE--
+<?php
+
+$data = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//proko2//freebusy 1.0//EN
+METHOD:PUBLISH
+BEGIN:VFREEBUSY
+ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
+DTSTAMP:20061122T230929Z
+DTSTART:19700101T000000Z
+DTEND:BORKED
+FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;
+ X-SUMMARY=dGVzdHRlcm1pbg==:20061123T050000Z/20061123T060000Z
+FREEBUSY:20061123T080000Z/PT2H
+END:VFREEBUSY
+END:VCALENDAR';
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+// Parse the data
+$ical->parseVCalendar($data);
+
+// Get the vFreeBusy component
+$vfb = $ical->getComponent(0);
+
+var_dump($vfb->getAttribute('DTSTART'));
+var_dump($vfb->getAttribute('DTEND'));
+
+?>
+--EXPECT--
+int(0)
+string(6) "BORKED"
diff --git a/framework/Icalendar/test/Horde/Icalendar/line-folding.phpt b/framework/Icalendar/test/Horde/Icalendar/line-folding.phpt
new file mode 100644 (file)
index 0000000..f7762ec
--- /dev/null
@@ -0,0 +1,180 @@
+--TEST--
+Line folding tests.
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+
+$ical = new Horde_Icalendar();
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DESCRIPTION', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.');
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+echo "\n";
+
+$ical = new Horde_Icalendar('1.0');
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DESCRIPTION', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.');
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+echo "\n";
+
+$ical = new Horde_Icalendar();
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DESCRIPTION', 'Lörem ipsüm dölör sit Ã¤met, cönsectetüer Ã¤dipiscing elit. Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.');
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+echo "\n";
+
+$ical = new Horde_Icalendar('1.0');
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DESCRIPTION', 'Lörem ipsüm dölör sit Ã¤met, cönsectetüer Ã¤dipiscing elit. Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.', array('CHARSET' => 'UTF-8'));
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+echo "\n";
+
+$ical = new Horde_Icalendar('1.0');
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DESCRIPTION', 'Löremipsümdölörsitämet,cönsectetüerädipiscingelit.Aliqüämsöllicitüdinfäücibüsmäürisämet. Löremipsümdölörsitämet,cönsectetüerädipiscingelit.Aliqüämsöllicitüdinfäücibüsmäürisämet.', array('CHARSET' => 'UTF-8'));
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+echo "\n";
+
+$ical = new Horde_Icalendar();
+$event = Horde_Icalendar::newComponent('vevent', $ical);
+$event->setAttribute('UID', 'XXX');
+$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
+$description = <<<EOT
+SYLVIE DAGORNE a Ã©crit :
+
+Bonjour,
+
+suite Ã  mon appel téléphonique auprès de Jacques Benzerara, il m'a renvoyé vers vous. En effet, je souhaiterais vous rencontrer car:
+1°) au niveau de l'observatoire local nous devons lancer une enquête sur un suivi de cohorte Ã  la rentrée prochaine qui concernera tous les Ã©tudiants de L1. Nous souhaiterons faire un questionnaire en ligne ce questionnaire devra Ãªtre hébergé sur un serveur.
+
+2°) dans le cadre de l'observatoire régional, nos partenaires nous demande Ã©galement de faire des questionnaires en ligne. Nous disposons du logiciel Modalisa qui permet de le réaliser mais du point de vu technique, nous avons besoin de voir avec vous,  les difficultés et les limites d'un tel dispositif afin de voir les démarches Ã  suivre et pouvoir Ã©voquer tous ces problèmes techniques, je souhaiterais vous rencontrer. Merci de me précisez vos disponibilités?
+...
+Je serai accompagné d'un collègue pour l'observatoire local (David Le foll) et de la chargée d'études de l'observatoire régional (Amélie Gicquel) pour la partie régionale.
+EOT;
+$event->setAttribute('DESCRIPTION', $description);
+$ical->addComponent($event);
+echo $ical->exportVCalendar();
+
+?>
+--EXPECT--
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART;VALUE=DATE:20080101
+DTSTAMP;VALUE=DATE:20080101
+DESCRIPTION:Lorem ipsum dolor sit amet\, consectetuer adipiscing elit.
+  Aliquam sollicitudin faucibus mauris amet.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:1.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART:20080101T000000
+DTSTAMP:20080101T000000
+DESCRIPTION:Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART;VALUE=DATE:20080101
+DTSTAMP;VALUE=DATE:20080101
+DESCRIPTION:Lörem ipsüm dölör sit Ã¤met\, cönsectetüer Ã¤dipiscing elit.
+  Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:1.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART:20080101T000000
+DTSTAMP:20080101T000000
+DESCRIPTION;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:L=C3=B6rem ips=C3=BCm d=C3=B6l=C3=B6r sit =C3=A4met, c=C3=B6nsectet=C3=BCer =
+=C3=A4dipiscing elit. Aliq=C3=BC=C3=A4m s=C3=B6llicit=C3=BCdin f=C3=A4=C3=BC=
+cib=C3=BCs m=C3=A4=C3=BCris =C3=A4met.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:1.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART:20080101T000000
+DTSTAMP:20080101T000000
+DESCRIPTION;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:L=C3=B6remips=C3=BCmd=C3=B6l=C3=B6rsit=C3=A4met,c=C3=B6nsectet=C3=BCer=C3=A4=
+dipiscingelit.Aliq=C3=BC=C3=A4ms=C3=B6llicit=C3=BCdinf=C3=A4=C3=BCcib=C3=BCs=
+m=C3=A4=C3=BCris=C3=A4met. L=C3=B6remips=C3=BCmd=C3=B6l=C3=B6rsit=C3=A4met,c=
+=C3=B6nsectet=C3=BCer=C3=A4dipiscingelit.Aliq=C3=BC=C3=A4ms=C3=B6llicit=C3=
+=BCdinf=C3=A4=C3=BCcib=C3=BCsm=C3=A4=C3=BCris=C3=A4met.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
+
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:XXX
+DTSTART;VALUE=DATE:20080101
+DTSTAMP;VALUE=DATE:20080101
+DESCRIPTION:SYLVIE DAGORNE a Ã©crit :\n\nBonjour\,\n\nsuite Ã  mon appel
+  téléphonique auprès de Jacques Benzerara\, il m'a renvoyé vers vous. En
+  effet\, je souhaiterais vous rencontrer car:\n1°) au niveau de
+  l'observatoire local nous devons lancer une enquête sur un suivi de
+  cohorte Ã  la rentrée prochaine qui concernera tous les Ã©tudiants de L1.
+  Nous souhaiterons faire un questionnaire en ligne ce questionnaire devra
+  Ãªtre hébergé sur un serveur.\n\n2°) dans le cadre de l'observatoire
+  régional\, nos partenaires nous demande Ã©galement de faire des
+  questionnaires en ligne. Nous disposons du logiciel Modalisa qui permet
+  de le réaliser mais du point de vu technique\, nous avons besoin de voir
+  avec vous\,  les difficultés et les limites d'un tel dispositif afin de
+  voir les démarches Ã  suivre et pouvoir Ã©voquer tous ces problèmes
+  techniques\, je souhaiterais vous rencontrer. Merci de me précisez vos
+  disponibilités?\n...\nJe serai accompagné d'un collègue pour
+  l'observatoire local (David Le foll) et de la chargée d'études de
+  l'observatoire régional (Amélie Gicquel) pour la partie régionale.
+SUMMARY:
+END:VEVENT
+END:VCALENDAR
diff --git a/framework/Icalendar/test/Horde/Icalendar/quoted-params.phpt b/framework/Icalendar/test/Horde/Icalendar/quoted-params.phpt
new file mode 100644 (file)
index 0000000..b9c5878
--- /dev/null
@@ -0,0 +1,43 @@
+--TEST--
+Ensure parameters are correctly quoted.
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+$readIcal = new Horde_Icalendar();
+
+$event1 = Horde_Icalendar::newComponent('vevent', $ical);
+
+$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
+$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
+$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
+$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
+$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
+$event1->setAttribute('ORGANIZER', 'mailto:mueller@example.org', array('CN' => "Klä,rc\"hen;\n Mül:ler"));
+
+$ical->addComponent($event1);
+
+echo $ical->exportVCalendar();
+
+$readIcal->parseVCalendar($ical->exportVCalendar());
+$event1 = $readIcal->getComponent(0);
+$attr = $event1->getAttribute('ORGANIZER', true);
+echo $attr[0]['CN'];
+?>
+--EXPECT--
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:20041120-8550-innerjoin-org
+DTSTART;VALUE=DATE:20050503
+DTSTAMP;VALUE=DATE:20041120
+SUMMARY:Escaped Comma in Description Field
+DESCRIPTION:There is a comma (escaped with a baskslash) in this sentence
+  and some important words after it\, see anything here?
+ORGANIZER;CN="Klä,rchen; Mül:ler":mailto:mueller@example.org
+END:VEVENT
+END:VCALENDAR
+Klä,rchen; Mül:ler
diff --git a/framework/Icalendar/test/Horde/Icalendar/read-escapes.phpt b/framework/Icalendar/test/Horde/Icalendar/read-escapes.phpt
new file mode 100644 (file)
index 0000000..8a17ed8
--- /dev/null
@@ -0,0 +1,59 @@
+--TEST--
+Read data with escaped values test.
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$data = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//innerjoin.org//NONSGML Innerjoin Events Publisher V1.0//EN
+BEGIN:VEVENT
+UID:20041120-8550-innerjoin-org
+DTSTART;VALUE=DATE:20050503
+DTSTAMP;VALUE=DATE:20041120
+URL:
+ http://www.innerjoin.org/iCalendar/test-cases/sunbird-0-2/ical-escaped-comma-desc.txt
+SUMMARY:
+ Escaped Comma in Description Field
+DESCRIPTION:
+ There is a comma (escaped with a baskslash) in this sentence and some important words after it\, see anything here?
+END:VEVENT
+BEGIN:VEVENT
+UID:20041120-8549-innerjoin-org
+DTSTART;VALUE=DATE:20050504
+DTSTAMP;VALUE=DATE:20041120
+URL:
+ http://www.innerjoin.org/iCalendar/test-cases/sunbird-0-2/ical-dash-desc.txt
+SUMMARY:
+ Dash (rather than Comma) in the Description Field
+DESCRIPTION:
+ There are important words after this dash - see anything here or have the words gone?
+ORGANIZER;SENT-BY="mailto
+ :a@b.c":mailto:a@b.c
+END:VEVENT
+END:VCALENDAR';
+
+$ical->parseVCalendar($data);
+$event1 = $ical->getComponent(0);
+$event2 = $ical->getComponent(1);
+
+var_dump($event1->getAttributeValues('DESCRIPTION'),
+         $event2->getAttributeValues('DESCRIPTION'),
+         $event2->getAttributeValues('ORGANIZER'));
+
+?>
+--EXPECT--
+array(1) {
+  [0]=>
+  string(114) "There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?"
+}
+array(1) {
+  [0]=>
+  string(85) "There are important words after this dash - see anything here or have the words gone?"
+}
+array(1) {
+  [0]=>
+  string(12) "mailto:a@b.c"
+}
diff --git a/framework/Icalendar/test/Horde/Icalendar/read-vcard-org.phpt b/framework/Icalendar/test/Horde/Icalendar/read-vcard-org.phpt
new file mode 100644 (file)
index 0000000..ad2a8d5
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Test parsing of ORG fields.
+--FILE--
+<?php
+
+$data = 'BEGIN:VCARD
+VERSION:3.0
+FN:Test User
+ORG:My Organization;My Unit
+END:VCARD';
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+$ical->parseVCalendar($data);
+$card = $ical->getComponent(0);
+var_dump($card->getAttributeValues('ORG'));
+
+?>
+--EXPECT--
+array(2) {
+  [0]=>
+  string(15) "My Organization"
+  [1]=>
+  string(7) "My Unit"
+}
diff --git a/framework/Icalendar/test/Horde/Icalendar/read-write-escapes.phpt b/framework/Icalendar/test/Horde/Icalendar/read-write-escapes.phpt
new file mode 100644 (file)
index 0000000..72f99ea
--- /dev/null
@@ -0,0 +1,43 @@
+--TEST--
+Read/write values with proper escaping test
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$writeIcal = new Horde_Icalendar();
+$readIcal = new Horde_Icalendar();
+
+$event1 = Horde_Icalendar::newComponent('vevent', $writeIcal);
+$event2 = Horde_Icalendar::newComponent('vevent', $writeIcal);
+
+$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
+$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
+$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
+$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
+$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
+
+$event2->setAttribute('UID', '20041120-8549-innerjoin-org');
+$event2->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 4), array('VALUE' => 'DATE'));
+$event2->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
+$event2->setAttribute('SUMMARY', 'Dash (rather than Comma) in the Description Field');
+$event2->setAttribute('DESCRIPTION', 'There are important words after this dash - see anything here or have the words gone?');
+
+$writeIcal->addComponent($event1);
+$writeIcal->addComponent($event2);
+
+$readIcal->parseVCalendar($writeIcal->exportVCalendar());
+$event3 = $readIcal->getComponent(0);
+$event4 = $readIcal->getComponent(1);
+var_dump($event3->getAttributeValues('DESCRIPTION'));
+var_dump($event4->getAttributeValues('DESCRIPTION'));
+
+?>
+--EXPECT--
+array(1) {
+  [0]=>
+  string(114) "There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?"
+}
+array(1) {
+  [0]=>
+  string(85) "There are important words after this dash - see anything here or have the words gone?"
+}
diff --git a/framework/Icalendar/test/Horde/Icalendar/timezones.phpt b/framework/Icalendar/test/Horde/Icalendar/timezones.phpt
new file mode 100644 (file)
index 0000000..dc6fca8
--- /dev/null
@@ -0,0 +1,827 @@
+--TEST--
+Timezone handling
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+date_default_timezone_set('UTC');
+
+$test_files = glob(dirname(__FILE__) . '/fixtures/vTimezone/*.???');
+foreach ($test_files as $file) {
+    echo basename($file) . "\n";
+    $ical = new Horde_Icalendar();
+    $ical->parsevCalendar(file_get_contents($file));
+    foreach ($ical->getComponents() as $component) {
+        if ($component->getType() != 'vEvent') {
+            continue;
+        }
+        $date = $component->getAttribute('DTSTART');
+        if (is_array($date)) {
+            continue;
+        }
+        echo $component->getAttribute('SUMMARY') . "\n";
+        $d = new Horde_Date($date);
+        echo $d->format('H:i') . "\n";
+    }
+    echo "\n";
+}
+
+?>
+--EXPECT--
+AuthorChats.ics
+FAR Sexy Sunday Chat
+14:00
+Lady Aibell Chat
+15:00
+Lady Aibell Chat
+15:00
+FAR Sexy Sunday Chat
+14:00
+Sapphire Phelan's Birthday and She Wants to Party Chat
+01:00
+Bianca's Chat
+15:00
+Lady Aibell Chat @ Coffeetime Devin Group
+15:00
+Live Editor Chat
+00:00
+FAR Sexy Sunday Chat
+14:00
+Tammy Lee Author Live Chat
+18:00
+CPLLC Romance Authors @ Coffeetime
+15:00
+CPLLC Romance Authors @ Coffeetime
+15:00
+Ella Scopilo's Hump Day chat
+01:00
+
+MMMPseminar.ics
+Jack Murphy
+Trojan Horse or Proton Force: Finding the Right Partners for Toxin Translocation
+18:00
+Kai Matuschewski
+Hitting the Plasmodium Life Cycle Early On: Attenuated Liver Stages
+17:00
+Felix Rey
+Insights into the Mechanism of Membrane Fusion Derived from Structural Studies of Viral Envelope Proteins
+18:00
+Maurizio Del Poeta
+Sphingolipid-Mediated Fungal Pathogenesis
+18:00
+Jorge Galan
+Structure, Assembly, and Function of the Type III Secretion Injectisome
+18:00
+Don Ganem
+RNAi, MicroRNAs and Viral Infection
+18:00
+Barak Cohen
+Genomic Analysis of Natural Variation in Saccharomyces
+18:00
+Michael Ferguson
+The Structure and Biosynthesis of Trypanosome Surface Molecules:  Basic Science and Therapeutic Possiblities
+18:00
+James M. Musser
+Molecular Pathogenomics of Group A Streptococcus, the Flesh-Eater
+17:00
+Wayne Yokoyama
+Innate Responses to Viral Infections
+17:00
+Herbert \"Skip\" Virgin
+Host-Herpesvirus Standoff:  Good News From the Front in an Ancient Battle
+18:00
+New Event
+17:00
+Matthew Welch
+Exploitation of the Host Actin Cytoskeleton by Bacterial and Viral Pathogens
+17:00
+Theresa Koeher
+Virulence Gene Expression by Bacillus anthracis and Implications for the Host
+17:00
+Eduardo Groisman
+Regulatory Networks Controlling Bacterial Physiology and Virulence
+18:00
+Brendan Cormack
+Transcriptional Silencing and Adherence in the Yeast Pathogen Candida glabrata
+17:00
+Andrew Pekosz
+Intracellular Transport of Viral Proteins and Particles
+18:00
+
+Moon_Days.ics
+Standard Time resumes
+07:00
+New Moon
+16:05
+Full Moon
+03:13
+Full Moon
+12:58
+Full Moon
+00:25
+Autumnal Equinox
+04:03
+New Moon
+22:18
+Full Moon
+03:02
+New Moon
+11:45
+New Moon
+20:10
+Full Moon
+22:54
+Full Moon
+18:42
+New Moon
+14:01
+Full Moon
+13:57
+Summer Solstice
+12:26
+Full Moon
+05:45
+New Moon
+04:01
+New Moon
+04:31
+New Moon
+05:14
+
+ProjectCalendar.ics
+Code slush begins
+03:00
+String freeze
+03:00
+Calendar Test Day
+12:00
+Calendar QA Chat
+16:30
+Status Meeting
+16:00
+
+SpanishHolidays.ics
+
+allcategories.vcs
+NSS ISDC 2006
+04:00
+VSE Trailer Ohio State Tour
+12:00
+AIAA International Energy Conversion Conference
+04:00
+42nd AIAA/ASME/SAE/ASEE Joint Propulsion Conference
+04:00
+2006 Beam Power Challenge
+04:00
+2006 Tether Challenge
+04:00
+X PRIZE Cup Spaceflight Exposition
+04:00
+2007 Astronaut Glove Challenge: APRIL DATE TBD
+05:00
+2007 Regolith Excavation Challenge
+04:00
+2007 Personal Air Vehicle (PAV) Challenge: DATE TBD
+04:00
+2008 MoonROx (Moon Regolith Oxygen) Challenge
+04:00
+
+arsenal32FC.ics
+Sheffield Utd (2)0-0(4) Arsenal
+20:05
+Arsenal 5-3 Middlesbrough
+15:05
+West Ham Utd 0-0 Arsenal
+14:00
+Arsenal 2-1 Tottenham
+15:00
+Birmingham City 2-1 Arsenal
+14:00
+Carling Cup Final
+15:00
+Fulham 0-3 Arsenal
+14:00
+Leeds United 1-4 Arsenal
+16:05
+Barcelona 2-1 Arsenal
+18:45
+Manchester City 1-3 Arsenal
+18:45
+Arsenal 1-1 Aston Villa
+14:00
+River Plate 0-0 Arsenal
+17:00
+Weiz 0-5 Arsenal
+17:00
+Boreham Wood 0-4 Arsenal XI
+18:30
+Carling Cup Semi-Final (2)
+20:00
+Arsenal - Liverpool
+16:00
+Arsenal - Newcastle Utd
+15:00
+Arsenal 2-1 Bolton Wanderers
+15:00
+Charlton Athletic 1-3 Arsenal
+15:00
+F.A. Cup 4rth round
+15:00
+Southampton 1-1 Arsenal
+12:45
+Ritzing 2-5 Arsenal
+14:00
+Arsenal 3-0 Portsmouth
+15:00
+Beveren 0-0 Arsenal XI
+17:30
+Wolverhampton 1-3 Arsenal
+15:00
+Fulham - Arsenal
+19:45
+Hamburg - Arsenal
+18:45
+Champions League knockout round 2
+19:45
+Arsenal 3-2 Newcastle United
+19:00
+Arsenal 1-1 Manchester United
+15:05
+Arsenal 2-1 Manchester City
+16:05
+Arsenal 0-0 AFC Ajax
+19:45
+Arsenal 2-0 Lokomotiv Moscow
+19:45
+Arsenal (5)0-0(4) Manchester Utd
+14:00
+Lokomotiv Moscow 0-0 Arsenal
+16:30
+Arsenal 2-1 Chelsea
+14:00
+Manchester Utd 0-0 Arsenal
+15:05
+St Albans City 1-3 Arsenal XI
+18:30
+Chelsea 1-0 Arsenal
+15:00
+Manchester City 1-0 Arsenal
+16:15
+Arsenal 0-0 Manchester Utd
+20:00
+Blackburn Rovers 1-0 Arsenal
+15:00
+FC Porto - Arsenal
+19:45
+Bolton W 1-1 Arsenal
+15:00
+Aston Villa - Arsenal
+15:00
+Real Madrid 0-1 Arsenal
+19:45
+Arsenal 1-1 West Bromwich Albion
+15:00
+Bolton Wanderers 2-0 Arsenal
+15:00
+Manchester Utd - Arsenal
+15:00
+Arsenal - Reading
+15:00
+Arsenal 1-0 Manchester City
+14:00
+Arsenal - Chelsea
+14:00
+Champions League knockout round 2
+19:45
+AZ Alkmaar 0-3 Arsenal
+17:00
+Everton 1-4 Arsenal
+13:00
+Readling - Arsenal
+15:00
+Middlesbrough 2-1 Arsenal
+16:15
+Barnet 1-4 Arsenal
+14:00
+Champions League semi-final 1
+18:45
+CSKA Moscow - Arsenal
+16:30
+Arsenal 2-1 Ajax
+16:00
+Arsenal 1-0 Birmingham City
+12:30
+Arsenal 2-2 Southampton
+14:00
+Everton - Arsenal
+15:00
+Schwadorf 1-8 Arsenal
+15:00
+Celta de Vigo 2-3 Arsenal
+19:45
+Sheffield Utd - Arsenal
+15:00
+Arsenal 3-1 Everton
+19:45
+Arsenal 2-0 Newcastle
+12:30
+Arsenal 3-0 Charlton Athletic
+15:00
+Arsenal - Charlton Athletic
+15:00
+Arsenal - West Ham
+14:00
+Arsenal 2-1 Chelsea
+11:30
+Portsmouth 0-1 Arsenal
+16:05
+Arsenal 0-0 Real Madrid
+19:45
+F.A. Cup Semi-Final
+14:00
+Champions League semi-final 1
+18:45
+Arsenal 0-0 Fulham
+14:00
+Arsenal 2-1 Leicester City
+14:00
+Arsenal 3-1 Sunderland
+15:00
+Arsenal 1-0 Dynamo Kyiv
+19:45
+FC Utrecht 0-3 Arsenal
+16:00
+Chelsea 1-1 Arsenal
+19:45
+Manchester City 1-2 Arsenal
+15:05
+Man Utd 1-0 Arsenal
+19:45
+Arsenal 1-0 Blackburn Rovers
+14:00
+Wigan Athletic - Arsenal
+19:45
+Arsenal 3-0 Sparta Prague
+19:45
+Arsenal 1-1 Portsmouth
+14:00
+Arsenal 2-1 Dinamo Zagreb
+19:05
+Birmingham City 0-3 Arsenal
+15:00
+Champions League quarter-final 1
+18:45
+Barnet 0-0 Arsenal
+14:00
+Arsenal 2-2 Bolton Wanderers
+11:45
+Arsenal - Middlesbrough
+14:00
+Dynamo Kyiv 2-1 Arsenal
+18:45
+Arsenal 3-1 Aston Villa
+14:00
+Arsenal - Watford
+14:00
+Portsmouth 1-1 Arsenal
+19:00
+Sparta Prague 0-2 Arsenal
+18:45
+Bolton 0-1 Arsenal
+12:15
+Arsenal 1-1 Bolton Wanderers
+15:00
+Arsenal 3-0 Blackburn Rovers
+15:00
+Arsenal 3-1 ManUtd
+14:00
+Champions League semi-final 2
+18:45
+Arsenal - Wigan Athletic
+15:00
+Sunderland 0-3 Arsenal
+16:15
+Arsenal - Tottenham
+12:45
+Villarreal CF 0-0 Arsenal
+18:45
+Arsenal - Fulham
+14:00
+Arsenal 1-2 Chelsea
+18:45
+F.A. Cup 5th round
+15:00
+Arsenal 3-0 Reading
+19:45
+Arsenal 3-0 Blackburn Rovers
+11:15
+Liverpool 1-0 Arsenal
+20:00
+Ajax 0-0 Arsenal
+18:45
+Bolton Wanderers 1-0 Arsenal
+17:15
+Arsenal 2-1 Wigan Athletic
+19:45
+Aston Villa 0-0 Arsenal
+12:45
+Dinamo Zagreb 0-3 Arsenal
+19:05
+Newcastle Utd - Arsenal
+14:00
+Grazer AK 1-2 Arsenal
+16:00
+Carling Cup Semi-Final (1)
+20:00
+Everton 1-0 Arsenal
+12:45
+Porto 1-2 Arsenal
+16:30
+Bayern München 3-1 Arsenal
+19:45
+Arsenal 4-2 Liverpool
+11:30
+Arsenal 2-1 Liverpool
+16:00
+Barnet 1-10 Arsenal
+14:00
+Arsenal - Portsmouth
+15:00
+Watford - Arsenal
+17:30
+Arsenal 1(9)-1(8) Rotherham United
+19:45
+Manchester Utd 2-0 Arsenal
+15:05
+Aston Villa 0-2 Arsenal
+14:00
+Boreham Wood 2-6 Arsenal XI
+18:30
+Champions League quarter-final 2
+18:45
+Bolton 1-0 Arsenal
+17:40
+Champions League semi-final 2
+18:45
+West Bromwich Albion 0-2 Arsenal
+19:00
+Bolton Wanderers - Arsenal
+17:15
+Arsenal 1-1 Sheffield Utd
+12:30
+Arsenal - Blackburn Rovers
+15:00
+Carling Cup 3rd round
+19:00
+Arsenal 5-0 Aston Villa
+14:00
+Sunderland 0-3 Arsenal
+18:45
+Arsenal 2-1 Charlton Athletic
+15:00
+Arsenal 4-1 Middlesbrough
+15:00
+Arsenal 1-0 Newcastle
+16:05
+Arsenal 2-0 Fulham
+13:00
+KSK Beveren 2-2 Arsenal XI
+16:00
+Juventus 0-0 Arsenal
+18:45
+Arsenal 4-2 Wigan Athletic
+14:00
+Newcastle Utd 0-1 Arsenal
+20:00
+Manchester City 0-1 Arsenal
+14:00
+Middlesbrough 0-4 Arsenal
+14:00
+Champions League knockout round 1
+19:45
+Middlesbrough 0-4 Arsenal
+15:05
+Everton 1-1 Arsenal
+20:00
+Portsmouth - Arsenal
+14:00
+Tottenham Hotspur 1-1 Arsenal
+12:00
+Champions League quarter-final 2
+18:45
+Arsenal 3-0 Birmingham City
+15:00
+Arsenal 3-1 West Bromwich Albion
+14:00
+Leeds United 1-4 Arsenal
+15:00
+Arsenal 2-2 Chelsea
+16:05
+Carling Cup 4th round
+20:00
+NK Maribor 2-3 Arsenal
+17:30
+Barnet 0-0 Arsenal
+14:00
+Wigan Athletic 1-0 Arsenal
+19:45
+Norwich City 1-4 Arsenal
+16:15
+Portsmouth 1-5 Arsenal
+18:00
+Blackburn Rovers 0-2 Arsenal
+15:00
+Tottenham - Arsenal
+14:00
+Liverpool - Arsenal
+14:00
+Arsenal 2-1 FC Thun
+18:45
+Blackburn Rovers - Arsenal
+15:00
+Arsenal 3-0 Blackburn Rovers
+18:45
+Arsenal 2-0 Aston Villa
+18:45
+Middlesbrough - Arsenal
+15:00
+Arsenal 2-1 Cardiff City
+13:00
+Arsenal 3-1 Liverpool
+15:05
+Champions League quarter-final 1
+18:45
+Arsenal 0-1 Manchester Utd
+11:00
+Middlesbrough 0-1 Arsenal
+14:00
+FC Thun 0-1 Arsenal
+19:45
+Panathinaikos 2-2 Arsenal
+18:45
+West Ham Utd - Arsenal
+13:30
+Charlton Athletic 1-1 Arsenal
+14:00
+Arsenal - Everton
+14:00
+Arsenal 7-0 Middlesbrough
+15:00
+Newcastle Utd 0-0 Arsenal
+15:05
+PSV Eindhoven 1-1 Arsenal
+19:45
+Charlton Athletic - Arsenal
+14:00
+Arsenal 2-0 Juventus
+18:45
+F.A. Cup 6th round
+15:00
+Arsenal - Hamburg
+19:45
+Portsmouth 1-1 Arsenal
+19:00
+West Bromwich Albion 0-2 Arsenal
+20:00
+Champions League knockout round 1
+19:45
+Arsenal 1-1 Tottenham Hotspur
+11:45
+Arsenal 2-1 Stoke City
+14:00
+Birmingham City 0-2 Arsenal
+15:00
+Arsenal 2-0 Southampton
+19:45
+Arsenal 2-3 West Ham Utd
+20:00
+Arsenal 0-2 Chelsea
+16:00
+Southampton 0-1 Arsenal
+20:00
+Arsenal 1-1 Manchester City
+19:45
+Tottenham 2-2 Arsenal
+15:05
+Leicester City 1-1 Arsenal
+15:00
+Arsenal 4-1 Middlesbrough
+15:00
+Tottenham Hotspur 4-5 Arsenal
+12:00
+Arsenal 1-0 Tottenham Hotspur
+19:00
+Newcastle Utd 1-0 Arsenal
+17:15
+Arsenal 1(3)-1(4) ManUtd
+13:00
+Inter Milan 1-5 Arsenal
+19:45
+West Bromwich Albion 2-1 Arsenal
+14:00
+Blackburn Rovers 0-1 Arsenal
+12:45
+Manchester Utd 2-0 Arsenal
+15:00
+Austria Vienna 0-2 Arsenal
+18:00
+Arsenal 2-1 Everton
+14:00
+Arsenal 3-0 Wolverhampton W
+12:00
+AFC Ajax 1-2  Arsenal
+18:45
+Arsenal - Sheffield Utd
+14:00
+Manchester City 1-2 Arsenal
+18:45
+Arsenal 7-0 Everton
+19:00
+Crystal Palace 1-1 Arsenal
+17:15
+Arsenal 1-0 Besiktas
+17:00
+Arsenal - FC Porto
+18:45
+Rangers 0-3 Arsenal
+18:45
+Liverpool 2-1 Arsenal
+16:05
+Arsenal 1-0 PSV Eindhoven
+18:45
+Liverpool 1-2 Arsenal
+11:30
+Arsenal - Manchester Utd
+15:00
+Charlton Athletic 0-1 Arsenal
+12:45
+Arsenal 1-0 Bayern München
+19:45
+Arsenal 5-1 Rosenborg
+19:45
+Chelsea 2-1 Arsenal
+14:00
+Champions League Final
+18:45
+Arsenal 0-3 Inter Milan
+18:45
+Fulham 0-1 Arsenal
+15:05
+Arsenal 0-1 Middlesbrough
+19:45
+Arsenal - CSKA Moscow
+19:45
+Arsenal 1-1 Panathinaikos
+19:45
+Chelsea - Arsenal
+16:00
+Aston Villa 1-3 Arsenal
+17:15
+Arsenal 2-0 Celta de Vigo
+19:45
+Arsenal 5-0 Leeds
+19:00
+Arsenal 5-1 Crystal Palace
+20:00
+Fulham 0-4 Arsenal
+15:00
+Arsenal 4-0 Portsmouth
+19:45
+Arsenal - Manchester City
+19:45
+Ritzing 2-2 Arsenal
+18:00
+Arsenal 2-4 Manchester Utd
+20:00
+Arsenal - Bolton Wanderers
+14:00
+Arsenal 1-0 Villarreal CF
+18:45
+Arsenal 5-1 Wolverhampton W.
+19:45
+Celtic 1-1 Arsenal
+14:00
+F.A. Cup Final
+14:00
+Arsenal 2-0 Wolverhampton Wanderers
+15:00
+Peterborough 1-0 Arsenal XI
+18:30
+Arsenal 2-0 Everton
+19:00
+Arsenal 4-0 Charlton Athletic
+14:00
+Arsenal 4-1 Fulham
+18:45
+Chelsea 0-0 Arsenal
+19:00
+Doncaster Rovers 2-2P Arsenal
+19:45
+Sturm Graz 0-2 Arsenal
+16:30
+Rosenborg 1-1 Arsenal
+18:45
+Arsenal 6-0 England XI
+18:45
+Arsenal 4-1 Norwich City
+14:00
+Arsenal 0-0 Birmingham City
+11:30
+Middlesbrough 2-1 Arsenal
+20:00
+Ajax 0-1 Arsenal
+19:15
+Chelsea 1-2 Arsenal
+12:30
+Boreham Wood 1-1 Arsenal XI
+18:45
+Carling Cup 5th round
+20:00
+KSK Beveren 3-3 Arsenal XI
+18:30
+Wigan Athletic 2-3 Arsenal
+12:45
+F.A. Cup 3rd round
+15:00
+SV Mattersburg 1-2 Arsenal
+17:00
+
+events.ics
+test cet 2
+13:00
+
+exchange.ics
+internal final review of mmc site changes
+19:00
+
+exdate.ics
+
+iscw.ics
+Ontoweb Day http://nextwebgeneration.com/meetings/ontoweb5/
+13:30
+Ontoweb SIG day http://nextwebgeneration.com/meetings/ontoweb5/
+13:30
+Beach Barbeque
+00:00
+
+meeting.ics
+Updated: Webex Training - Encryption Push
+17:00
+
+privacy_events.ics
+Australian Smart Card Summit
+04:00
+SOCAP Australia 2006 Symposium
+03:30
+
+rfc2445.ics
+Bastille Day Party
+17:00
+Annual Employee Review
+16:30
+Laurel is in sensitivity awareness class.
+16:30
+Our Blissful Anniversary
+00:00
+XYZ Project Review
+13:30
+Calendaring Interoperability Planning Meeting
+12:30
+
+test.vcs
+2007 Astronaut Glove Challenge: APRIL DATE TBD
+05:00
+
+test4.vcs
+Chiefs vs. Buffalo @ Arrowhead Stadium
+19:00
+
+test_recurring.vcs
+XXXStriked out XXX
+09:00
+
+wicca.ics
+Wolf Moon
+10:32
+Snow Moon
+04:54
+Worm Moon
+20:58
+Pink Moon
+10:06
+Flower Moon
+20:18
+Strawberry Moon
+04:14
+Buck Moon
+11:00
+Sturgeon Moon
+17:53
+Harvest Moon
+02:01
+Hunter's Moon
+12:14
+Beaver Moon
+00:57
+Cold Moon
+16:15
diff --git a/framework/Icalendar/test/Horde/Icalendar/vcal20.phpt b/framework/Icalendar/test/Horde/Icalendar/vcal20.phpt
new file mode 100644 (file)
index 0000000..7543dd3
--- /dev/null
@@ -0,0 +1,321 @@
+--TEST--
+vCalendar 2.0 (iCalendar) test
+--FILE--
+<?php
+
+$data = <<<VCARD
+BEGIN:VCALENDAR
+PRODID:-//Google Inc//Google Calendar 70.9054//EN
+VERSION:2.0
+CALSCALE:GREGORIAN
+METHOD:PUBLISH
+X-WR-CALNAME:PEAR - PHP Extension and Application Repository
+X-WR-TIMEZONE:Atlantic/Reykjavik
+X-WR-CALDESC:pear.php.net activity calendar\, bug triage\, group meetings\,
+  qa\, conferences or similar
+BEGIN:VEVENT
+DTSTART:20081025T160000Z
+DTEND:20081025T210000Z
+DTSTAMP:20080819T092753Z
+UID:ntnrt4go4482q2trk18bt62c0o@google.com
+RECURRENCE-ID:20081025T160000Z
+CLASS:PUBLIC
+CREATED:20080306T002605Z
+DESCRIPTION:Bug Triage session\\n\\nNot been invited ? Want to attend ? Let u
+ s know and we'll add you!
+LAST-MODIFIED:20080718T204006Z
+LOCATION:#pear-bugs Efnet
+SEQUENCE:2
+STATUS:CONFIRMED
+SUMMARY:Bug Triage
+TRANSP:OPAQUE
+CATEGORIES:foo,bar,fuz buz,blah\, blah
+END:VEVENT
+END:VCALENDAR
+VCARD;
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+$ical->parsevCalendar($data);
+var_export($ical->getAllAttributes());
+echo "\n";
+$vevent = $ical->getComponent(0);
+var_export($vevent->getAllAttributes());
+
+?>
+--EXPECT--
+array (
+  0 => 
+  array (
+    'name' => 'PRODID',
+    'params' => 
+    array (
+    ),
+    'value' => '-//Google Inc//Google Calendar 70.9054//EN',
+    'values' => 
+    array (
+      0 => '-//Google Inc//Google Calendar 70.9054//EN',
+    ),
+  ),
+  1 => 
+  array (
+    'name' => 'VERSION',
+    'params' => 
+    array (
+    ),
+    'value' => '2.0',
+    'values' => 
+    array (
+      0 => '2.0',
+    ),
+  ),
+  2 => 
+  array (
+    'name' => 'CALSCALE',
+    'params' => 
+    array (
+    ),
+    'value' => 'GREGORIAN',
+    'values' => 
+    array (
+      0 => 'GREGORIAN',
+    ),
+  ),
+  3 => 
+  array (
+    'name' => 'METHOD',
+    'params' => 
+    array (
+    ),
+    'value' => 'PUBLISH',
+    'values' => 
+    array (
+      0 => 'PUBLISH',
+    ),
+  ),
+  4 => 
+  array (
+    'name' => 'X-WR-CALNAME',
+    'params' => 
+    array (
+    ),
+    'value' => 'PEAR - PHP Extension and Application Repository',
+    'values' => 
+    array (
+      0 => 'PEAR - PHP Extension and Application Repository',
+    ),
+  ),
+  5 => 
+  array (
+    'name' => 'X-WR-TIMEZONE',
+    'params' => 
+    array (
+    ),
+    'value' => 'Atlantic/Reykjavik',
+    'values' => 
+    array (
+      0 => 'Atlantic/Reykjavik',
+    ),
+  ),
+  6 => 
+  array (
+    'name' => 'X-WR-CALDESC',
+    'params' => 
+    array (
+    ),
+    'value' => 'pear.php.net activity calendar, bug triage, group meetings, qa, conferences or similar',
+    'values' => 
+    array (
+      0 => 'pear.php.net activity calendar, bug triage, group meetings, qa, conferences or similar',
+    ),
+  ),
+)
+array (
+  0 => 
+  array (
+    'name' => 'DTSTART',
+    'params' => 
+    array (
+    ),
+    'value' => 1224950400,
+    'values' => 
+    array (
+      0 => 1224950400,
+    ),
+  ),
+  1 => 
+  array (
+    'name' => 'DTEND',
+    'params' => 
+    array (
+    ),
+    'value' => 1224968400,
+    'values' => 
+    array (
+      0 => 1224968400,
+    ),
+  ),
+  2 => 
+  array (
+    'name' => 'DTSTAMP',
+    'params' => 
+    array (
+    ),
+    'value' => 1219138073,
+    'values' => 
+    array (
+      0 => 1219138073,
+    ),
+  ),
+  3 => 
+  array (
+    'name' => 'UID',
+    'params' => 
+    array (
+    ),
+    'value' => 'ntnrt4go4482q2trk18bt62c0o@google.com',
+    'values' => 
+    array (
+      0 => 'ntnrt4go4482q2trk18bt62c0o@google.com',
+    ),
+  ),
+  4 => 
+  array (
+    'name' => 'RECURRENCE-ID',
+    'params' => 
+    array (
+    ),
+    'value' => 1224950400,
+    'values' => 
+    array (
+      0 => 1224950400,
+    ),
+  ),
+  5 => 
+  array (
+    'name' => 'CLASS',
+    'params' => 
+    array (
+    ),
+    'value' => 'PUBLIC',
+    'values' => 
+    array (
+      0 => 'PUBLIC',
+    ),
+  ),
+  6 => 
+  array (
+    'name' => 'CREATED',
+    'params' => 
+    array (
+    ),
+    'value' => 1204763165,
+    'values' => 
+    array (
+      0 => 1204763165,
+    ),
+  ),
+  7 => 
+  array (
+    'name' => 'DESCRIPTION',
+    'params' => 
+    array (
+    ),
+    'value' => 'Bug Triage session
+
+Not been invited ? Want to attend ? Let us know and we\'ll add you!',
+    'values' => 
+    array (
+      0 => 'Bug Triage session
+
+Not been invited ? Want to attend ? Let us know and we\'ll add you!',
+    ),
+  ),
+  8 => 
+  array (
+    'name' => 'LAST-MODIFIED',
+    'params' => 
+    array (
+    ),
+    'value' => 1216413606,
+    'values' => 
+    array (
+      0 => 1216413606,
+    ),
+  ),
+  9 => 
+  array (
+    'name' => 'LOCATION',
+    'params' => 
+    array (
+    ),
+    'value' => '#pear-bugs Efnet',
+    'values' => 
+    array (
+      0 => '#pear-bugs Efnet',
+    ),
+  ),
+  10 => 
+  array (
+    'name' => 'SEQUENCE',
+    'params' => 
+    array (
+    ),
+    'value' => 2,
+    'values' => 
+    array (
+      0 => 2,
+    ),
+  ),
+  11 => 
+  array (
+    'name' => 'STATUS',
+    'params' => 
+    array (
+    ),
+    'value' => 'CONFIRMED',
+    'values' => 
+    array (
+      0 => 'CONFIRMED',
+    ),
+  ),
+  12 => 
+  array (
+    'name' => 'SUMMARY',
+    'params' => 
+    array (
+    ),
+    'value' => 'Bug Triage',
+    'values' => 
+    array (
+      0 => 'Bug Triage',
+    ),
+  ),
+  13 => 
+  array (
+    'name' => 'TRANSP',
+    'params' => 
+    array (
+    ),
+    'value' => 'OPAQUE',
+    'values' => 
+    array (
+      0 => 'OPAQUE',
+    ),
+  ),
+  14 => 
+  array (
+    'name' => 'CATEGORIES',
+    'params' => 
+    array (
+    ),
+    'value' => 'foo,bar,fuz buz,blah, blah',
+    'values' => 
+    array (
+      0 => 'foo',
+      1 => 'bar',
+      2 => 'fuz buz',
+      3 => 'blah, blah',
+    ),
+  ),
+)
diff --git a/framework/Icalendar/test/Horde/Icalendar/vfreebusy.phpt b/framework/Icalendar/test/Horde/Icalendar/vfreebusy.phpt
new file mode 100644 (file)
index 0000000..eb01d3c
--- /dev/null
@@ -0,0 +1,269 @@
+--TEST--
+Test parsing of vFreeBusy information.
+--FILE--
+<?php
+
+// Define BUSY periods 23.11.2006 from 5:00  to 6:00
+// and 8:00 with a duration of 2 hours
+
+$data = 'BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//proko2//freebusy 1.0//EN
+METHOD:PUBLISH
+BEGIN:VFREEBUSY
+ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
+DTSTAMP:20061122T230929Z
+DTSTART:20061122T230000Z
+DTEND:20070121T230000Z
+FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;
+ X-SUMMARY=dGVzdHRlcm1pbg==:20061123T050000Z/20061123T060000Z
+FREEBUSY:20061123T080000Z/PT2H
+END:VFREEBUSY
+END:VCALENDAR';
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+// Parse the data
+$ical->parseVCalendar($data);
+
+// Get the vFreeBusy component
+$vfb = $ical->getComponent(0);
+
+// Dump the type ("vFreebusy")
+var_dump($vfb->getType());
+
+// Dump the vfreebusy component again (the duration should be
+// converted to start/end
+var_dump($vfb->exportvCalendar());
+
+// Dump organizer name ("GunnarWrobel")
+var_dump($vfb->getName());
+
+// Dump organizer mail ("wrobel@demo2.pardus.de")
+var_dump($vfb->getEmail());
+
+// Dump busy periods (array with two entries)
+var_dump($vfb->getBusyPeriods());
+
+// Decode the summary information ("testtermin")
+$extra = $vfb->getExtraParams();
+var_dump(base64_decode($extra[1164258000]['X-SUMMARY']));
+
+// Dump the free periods in between the two given time stamps
+var_dump($vfb->getFreePeriods(1164261500, 1164268900));
+
+// Dump start of the free/busy information (1164236400)
+var_dump($vfb->getStart());
+
+// Dump end of the free/busy information (1164236400)
+var_dump($vfb->getEnd());
+
+// Free periods don't get added
+$vfb->addBusyPeriod('FREE',1164261600,1164268800);
+var_dump($vfb->getBusyPeriods());
+
+// Add a busy period with start/end (11:00 / 12:00)
+$vfb->addBusyPeriod('BUSY',1164279600,1164283200);
+
+// Add a busy period with start/duration (14:00 / 2h)
+$vfb->addBusyPeriod('BUSY',1164290400,null,7200, array('X-SUMMARY' => 'dGVzdA=='));
+
+// Dump busy periods (array with four entries)
+var_dump($vfb->getBusyPeriods());
+
+// Dump the extra parameters (array with four entries)
+var_dump($vfb->getExtraParams());
+
+// Create new freebusy object for merging
+$mfb = new Horde_Icalendar_Vfreebusy();
+// 1. 3:55 / 10 minutes; summary "test4"
+$mfb->addBusyPeriod('BUSY',1164254100,null,600, array('X-SUMMARY' => 'dGVzdDQ='));
+// 2. 4:00 / 1 hours 5 Minutes; summary "test3"
+$mfb->addBusyPeriod('BUSY',1164254400,null,3900, array('X-SUMMARY' => 'dGVzdDM='));
+// 3. 5:55 / 10 minutes hours; summary "test5"
+$mfb->addBusyPeriod('BUSY',1164261300,null,600, array('X-SUMMARY' => 'dGVzdDU=='));
+// 4. 7:55 / 10 min
+$mfb->addBusyPeriod('BUSY',1164268500,null,600);
+// 5. 9:55 / 10 min
+$mfb->addBusyPeriod('BUSY',1164275700,null,600);
+// 6. 11:00 / 4 hours; summary "test2"
+$mfb->addBusyPeriod('BUSY',1164279600,null,14400, array('X-SUMMARY' => 'dGVzdDI='));
+// 7. 14:00 / 2 min
+$mfb->addBusyPeriod('BUSY',1164290400,null,120);
+// 8. 14:30 / 5 min; summary "test3"
+$mfb->addBusyPeriod('BUSY',1164292200,null,300, array('X-SUMMARY' => 'dGVzdDM='));
+// 9. 15:55 / 5 min
+$mfb->addBusyPeriod('BUSY',1164297300,1164297600);
+
+// Dump busy periods (array with seven entries)
+var_dump($mfb->getBusyPeriods());
+
+$mfb->setAttribute('DTSTART', 1004297300);
+$mfb->setAttribute('DTEND', 1014297300);
+
+// Merge freebusy components without simplification
+$vfb->merge($mfb, false);
+
+var_dump($vfb->getAttribute('DTSTART'));
+var_dump($vfb->getAttribute('DTEND'));
+
+// Dump merged periods (array with eleven entries since there
+// are some entries having the same start time -> merged to
+// longer of the two)
+$busy = $vfb->getBusyPeriods();
+$extra = $vfb->getExtraParams();
+var_dump($busy);
+
+// Check merging process (should have selected longer period)
+// and dump extra information alongside
+//   4 hours (instead of 2 hours); summary "test"
+var_dump($busy[1164279600] - 1164279600);
+var_dump(base64_decode($extra[1164279600]['X-SUMMARY']));
+//   2 hours (instead of 2 minutes); summary "test2"
+var_dump($busy[1164290400] - 1164290400);
+var_dump(base64_decode($extra[1164290400]['X-SUMMARY']));
+
+// Merge freebusy components again, simplify this time
+$vfb->merge($mfb);
+
+// Dump merged periods (array with five entries)
+$busy =  $vfb->getBusyPeriods();
+$extra = $vfb->getExtraParams();
+
+// 1. 3:55 / 10 Minutes / test4
+print "Start:" . $vfb->_exportDateTime(1164254100) . " End:" . $vfb->_exportDateTime($busy[1164254100]) . " Summary:" . base64_decode($extra[1164254100]['X-SUMMARY']) . "\n";
+// 2. 4:05 / 1 hour / test3
+print "Start:" . $vfb->_exportDateTime(1164254700) . " End:" . $vfb->_exportDateTime($busy[1164254700]) . " Summary:" . base64_decode($extra[1164254700]['X-SUMMARY']) . "\n";
+// 3. 5:05 / 55 Minutes / testtermin
+print "Start:" . $vfb->_exportDateTime(1164258300) . " End:" . $vfb->_exportDateTime($busy[1164258300]) . " Summary:" . base64_decode($extra[1164258300]['X-SUMMARY']) . "\n";
+// 4. 6:00 / 5 Minutes / test5
+print "Start:" . $vfb->_exportDateTime(1164261600) . " End:" . $vfb->_exportDateTime($busy[1164261600]) . " Summary:" . base64_decode($extra[1164261600]['X-SUMMARY']) . "\n";
+// 5. 7:55 / 2 hours 10 Minutes
+print "Start:" . $vfb->_exportDateTime(1164268500) . " End:" . $vfb->_exportDateTime($busy[1164268500]) . " Summary:\n";
+// 6. 11:00 / 4 hours / test2
+print "Start:" . $vfb->_exportDateTime(1164279600) . " End:" . $vfb->_exportDateTime($busy[1164279600]) . " Summary:" . base64_decode($extra[1164279600]['X-SUMMARY']) . "\n";
+// 7. 15:00 / 1 hour / test
+print "Start:" . $vfb->_exportDateTime(1164294000) . " End:" . $vfb->_exportDateTime($busy[1164294000]) . " Summary:" . base64_decode($extra[1164294000]['X-SUMMARY']) . "\n";
+
+?>
+--EXPECT--
+string(9) "vFreebusy"
+string(334) "BEGIN:VFREEBUSY
+ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
+DTSTAMP:20061122T230929Z
+DTSTART:20061122T230000Z
+DTEND:20070121T230000Z
+FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;X-SUMMARY=dGVzd
+ HRlcm1pbg==:20061123T050000Z/20061123T060000Z
+FREEBUSY:20061123T080000Z/20061123T100000Z
+END:VFREEBUSY
+"
+string(12) "GunnarWrobel"
+string(22) "wrobel@demo2.pardus.de"
+array(2) {
+  [1164258000]=>
+  int(1164261600)
+  [1164268800]=>
+  int(1164276000)
+}
+string(10) "testtermin"
+array(1) {
+  [1164261600]=>
+  int(1164268800)
+}
+int(1164236400)
+int(1169420400)
+array(2) {
+  [1164258000]=>
+  int(1164261600)
+  [1164268800]=>
+  int(1164276000)
+}
+array(4) {
+  [1164258000]=>
+  int(1164261600)
+  [1164268800]=>
+  int(1164276000)
+  [1164279600]=>
+  int(1164283200)
+  [1164290400]=>
+  int(1164297600)
+}
+array(4) {
+  [1164258000]=>
+  array(2) {
+    ["X-UID"]=>
+    string(44) "MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ="
+    ["X-SUMMARY"]=>
+    string(16) "dGVzdHRlcm1pbg=="
+  }
+  [1164268800]=>
+  array(0) {
+  }
+  [1164279600]=>
+  array(0) {
+  }
+  [1164290400]=>
+  array(1) {
+    ["X-SUMMARY"]=>
+    string(8) "dGVzdA=="
+  }
+}
+array(9) {
+  [1164254100]=>
+  int(1164254700)
+  [1164254400]=>
+  int(1164258300)
+  [1164261300]=>
+  int(1164261900)
+  [1164268500]=>
+  int(1164269100)
+  [1164275700]=>
+  int(1164276300)
+  [1164279600]=>
+  int(1164294000)
+  [1164290400]=>
+  int(1164290520)
+  [1164292200]=>
+  int(1164292500)
+  [1164297300]=>
+  int(1164297600)
+}
+int(1004297300)
+int(1169420400)
+array(11) {
+  [1164258000]=>
+  int(1164261600)
+  [1164268800]=>
+  int(1164276000)
+  [1164279600]=>
+  int(1164294000)
+  [1164290400]=>
+  int(1164297600)
+  [1164254100]=>
+  int(1164254700)
+  [1164254400]=>
+  int(1164258300)
+  [1164261300]=>
+  int(1164261900)
+  [1164268500]=>
+  int(1164269100)
+  [1164275700]=>
+  int(1164276300)
+  [1164292200]=>
+  int(1164292500)
+  [1164297300]=>
+  int(1164297600)
+}
+int(14400)
+string(5) "test2"
+int(7200)
+string(4) "test"
+Start:20061123T035500Z End:20061123T040500Z Summary:test4
+Start:20061123T040500Z End:20061123T050500Z Summary:test3
+Start:20061123T050500Z End:20061123T060000Z Summary:testtermin
+Start:20061123T060000Z End:20061123T060500Z Summary:test5
+Start:20061123T075500Z End:20061123T100500Z Summary:
+Start:20061123T110000Z End:20061123T150000Z Summary:test2
+Start:20061123T150000Z End:20061123T160000Z Summary:test
diff --git a/framework/Icalendar/test/Horde/Icalendar/write-escapes.phpt b/framework/Icalendar/test/Horde/Icalendar/write-escapes.phpt
new file mode 100644 (file)
index 0000000..8a6b084
--- /dev/null
@@ -0,0 +1,51 @@
+--TEST--
+Write values with proper escaping test
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/common.php';
+$ical = new Horde_Icalendar();
+
+$event1 = Horde_Icalendar::newComponent('vevent', $ical);
+$event2 = Horde_Icalendar::newComponent('vevent', $ical);
+
+$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
+$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
+$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
+$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
+$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
+
+$event2->setAttribute('UID', '20041120-8549-innerjoin-org');
+$event2->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 4), array('VALUE' => 'DATE'));
+$event2->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
+$event2->setAttribute('SUMMARY', 'Dash (rather than Comma) in the Description Field');
+$event2->setAttribute('DESCRIPTION', 'There are important words after this dash - see anything here or have the words gone?');
+
+$ical->addComponent($event1);
+$ical->addComponent($event2);
+
+echo $ical->exportVCalendar();
+
+?>
+--EXPECT--
+BEGIN:VCALENDAR
+VERSION:2.0
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
+METHOD:PUBLISH
+BEGIN:VEVENT
+UID:20041120-8550-innerjoin-org
+DTSTART;VALUE=DATE:20050503
+DTSTAMP;VALUE=DATE:20041120
+SUMMARY:Escaped Comma in Description Field
+DESCRIPTION:There is a comma (escaped with a baskslash) in this sentence
+  and some important words after it\, see anything here?
+END:VEVENT
+BEGIN:VEVENT
+UID:20041120-8549-innerjoin-org
+DTSTART;VALUE=DATE:20050504
+DTSTAMP;VALUE=DATE:20041120
+SUMMARY:Dash (rather than Comma) in the Description Field
+DESCRIPTION:There are important words after this dash - see anything here
+  or have the words gone?
+END:VEVENT
+END:VCALENDAR
index 94ce53d..1de9466 100644 (file)
@@ -4,7 +4,7 @@
  */
 
 /* Load the iCal handling */
-require_once 'Horde/iCalendar.php';
+require_once 'Horde/Icalendar.php';
 
 /* Load MIME handlers */
 require_once 'Horde/MIME.php';
@@ -96,7 +96,7 @@ class Kolab_Filter_Outlook
             $email_domain = 'localhost';
         }
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->parsevCalendar($icaltxt);
         $vevent =& $iCal->findComponent('VEVENT');
         if ($vevent) {
index 7146a15..8b1287c 100644 (file)
@@ -44,7 +44,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
   * Extended iTip reply delivery to support different transport mechanisms.
   * Splitted Free/Busy functionality in a separate driver class.
   * kolab/issue4257 ("Always accept" policy doesn't set atendee status to
-    "accepted") 
+    "accepted")
   * kolab/issue3962 (Names of config variables for "untrusted" text missleading)
   * kolab/issue3967 (UNTRUSTED vs. UNAUTHENTICATED, distinction considered
     harmful)
@@ -196,7 +196,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <min>0.0.2</min>
    </package>
    <package>
-    <name>Horde_iCalendar</name>
+    <name>Icalendar</name>
     <channel>pear.horde.org</channel>
     <min>0.0.3</min>
    </package>
index 5fa0fbd..69d1274 100644 (file)
@@ -13,8 +13,8 @@ require_once 'Horde/Kolab/Test/Filter.php';
 require_once 'Horde.php';
 require_once 'Horde/Kolab/Resource.php';
 require_once 'Horde/Kolab/Filter/Incoming.php';
-require_once 'Horde/iCalendar.php';
-require_once 'Horde/iCalendar/vfreebusy.php';
+require_once 'Horde/Icalendar.php';
+require_once 'Horde/Icalendar/Vfreebusy.php';
 
 /**
  * Test resource handling
@@ -103,9 +103,9 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
     {
         $this->markTestIncomplete('Fails for unknown reason.');
 
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20081126T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -134,10 +134,10 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
     {
         $this->markTestIncomplete('Fails for unknown reason.');
 
-        require_once 'Horde/iCalendar/vfreebusy.php';
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+        require_once 'Horde/Icalendar/Vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20081126T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -168,10 +168,10 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
      */
     public function testWholeDayInvitation()
     {
-        require_once 'Horde/iCalendar/vfreebusy.php';
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20090401T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20090601T000000Z'));
+        require_once 'Horde/Icalendar/Vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20090401T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20090601T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -202,10 +202,10 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
      */
     public function testInvitationWithPlusAddressing()
     {
-        require_once 'Horde/iCalendar/vfreebusy.php';
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20090401T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20090601T000000Z'));
+        require_once 'Horde/Icalendar/Vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20090401T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20090601T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -236,9 +236,9 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
      */
     public function testRecurrenceNodefault()
     {
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20081126T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -258,9 +258,9 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
     {
         $this->markTestIncomplete('Fails for unknown reason.');
 
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20090901T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20091101T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20090901T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20091101T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -287,9 +287,9 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
      */
     public function testAllDay()
     {
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20090901T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20091101T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20090901T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20091101T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
@@ -320,10 +320,10 @@ class Horde_Kolab_Filter_ResourceTest extends Horde_Kolab_Test_Filter
     {
         $this->markTestIncomplete('Sends mail');
 
-        require_once 'Horde/iCalendar/vfreebusy.php';
-        $GLOBALS['KOLAB_FILTER_TESTING'] = &new Horde_iCalendar_vfreebusy();
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_iCalendar::_parseDateTime('20080926T000000Z'));
-        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_iCalendar::_parseDateTime('20081126T000000Z'));
+        require_once 'Horde/Icalendar/Vfreebusy.php';
+        $GLOBALS['KOLAB_FILTER_TESTING'] = new Horde_Icalendar_Vfreebusy();
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTSTART', Horde_Icalendar::_parseDateTime('20080926T000000Z'));
+        $GLOBALS['KOLAB_FILTER_TESTING']->setAttribute('DTEND', Horde_Icalendar::_parseDateTime('20081126T000000Z'));
 
         $params = array('unmodified_content' => true,
                         'incoming' => true);
index 8d135da..bf42cda 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 /** We require the iCalendar library to build the free/busy list */
-require_once 'Horde/iCalendar.php';
-require_once 'Horde/iCalendar/vfreebusy.php';
+require_once 'Horde/Icalendar.php';
+require_once 'Horde/Icalendar/Vfreebusy.php';
 
 /**
  * The Horde_Kolab_FreeBusy_Cache:: class provides functionality to store
@@ -191,7 +191,7 @@ class Horde_Kolab_FreeBusy_Cache {
      * @param boolean               $extended Should the data hold the extended
      *                                        free/busy information?
      *
-     * @return Horde_iCalendar|PEAR_Error The free/busy data of a
+     * @return Horde_Icalendar|PEAR_Error The free/busy data of a
      *                                    single calendar.
      */
     function &loadPartial(&$access, $extended)
@@ -297,7 +297,7 @@ class Horde_Kolab_FreeBusy_Cache {
                 Horde::logMessage($message, 'INFO');
             }
 
-            $rvCal = new Horde_iCalendar();
+            $rvCal = new Horde_Icalendar();
             $result = $rvCal->parsevCalendar($remote);
 
             if (is_a($result, 'PEAR_Error')) {
index 295e7e8..8dff13f 100644 (file)
@@ -87,12 +87,12 @@ class Horde_Kolab_FreeBusy_Driver_Freebusy_Base extends Horde_Kolab_FreeBusy_Dri
         }
 
         // Create the new iCalendar.
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
         $vCal->setAttribute('PRODID', '-//kolab.org//NONSGML Kolab Server 2//EN');
         $vCal->setAttribute('METHOD', 'PUBLISH');
 
         // Create new vFreebusy.
-        $vFb = &Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $params = array();
 
         $cn = $access->owner_object->get(Horde_Kolab_Server_Object_Kolab_User::ATTRIBUTE_CN);
index c10d607..aaac73b 100644 (file)
@@ -304,14 +304,14 @@ class Horde_Kolab_FreeBusy_Imap {
      * @param string  $user           Set organizer to this user.
      * @param string  $cn             Set the common name of this user.
      *
-     * @return Horde_iCalendar  The iCal object or a PEAR error.
+     * @return Horde_Icalendar  The iCal object or a PEAR error.
      */
     function &generate($startstamp = null, $endstamp = null,
                        $fbpast = 0, $fbfuture = 60,
                        $user = null, $cn = null)
     {
         /* Get the iCalendar library at this point */
-        require_once 'Horde/iCalendar.php';
+        require_once 'Horde/Icalendar.php';
 
         /* Default the start date to today. */
         if (is_null($startstamp)) {
@@ -347,12 +347,12 @@ class Horde_Kolab_FreeBusy_Imap {
         }
 
         /* Create the new iCalendar. */
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
         $vCal->setAttribute('PRODID', '-//kolab.org//NONSGML Kolab Server 2//EN');
         $vCal->setAttribute('METHOD', 'PUBLISH');
 
         /* Create new vFreebusy. */
-        $vFb = &Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $params = array();
         if ($cn) {
             $params['cn'] = $cn;
index 85cc25c..4930689 100644 (file)
@@ -62,7 +62,7 @@ class Horde_Kolab_FreeBusy_View_vfb extends Horde_Kolab_FreeBusy_View {
     /**
      * The free/busy data that should be displayed.
      *
-     * @var Horde_iCalendar
+     * @var Horde_Icalendar
      */
     var $_vfb;
 
@@ -76,7 +76,7 @@ class Horde_Kolab_FreeBusy_View_vfb extends Horde_Kolab_FreeBusy_View {
     /**
      * Constructor.
      *
-     * @param Horde_iCalendar $vfb The free/busy data to display.
+     * @param Horde_Icalendar $vfb The free/busy data to display.
      */
     function Horde_Kolab_FreeBusy_View_vfb(&$data)
     {
index f699b5c..029b634 100644 (file)
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>Horde_iCalendar</name>
+    <name>Icalendar</name>
     <channel>pear.horde.org</channel>
    </package>
    <package>
index 3f26240..623f3bb 100644 (file)
@@ -13,7 +13,7 @@
  */
 
 /** Load the iCal handling */
-require_once 'Horde/iCalendar.php';
+require_once 'Horde/Icalendar.php';
 
 /** Load MIME handlers */
 require_once 'Horde/MIME.php';
@@ -163,7 +163,7 @@ class Kolab_Resource
             if ($conttype == 'text/calendar') {
                 $part = $mime->getPart($mimeid);
 
-                $iCalendar = new Horde_iCalendar();
+                $iCalendar = new Horde_Icalendar();
                 $iCalendar->parsevCalendar($part->transferDecode());
 
                 return $iCalendar;
@@ -613,7 +613,7 @@ class Kolab_Resource
      * @param string  $cn                     Common name to be used in the iTip
      *                                        response.
      * @param string  $resource               Resource we send the reply for.
-     * @param string  $Horde_iCalendar_vevent The iTip information.
+     * @param string  $Horde_Icalendar_Vevent The iTip information.
      * @param int     $type                   Type of response.
      * @param string  $organiser              The event organiser.
      * @param string  $uid                    The UID of the event.
@@ -626,13 +626,13 @@ class Kolab_Resource
                                   $cn, $resource, get_class($itip), $type), 'DEBUG');
 
         // Build the reply.
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
         $vCal->setAttribute('PRODID', '-//kolab.org//NONSGML Kolab Server 2//EN');
         $vCal->setAttribute('METHOD', 'REPLY');
 
         $summary = _('No summary available');
 
-        $itip_reply =& Horde_iCalendar::newComponent('VEVENT', $vCal);
+        $itip_reply = Horde_Icalendar::newComponent('VEVENT', $vCal);
         $itip_reply->setAttribute('UID', $uid);
         if (!is_a($itip->getAttribute('SUMMARY'), 'PEAR_error')) {
             $itip_reply->setAttribute('SUMMARY', $itip->getAttribute('SUMMARY'));
index 8ba2806..e131499 100644 (file)
@@ -3,7 +3,7 @@
  * Provides methods to retrieve free/busy data for resources.
  *
  * PHP version 5
- * 
+ *
  * @todo Merge this class with Kolab_FreeBusy and Kronolith_FreeBusy into a
  *       single Horde_Freebusy handler.
  *
@@ -151,16 +151,16 @@ class Horde_Kolab_Resource_Freebusy
      * @param string $resource Fetch the Free/Busy data for this resource
      *                         (usually a mail address).
      *
-     * @return Horde_iCalendar_vfreebusy The Free/Busy data.
+     * @return Horde_Icalendar_vfreebusy The Free/Busy data.
      */
     public function get($resource)
     {
         /* Return an empty VFB object. */
-        $vCal = new Horde_iCalendar();
-        $vFb = Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $vCal = new Horde_Icalendar();
+        $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $vFb->setAttribute('ORGANIZER', $resource);
 
         return $vFb;
 
     }
-}
\ No newline at end of file
+}
index 0560bc5..23bfcc0 100644 (file)
@@ -50,7 +50,7 @@ class Horde_Kolab_Resource_Freebusy_Kolab extends Horde_Kolab_Resource_Freebusy
      *
      * @param string $resource Fetch the Free/Busy data for this resource.
      *
-     * @return Horde_iCalendar_vfreebusy The Free/Busy data.
+     * @return Horde_Icalendar_Vfreebusy The Free/Busy data.
      */
     public function get($resource)
     {
@@ -100,7 +100,7 @@ class Horde_Kolab_Resource_Freebusy_Kolab extends Horde_Kolab_Resource_Freebusy
             $charset = 'UTF-8';
         }
 
-        $iCal = new Horde_iCalendar;
+        $iCal = new Horde_Icalendar();
         $iCal->parsevCalendar($vfb_text, 'VCALENDAR', $charset);
 
         $vfb = &$iCal->findComponent('VFREEBUSY');
index 9169b05..75ba126 100644 (file)
@@ -46,10 +46,10 @@ class Horde_Kolab_Resource_Freebusy_Mock extends Horde_Kolab_Resource_Freebusy
      * @param string $resource Fetch the Free/Busy data for this resource
      *                         (usually a mail address).
      *
-     * @return Horde_iCalendar_vfreebusy The Free/Busy data.
+     * @return Horde_Icalendar_Vfreebusy The Free/Busy data.
      */
     public function get($resource)
     {
         return $this->_params['data'];
     }
-}
\ No newline at end of file
+}
index fea3697..9d0926a 100644 (file)
@@ -32,16 +32,16 @@ class Horde_Kolab_Resource_Itip
 {
 
     /**
-     * Reference to the iCalendar iTip object.
+     * Reference to the Icalendar iTip object.
      *
-     * @var Horde_iCalendar_vevent
+     * @var Horde_Icalendar_Vevent
      */
     private $_itip;
 
     /**
      * Constructor.
      *
-     * @param Horde_iCalendar_vevent $itip Reference to the iCalendar iTip object.
+     * @param Horde_Icalendar_Vevent $itip  An iCalendar iTip object.
      */
     public function __construct($itip)
     {
@@ -254,4 +254,4 @@ class Horde_Kolab_Resource_Itip
         }
     }
 
-}
\ No newline at end of file
+}
index 2b4694a..a2e6e0c 100644 (file)
@@ -92,7 +92,7 @@
     <min>0.0.2</min>
    </package>
    <package>
-    <name>Horde_iCalendar</name>
+    <name>Icalendar</name>
     <channel>pear.horde.org</channel>
     <min>0.0.3</min>
    </package>
index 4394cb0..c7c90e4 100644 (file)
@@ -69,7 +69,7 @@ class Horde_Mime_Viewer_Vcard extends Horde_Mime_Viewer_Base
         $import_msg = null;
         $title = _("vCard");
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         if (!$iCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
             $notification->push(_("There was an error reading the contact data."), 'horde.error');
         }
@@ -80,7 +80,7 @@ class Horde_Mime_Viewer_Vcard extends Horde_Mime_Viewer_Base
             $source = Horde_Util::getFormData('source');
             $count = 0;
             foreach ($iCal->getComponents() as $c) {
-                if ($c instanceof Horde_iCalendar_vcard) {
+                if ($c->getType() == 'vcard') {
                     try {
                         $contacts = $registry->call('contacts/import', array($c, null, $source));
                         ++$count;
@@ -207,23 +207,23 @@ class Horde_Mime_Viewer_Vcard extends Horde_Mime_Viewer_Base
                 } else {
                     $item['params']['TYPE'] = array_keys($item['params']);
                 }
+
                 $address = $item['values'];
                 $a = array();
-                if (isset($address[VCARD_ADR_STREET])) {
-                    $a[] = $address[VCARD_ADR_STREET];
-                }
-                if (isset($address[VCARD_ADR_LOCALITY])) {
-                    $a[] = $address[VCARD_ADR_LOCALITY];
-                }
-                if (isset($address[VCARD_ADR_REGION])) {
-                    $a[] = $address[VCARD_ADR_REGION];
-                }
-                if (isset($address[VCARD_ADR_POSTCODE])) {
-                    $a[] = $address[VCARD_ADR_POSTCODE];
-                }
-                if (isset($address[VCARD_ADR_COUNTRY])) {
-                    $a[] = $address[VCARD_ADR_COUNTRY];
+                $a_list = array(
+                    Horde_Icalendar_Vcard::ADR_STREET,
+                    Horde_Icalendar_Vcard::ADR_LOCALITY,
+                    Horde_Icalendar_Vcard::ADR_REGION,
+                    Horde_Icalendar_Vcard::ADR_POSTCODE,
+                    Horde_Icalendar_Vcard::ADR_COUNTRY
+                );
+
+                foreach ($a_list as $val) {
+                    if (isset($address[$val])) {
+                        $a[] = $address[$val];
+                    }
                 }
+
                 $types = array();
                 foreach ($item['params']['TYPE'] as $type) {
                     switch(Horde_String::upper($type)) {
index 757aef4..1a85f0c 100644 (file)
@@ -132,7 +132,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>iCalendar</name>
+    <name>Icalendar</name>
     <channel>pear.horde.org</channel>
    </package>
    <package>
index 93a121c..85b4210 100644 (file)
@@ -270,8 +270,8 @@ class SyncML_Device {
     function convertUTC2LocalTime($utc)
     {
         $dateParts = explode('T', $utc[0]);
-        $date = Horde_iCalendar::_parseDate($dateParts[0]);
-        $time = Horde_iCalendar::_parseTime($dateParts[1]);
+        $date = Horde_Icalendar::_parseDate($dateParts[0]);
+        $time = Horde_Icalendar::_parseTime($dateParts[1]);
 
         // We don't know the timezone so assume local timezone.
         $ts = @gmmktime($time['hour'], $time['minute'], $time['second'],
index 8f436b0..cef52c6 100644 (file)
@@ -7,7 +7,7 @@
 require_once 'Horde/Date.php';
 
 /** Horde_iCalendar */
-require_once 'Horde/iCalendar.php';
+require_once 'Horde/Icalendar.php';
 
 /**
  * Sync4j (www.sync4j.org)
@@ -224,12 +224,12 @@ class SyncML_Device_sync4j extends SyncML_Device {
     {
         $a = SyncML_Device_sync4j::sif2array($sif);
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->setAttribute('VERSION', '1.1');
         $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN');
         $iCal->setAttribute('METHOD', 'PUBLISH');
 
-        $vnote = &Horde_iCalendar::newComponent('vnote', $iCal);
+        $vnote = Horde_Icalendar::newComponent('vnote', $iCal);
         $vnote->setAttribute('BODY', isset($a['Body']) ? $a['Body'] : '');
         if (isset($a['Subject'])) {
             $vnote->setAttribute('SUMMARY', $a['Subject']);
@@ -245,12 +245,12 @@ class SyncML_Device_sync4j extends SyncML_Device {
     {
         $a = SyncML_Device_sync4j::sif2array($sif);
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->setAttribute('VERSION', '3.0');
         $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN');
         $iCal->setAttribute('METHOD', 'PUBLISH');
 
-        $vcard = &Horde_iCalendar::newComponent('vcard', $iCal);
+        $vcard = Horde_Icalendar::newComponent('vcard', $iCal);
 
         $map = array(
             'FileAs' => array('FN'),
@@ -295,44 +295,44 @@ class SyncML_Device_sync4j extends SyncML_Device {
         $map = array(
             array(
                 'N',
-                array(VCARD_N_FAMILY => 'LastName',
-                      VCARD_N_GIVEN  => 'FirstName',
-                      VCARD_N_ADDL   => 'MiddleName',
-                      VCARD_N_PREFIX => 'Title',
-                      VCARD_N_SUFFIX => 'Suffix'),
+                array(Horde_Icalendar_Vcard::N_FAMILY => 'LastName',
+                      Horde_Icalendar_Vcard::N_GIVEN  => 'FirstName',
+                      Horde_Icalendar_Vcard::N_ADDL   => 'MiddleName',
+                      Horde_Icalendar_Vcard::N_PREFIX => 'Title',
+                      Horde_Icalendar_Vcard::N_SUFFIX => 'Suffix'),
                 array(),
                 false),
             array(
                 'ADR',
-                array(VCARD_ADR_POB      => 'HomeAddressPostOfficeBox',
-                      VCARD_ADR_EXTEND   => '',
-                      VCARD_ADR_STREET   => 'HomeAddressStreet',
-                      VCARD_ADR_LOCALITY => 'HomeAddressCity',
-                      VCARD_ADR_REGION   => 'HomeAddressState',
-                      VCARD_ADR_POSTCODE => 'HomeAddressPostalCode',
-                      VCARD_ADR_COUNTRY  => 'HomeAddressCountry'),
+                array(Horde_Icalendar_Vcard::ADR_POB      => 'HomeAddressPostOfficeBox',
+                      Horde_Icalendar_Vcard::ADR_EXTEND   => '',
+                      Horde_Icalendar_Vcard::ADR_STREET   => 'HomeAddressStreet',
+                      Horde_Icalendar_Vcard::ADR_LOCALITY => 'HomeAddressCity',
+                      Horde_Icalendar_Vcard::ADR_REGION   => 'HomeAddressState',
+                      Horde_Icalendar_Vcard::ADR_POSTCODE => 'HomeAddressPostalCode',
+                      Horde_Icalendar_Vcard::ADR_COUNTRY  => 'HomeAddressCountry'),
                 array('TYPE' => 'HOME'),
                 true),
             array(
                 'ADR',
-                array(VCARD_ADR_POB      => 'BusinessAddressPostOfficeBox',
-                      VCARD_ADR_EXTEND   => '',
-                      VCARD_ADR_STREET   => 'BusinessAddressStreet',
-                      VCARD_ADR_LOCALITY => 'BusinessAddressCity',
-                      VCARD_ADR_REGION   => 'BusinessAddressState',
-                      VCARD_ADR_POSTCODE => 'BusinessAddressPostalCode',
-                      VCARD_ADR_COUNTRY  => 'BusinessAddressCountry'),
+                array(Horde_Icalendar_Vcard::ADR_POB      => 'BusinessAddressPostOfficeBox',
+                      Horde_Icalendar_Vcard::ADR_EXTEND   => '',
+                      Horde_Icalendar_Vcard::ADR_STREET   => 'BusinessAddressStreet',
+                      Horde_Icalendar_Vcard::ADR_LOCALITY => 'BusinessAddressCity',
+                      Horde_Icalendar_Vcard::ADR_REGION   => 'BusinessAddressState',
+                      Horde_Icalendar_Vcard::ADR_POSTCODE => 'BusinessAddressPostalCode',
+                      Horde_Icalendar_Vcard::ADR_COUNTRY  => 'BusinessAddressCountry'),
                 array('TYPE' => 'WORK'),
                 true),
             array(
                 'ADR',
-                array(VCARD_ADR_POB      => 'OtherAddressPostOfficeBox',
-                      VCARD_ADR_EXTEND   => '',
-                      VCARD_ADR_STREET   => 'OtherAddressStreet',
-                      VCARD_ADR_LOCALITY => 'OtherAddressCity',
-                      VCARD_ADR_REGION   => 'OtherAddressState',
-                      VCARD_ADR_POSTCODE => 'OtherAddressPostalCode',
-                      VCARD_ADR_COUNTRY  => 'OtherAddressCountry'),
+                array(Horde_Icalendar_Vcard::ADR_POB      => 'OtherAddressPostOfficeBox',
+                      Horde_Icalendar_Vcard::ADR_EXTEND   => '',
+                      Horde_Icalendar_Vcard::ADR_STREET   => 'OtherAddressStreet',
+                      Horde_Icalendar_Vcard::ADR_LOCALITY => 'OtherAddressCity',
+                      Horde_Icalendar_Vcard::ADR_REGION   => 'OtherAddressState',
+                      Horde_Icalendar_Vcard::ADR_POSTCODE => 'OtherAddressPostalCode',
+                      Horde_Icalendar_Vcard::ADR_COUNTRY  => 'OtherAddressCountry'),
                 array(),
                 true),
         );
@@ -369,11 +369,11 @@ class SyncML_Device_sync4j extends SyncML_Device {
     {
         $a = SyncML_Device_sync4j::sif2array($sif);
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN');
         $iCal->setAttribute('METHOD', 'PUBLISH');
 
-        $vEvent = &Horde_iCalendar::newComponent('vevent', $iCal);
+        $vEvent = Horde_Icalendar::newComponent('vevent', $iCal);
         $vEvent->setAttribute('DTSTAMP', time());
 
         $map = array('Subject' => 'SUMMARY',
@@ -546,11 +546,11 @@ class SyncML_Device_sync4j extends SyncML_Device {
     {
         $a = SyncML_Device_sync4j::sif2array($sif);
 
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         $iCal->setAttribute('PRODID', '-//The Horde Project//SyncML//EN');
         $iCal->setAttribute('METHOD', 'PUBLISH');
 
-        $vtodo = &Horde_iCalendar::newComponent('vtodo', $iCal);
+        $vtodo = Horde_Icalendar::newComponent('vtodo', $iCal);
 
         $vtodo->setAttribute('SUMMARY', $a['Subject']);
         $vtodo->setAttribute('DESCRIPTION', $a['Body']);
@@ -603,7 +603,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
     function vnote2sif($vnote)
     {
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         if (!$iCal->parsevCalendar($vnote)) {
             // handle plain text:
             $a = array('Body' => $vnote);
@@ -628,7 +628,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
     function vcard2sif($vcard)
     {
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         if (!$iCal->parsevCalendar($vcard)) {
             // @TODO: NEVER use die() in a library.
             die("There was an error importing the data.");
@@ -662,11 +662,11 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
             case 'N':
                 $name = $item['values'];
-                $hash['LastName'] = $name[VCARD_N_FAMILY];
-                $hash['FirstName'] = $name[VCARD_N_GIVEN];
-                $hash['MiddleName'] = $name[VCARD_N_ADDL];
-                $hash['Title'] = $name[VCARD_N_PREFIX];
-                $hash['Suffix'] = $name[VCARD_N_SUFFIX];
+                $hash['LastName'] = $name[Horde_Icalendar_Vcard::N_FAMILY];
+                $hash['FirstName'] = $name[Horde_Icalendar_Vcard::N_GIVEN];
+                $hash['MiddleName'] = $name[Horde_Icalendar_Vcard::N_ADDL];
+                $hash['Title'] = $name[Horde_Icalendar_Vcard::N_PREFIX];
+                $hash['Suffix'] = $name[Horde_Icalendar_Vcard::N_SUFFIX];
                 break;
 
             case 'NICKNAME':
@@ -706,28 +706,28 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
                     if ($prefix) {
                         $hash[$prefix . 'Street'] =
-                            isset($address[VCARD_ADR_STREET])
-                            ? $address[VCARD_ADR_STREET]
+                            isset($address[Horde_Icalendar_Vcard::ADR_STREET])
+                            ? $address[Horde_Icalendar_Vcard::ADR_STREET]
                             : null;
                         $hash[$prefix . 'City'] =
-                            isset($address[VCARD_ADR_LOCALITY])
-                            ? $address[VCARD_ADR_LOCALITY]
+                            isset($address[Horde_Icalendar_Vcard::ADR_LOCALITY])
+                            ? $address[Horde_Icalendar_Vcard::ADR_LOCALITY]
                             : null;
                         $hash[$prefix . 'State'] =
-                            isset($address[VCARD_ADR_REGION])
-                            ? $address[VCARD_ADR_REGION]
+                            isset($address[Horde_Icalendar_Vcard::ADR_REGION])
+                            ? $address[Horde_Icalendar_Vcard::ADR_REGION]
                             : null;
                         $hash[$prefix . 'PostalCode'] =
-                            isset($address[VCARD_ADR_POSTCODE])
-                            ? $address[VCARD_ADR_POSTCODE]
+                            isset($address[Horde_Icalendar_Vcard::ADR_POSTCODE])
+                            ? $address[Horde_Icalendar_Vcard::ADR_POSTCODE]
                             : null;
                         $hash[$prefix . 'Country'] =
-                            isset($address[VCARD_ADR_COUNTRY])
-                            ? $address[VCARD_ADR_COUNTRY]
+                            isset($address[Horde_Icalendar_Vcard::ADR_COUNTRY])
+                            ? $address[Horde_Icalendar_Vcard::ADR_COUNTRY]
                             : null;
                         $hash[$prefix . 'PostOfficeBox'] =
-                            isset($address[VCARD_ADR_POB])
-                            ? $address[VCARD_ADR_POB]
+                            isset($address[Horde_Icalendar_Vcard::ADR_POB])
+                            ? $address[Horde_Icalendar_Vcard::ADR_POB]
                             : null;
                     }
                 }
@@ -775,28 +775,28 @@ class SyncML_Device_sync4j extends SyncML_Device {
                 $email_set = false;
                 if (isset($item['params']['HOME']) && (!isset($hash['Email2Address']) ||
                     isset($item['params']['PREF']))) {
-                   $hash['Email2Address'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                   $hash['Email2Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                    $email_set = true;
-                } elseif (isset($item['params']['WORK']) && (!isset($hash['Email3Address']) || 
+                } elseif (isset($item['params']['WORK']) && (!isset($hash['Email3Address']) ||
                           isset($item['params']['PREF']))) {
-                   $hash['Email3Address'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                   $hash['Email3Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                    $email_set = true;
                 } elseif (isset($item['params']['TYPE'])) {
                    if (!is_array($item['params']['TYPE'])) {
                       $item['params']['TYPE'] = array($item['params']['TYPE']);
                    }
-                   if (in_array('HOME', $item['params']['TYPE']) && 
+                   if (in_array('HOME', $item['params']['TYPE']) &&
                        (!isset($hash['Email2Address']) || in_array('PREF', $item['params']['TYPE']))) {
-                      $hash['Email2Address'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                      $hash['Email2Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                       $email_set = true;
                    } elseif (in_array('WORK', $item['params']['TYPE']) &&
                              (!isset($hash['Email3Address']) || in_array('PREF', $item['params']['TYPE']))) {
-                      $hash['Email3Address'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                      $hash['Email3Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                       $email_set = true;
                    }
                 }
                 if (!$email_set && (!isset($hash['Email1Address']) || isset($item['params']['PREF']))) {
-                   $hash['Email1Address'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                   $hash['Email1Address'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                 }
                 break;
 
@@ -869,7 +869,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
             }
             // @TODO: else: handle case with DTEND= T240000
         }
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         if (!$iCal->parsevCalendar($vcard)) {
             // @TODO: NEVER use die() in a library.
             die("There was an error importing the data.");
@@ -910,7 +910,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
                                 $start['value']['year']);
             } else {
                 $hash['AllDayEvent'] = 0;
-                $hash['Start'] = Horde_iCalendar::_exportDateTime($start);
+                $hash['Start'] = Horde_Icalendar::_exportDateTime($start);
                 $start = $start;
             }
         }
@@ -938,7 +938,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
                     $end = $date->datestamp();
                 } else {
                     $hash['AllDayEvent'] = 0;
-                    $hash['End'] = Horde_iCalendar::_exportDateTime($item['value']);
+                    $hash['End'] = Horde_Icalendar::_exportDateTime($item['value']);
                     $end = $item['value'];
                 }
                 break;
@@ -1091,7 +1091,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
                         $d->correct();
                         $hash['Exceptions'][] = array('ExcludeDate' => $d->format('Y-m-d'));
                     } else {
-                        $hash['Exceptions'][] = array('ExcludeDate' => Horde_iCalendar::_exportDate($date));
+                        $hash['Exceptions'][] = array('ExcludeDate' => Horde_Icalendar::_exportDate($date));
                     }
                 }
                 break;
@@ -1104,7 +1104,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
             } else {
                 // Parse VALARM components.
                 foreach ($content->getComponents() as $component) {
-                    if (!is_a($component, 'Horde_iCalendar_valarm') ||
+                    if ($component->getType != 'vAlarm') ||
                         is_a($trigger = $component->getAttribute('TRIGGER'), 'PEAR_Error') ||
                         is_array($trigger) ||
                         empty($trigger)) {
@@ -1132,7 +1132,7 @@ class SyncML_Device_sync4j extends SyncML_Device {
 
     function vtodo2sif($vcard)
     {
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
         if (!$iCal->parsevCalendar($vcard)) {
             return PEAR::raiseError('There was an error importing the data.');
         }
@@ -1176,11 +1176,11 @@ class SyncML_Device_sync4j extends SyncML_Device {
                 break;
 
             case 'DTSTART':
-                $hash['StartDate'] = Horde_iCalendar::_exportDateTime($item['value']);
+                $hash['StartDate'] = Horde_Icalendar::_exportDateTime($item['value']);
                 break;
 
             case 'DUE':
-                $hash['DueDate'] = Horde_iCalendar::_exportDateTime($item['value']);
+                $hash['DueDate'] = Horde_Icalendar::_exportDateTime($item['value']);
                 $due = $item['value'];
                 break;
 
@@ -1218,14 +1218,14 @@ class SyncML_Device_sync4j extends SyncML_Device {
         if ($due && !isset($hash['ReminderSet'])) {
             // Parse VALARM components.
             foreach ($content->getComponents() as $component) {
-                if (!is_a($component, 'Horde_iCalendar_valarm') ||
+                if ($component->getType() != 'vAlarm' ||
                     is_a($trigger = $component->getAttribute('TRIGGER'), 'PEAR_Error') ||
                     is_array($trigger) ||
                     empty($trigger)) {
                     continue;
                 }
                 $hash['ReminderSet'] = 1;
-                $hash['ReminderTime'] = Horde_iCalendar::_exportDateTime($due - $trigger);
+                $hash['ReminderTime'] = Horde_Icalendar::_exportDateTime($due - $trigger);
             }
         }
 
index 53ef722..da1ab88 100644 (file)
@@ -98,7 +98,7 @@ class SyncML_Device_Synthesis extends SyncML_Device {
      */
     function UTC2LocalDate($s)
     {
-        $t = Horde_iCalendar::_parseDateTime($s);
+        $t = Horde_Icalendar::_parseDateTime($s);
         return date('Ymd', $t) . 'T000000';
     }
 }
index 36dc0e7..8c36b66 100644 (file)
@@ -17,7 +17,7 @@ $data = <<<EVENT
 BEGIN:VCALENDAR
 VERSION:2.0
 X-WR-CALNAME:cdillon's Calendar
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
 METHOD:PUBLISH
 BEGIN:VEVENT
 DTSTART:20080630T110000Z
diff --git a/framework/iCalendar/docs/examples/exchange.ics b/framework/iCalendar/docs/examples/exchange.ics
deleted file mode 100644 (file)
index b714cfb..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:Microsoft CDO for Microsoft Exchange
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:Eastern Time (US & Canada)
-X-MICROSOFT-CDO-TZID:10
-BEGIN:STANDARD
-DTSTART:16010101T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:16010101T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:20011115T211047Z
-DTSTART;TZID="Eastern Time (US & Canada)":20011116T140000
-SUMMARY:internal final review of mmc site changes
-UID:040000008200E00074C5B7101A82E00800000000B0549C15F06DC101000000000000000
-  0100000008BF784046BEC174CA6706A51BE3E8B33
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="MHMN002"
-:
-  MAILTO:MHMN002@bitgroup.com
-ORGANIZER;CN="Ann Cave":MAILTO:acave@bitgroup.com
-LOCATION:metcalfe
-DTEND;TZID="Eastern Time (US & Canada)":20011116T143000
-DESCRIPTION:Let's get together to finalize. Way to go team in the final hom
-  estretch!\N
-SEQUENCE:0
-PRIORITY:5
-CLASS:
-CREATED:20011115T212414Z
-LAST-MODIFIED:20011115T212414Z
-STATUS:CONFIRMED
-TRANSP:OPAQUE
-X-MICROSOFT-CDO-BUSYSTATUS:BUSY
-X-MICROSOFT-CDO-INSTTYPE:0
-X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
-X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
-X-MICROSOFT-CDO-IMPORTANCE:1
-BEGIN:VALARM
-ACTION:DISPLAY
-DESCRIPTION:REMINDER
-TRIGGER;RELATED=START:-PT00H15M00S
-END:VALARM
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/docs/examples/exdate.ics b/framework/iCalendar/docs/examples/exdate.ics
deleted file mode 100644 (file)
index 1b7644c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:Nasa History\r
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
-X-WR-RELCALID:7A58AF63-46A0-11D7-BCDE-000A95673266-CALP\r
-X-WR-TIMEZONE;VALUE=TEXT:US/Central\r
-CALSCALE:GREGORIAN\r
-BEGIN:VEVENT\r
-DURATION:P1D\r
-EXDATE;VALUE=DATE:20030428\r
-DTSTAMP:20030926T233021Z\r
-UID:D2924923-RID\r
-DTSTART;VALUE=DATE:20020428\r
-SUMMARY:(1961) Little Joe 5B\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4\r
-END:VEVENT\r
diff --git a/framework/iCalendar/docs/examples/ical.ics b/framework/iCalendar/docs/examples/ical.ics
deleted file mode 100644 (file)
index 6ed057e..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-BEGIN:VCALENDAR\r
-BEGIN:VEVENT\r
-DTSTART:19970714T170000Z\r
-DTEND:19970715T035959Z\r
-SUMMARY:Bastille Day Party\r
-END:VEVENT\r
-\r
-BEGIN:VEVENT\r
-DTSTAMP:19980309T231000Z\r
-UID:guid-1.host1.com\r
-ORGANIZER;ROLE=CHAIR:MAILTO:<EMAIL: PROTECTED>\r
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:MAILTO:<EMAIL: PROTECTED>\r
-DESCRIPTION:Project XYZ Review Meeting\r
-CATEGORIES:MEETING\r
-CLASS:PUBLIC\r
-CREATED:19980309T130000Z\r
-SUMMARY:XYZ Project Review\r
-DTSTART;TZID=US-Eastern:19980312T083000\r
-DTEND;TZID=US-Eastern:19980312T093000\r
-LOCATION:1CP Conference Room 4350\r
-END:VEVENT\r
-\r
-BEGIN:VTODO\r
-DTSTAMP:19980130T134500Z\r
-SEQUENCE:2\r
-UID:<EMAIL: PROTECTED>\r
-ORGANIZER:MAILTO:<EMAIL: PROTECTED>\r
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:<EMAIL: PROTECTED>\r
-DUE:19980415T235959\r
-STATUS:NEEDS-ACTION\r
-SUMMARY:Submit Income Taxes\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER;VALUE=DATE-TIME:19980403T120000\r
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-files/ssbanner.aud\r
-REPEAT:4\r
-DURATION:PT1H\r
-END:VALARM\r
-END:VTODO\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/docs/examples/parser.php b/framework/iCalendar/docs/examples/parser.php
deleted file mode 100755 (executable)
index ee4ab1f..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-#!/usr/bin/php
-<?php
-/**
- * Takes a filename on the command line and parses it, displaying what it
- * finds. Intended for use in debugging the iCalendar parser's behavior with
- * problem files or for adding new features.
- *
- * @package Horde_iCalendar
- */
-
-require_once 'Horde/Cli.php';
-require_once 'Horde/iCalendar.php';
-
-// This only works on the command line.
-if (!Horde_Cli::runningFromCLI()) {
-    exit("Must be run from the command line\n");
-}
-
-// Load the CLI environment - make sure there's no time limit, init
-// some variables, etc.
-$cli = Horde_Cli::init();
-
-if (empty($argv[1])) {
-    $cli->fatal('No file specified on the command line.');
-}
-
-$input_file = $argv[1];
-if (!file_exists($input_file)) {
-    $cli->fatal($input_file . ' does not exist.');
-}
-if (!is_readable($input_file)) {
-    $cli->fatal($input_file . ' is not readable.');
-}
-
-$cli->writeln($cli->blue('Parsing ' . $input_file . ' ...'));
-
-$data = file_get_contents($input_file);
-$ical = new Horde_iCalendar();
-if (!$ical->parseVCalendar($data)) {
-    $cli->fatal('iCalendar parsing failed.');
-}
-
-$cli->writeln($cli->green('Parsing successful, found ' . $ical->getComponentCount() . ' component(s).'));
-
-$components = $ical->getComponents();
-foreach ($components as $component) {
-    var_dump($component->toHash(true));
-}
diff --git a/framework/iCalendar/docs/examples/test_recurring.vcs b/framework/iCalendar/docs/examples/test_recurring.vcs
deleted file mode 100644 (file)
index 8d01f59..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-BEGIN:VCALENDAR
-X-LOTUS-CHARSET:UTF-8
-VERSION:2.0
-PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Central European
-BEGIN:STANDARD
-DTSTART:19501029T020000
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500326T020000
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID="Central European":20040417T110000
-DTEND;TZID="Central European":20040417T113000
-TRANSP:OPAQUE
-DTSTAMP:20040416T075254Z
-SEQUENCE:0
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="XXXX/UNSA"
- ;RSVP=FALSE:mailto:XXXX@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:XXXX1@XXXX.com
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="XXXX2";RSVP=TRUE:mailto:XXXX2@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="XXXX3";RSVP=TRUE:mailto:XXXX3@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:XXXX4@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:vljubovic@smartnet.ba
-CLASS:PUBLIC
-SUMMARY:XXXStriked out XXX
-ORGANIZER;CN="XXXX/UNSA":mailto:XXXX@XXXX.ba
-UID:59A47452891243FCC1256E78002B082C-Lotus_Notes_Generated
-X-LOTUS-BROADCAST:FALSE
-X-LOTUS-UPDATE-SEQ:1
-X-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1
-X-LOTUS-NOTESVERSION:2
-X-LOTUS-NOTICETYPE:I
-X-LOTUS-CHILD_UID:59A47452891243FCC1256E78002B082C
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/docs/examples/vnote.txt b/framework/iCalendar/docs/examples/vnote.txt
deleted file mode 100644 (file)
index 6bd5fd5..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-BEGIN:VNOTE\r
-VERSION:1.1\r
-DCREATED:20030523T192529Z\r
-LAST-MODIFIED:20030523T211027Z\r
-BODY;ENCODING=QUOTED-PRINTABLE:\r
-             food=0D=0Asoup=20540=0D=0Aduck=201690=0D=0Abeer=20590=0D=0A\r
-END:VNOTE\r
diff --git a/framework/iCalendar/iCalendar.php b/framework/iCalendar/iCalendar.php
deleted file mode 100644 (file)
index 874e7c7..0000000
+++ /dev/null
@@ -1,1490 +0,0 @@
-<?php
-/**
- * @package Horde_iCalendar
- */
-
-/**
- * Class representing iCalendar files.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vcalendar';
-
-    /**
-     * The parent (containing) iCalendar object.
-     *
-     * @var Horde_iCalendar
-     */
-    var $_container = false;
-
-    /**
-     * The name/value pairs of attributes for this object (UID,
-     * DTSTART, etc.). Which are present depends on the object and on
-     * what kind of component it is.
-     *
-     * @var array
-     */
-    var $_attributes = array();
-
-    /**
-     * Any children (contained) iCalendar components of this object.
-     *
-     * @var array
-     */
-    var $_components = array();
-
-    /**
-     * According to RFC 2425, we should always use CRLF-terminated lines.
-     *
-     * @var string
-     */
-    var $_newline = "\r\n";
-
-    /**
-     * iCalendar format version (different behavior for 1.0 and 2.0 especially
-     * with recurring events).
-     *
-     * @var string
-     */
-    var $version;
-
-    /**
-     * Whether entry is vcalendar 1.0, vcard 2.1 or vnote 1.1.
-     *
-     * These 'old' formats are defined by www.imc.org. The 'new' (non-old)
-     * formats icalendar 2.0 and vcard 3.0 are defined in rfc2426 and rfc2445
-     * respectively.
-     */
-    var $oldFormat = true;
-
-    function Horde_iCalendar($version = '2.0')
-    {
-        $this->setAttribute('VERSION', $version);
-    }
-
-    /**
-     * Return a reference to a new component.
-     *
-     * @param string          $type       The type of component to return
-     * @param Horde_iCalendar $container  A container that this component
-     *                                    will be associated with.
-     *
-     * @return object  Reference to a Horde_iCalendar_* object as specified.
-     *
-     * @static
-     */
-    function &newComponent($type, &$container)
-    {
-        $type = Horde_String::lower($type);
-        $class = 'Horde_iCalendar_' . $type;
-        if (!class_exists($class)) {
-            include 'Horde/iCalendar/' . $type . '.php';
-        }
-        if (class_exists($class)) {
-            $component = new $class();
-            if ($container !== false) {
-                $component->_container = &$container;
-                // Use version of container, not default set by component
-                // constructor.
-                $component->setVersion($container->version);
-            }
-        } else {
-            // Should return an dummy x-unknown type class here.
-            $component = false;
-        }
-
-        return $component;
-    }
-
-    /**
-     * Sets the version of this component.
-     *
-     * @see $version
-     * @see $oldFormat
-     *
-     * @param string  A float-like version string.
-     */
-    function setVersion($version)
-    {
-        $this->oldFormat = $version < 2;
-        $this->version = $version;
-    }
-
-    /**
-     * Sets the value of an attribute.
-     *
-     * @param string $name     The name of the attribute.
-     * @param string $value    The value of the attribute.
-     * @param array $params    Array containing any addition parameters for
-     *                         this attribute.
-     * @param boolean $append  True to append the attribute, False to replace
-     *                         the first matching attribute found.
-     * @param array $values    Array representation of $value.  For
-     *                         comma/semicolon seperated lists of values.  If
-     *                         not set use $value as single array element.
-     */
-    function setAttribute($name, $value, $params = array(), $append = true,
-                          $values = false)
-    {
-        // Make sure we update the internal format version if
-        // setAttribute('VERSION', ...) is called.
-        if ($name == 'VERSION') {
-            $this->setVersion($value);
-            if ($this->_container !== false) {
-                $this->_container->setVersion($value);
-            }
-        }
-
-        if (!$values) {
-            $values = array($value);
-        }
-        $found = false;
-        if (!$append) {
-            foreach (array_keys($this->_attributes) as $key) {
-                if ($this->_attributes[$key]['name'] == Horde_String::upper($name)) {
-                    $this->_attributes[$key]['params'] = $params;
-                    $this->_attributes[$key]['value'] = $value;
-                    $this->_attributes[$key]['values'] = $values;
-                    $found = true;
-                    break;
-                }
-            }
-        }
-
-        if ($append || !$found) {
-            $this->_attributes[] = array(
-                'name'      => Horde_String::upper($name),
-                'params'    => $params,
-                'value'     => $value,
-                'values'    => $values
-            );
-        }
-    }
-
-    /**
-     * Sets parameter(s) for an (already existing) attribute.  The
-     * parameter set is merged into the existing set.
-     *
-     * @param string $name   The name of the attribute.
-     * @param array $params  Array containing any additional parameters for
-     *                       this attribute.
-     * @return boolean  True on success, false if no attribute $name exists.
-     */
-    function setParameter($name, $params = array())
-    {
-        $keys = array_keys($this->_attributes);
-        foreach ($keys as $key) {
-            if ($this->_attributes[$key]['name'] == $name) {
-                $this->_attributes[$key]['params'] =
-                    array_merge($this->_attributes[$key]['params'], $params);
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    /**
-     * Get the value of an attribute.
-     *
-     * @param string $name     The name of the attribute.
-     * @param boolean $params  Return the parameters for this attribute instead
-     *                         of its value.
-     *
-     * @return mixed (object)  PEAR_Error if the attribute does not exist.
-     *               (string)  The value of the attribute.
-     *               (array)   The parameters for the attribute or
-     *                         multiple values for an attribute.
-     */
-    function getAttribute($name, $params = false)
-    {
-        $result = array();
-        foreach ($this->_attributes as $attribute) {
-            if ($attribute['name'] == $name) {
-                if ($params) {
-                    $result[] = $attribute['params'];
-                } else {
-                    $result[] = $attribute['value'];
-                }
-            }
-        }
-        if (!count($result)) {
-            return new PEAR_Error('Attribute "' . $name . '" Not Found');
-        } if (count($result) == 1 && !$params) {
-            return $result[0];
-        } else {
-            return $result;
-        }
-    }
-
-    /**
-     * Gets the values of an attribute as an array.  Multiple values
-     * are possible due to:
-     *
-     *  a) multiplce occurences of 'name'
-     *  b) (unsecapd) comma seperated lists.
-     *
-     * So for a vcard like "KEY:a,b\nKEY:c" getAttributesValues('KEY')
-     * will return array('a', 'b', 'c').
-     *
-     * @param string  $name    The name of the attribute.
-     * @return mixed (object)  PEAR_Error if the attribute does not exist.
-     *               (array)   Multiple values for an attribute.
-     */
-    function getAttributeValues($name)
-    {
-        $result = array();
-        foreach ($this->_attributes as $attribute) {
-            if ($attribute['name'] == $name) {
-                $result = array_merge($attribute['values'], $result);
-            }
-        }
-        if (!count($result)) {
-            return PEAR::raiseError('Attribute "' . $name . '" Not Found');
-        }
-        return $result;
-    }
-
-    /**
-     * Returns the value of an attribute, or a specified default value
-     * if the attribute does not exist.
-     *
-     * @param string $name    The name of the attribute.
-     * @param mixed $default  What to return if the attribute specified by
-     *                        $name does not exist.
-     *
-     * @return mixed (string) The value of $name.
-     *               (mixed)  $default if $name does not exist.
-     */
-    function getAttributeDefault($name, $default = '')
-    {
-        $value = $this->getAttribute($name);
-        return is_a($value, 'PEAR_Error') ? $default : $value;
-    }
-
-    /**
-     * Remove all occurences of an attribute.
-     *
-     * @param string $name  The name of the attribute.
-     */
-    function removeAttribute($name)
-    {
-        $keys = array_keys($this->_attributes);
-        foreach ($keys as $key) {
-            if ($this->_attributes[$key]['name'] == $name) {
-                unset($this->_attributes[$key]);
-            }
-        }
-    }
-
-    /**
-     * Get attributes for all tags or for a given tag.
-     *
-     * @param string $tag  Return attributes for this tag, or all attributes if
-     *                     not given.
-     *
-     * @return array  An array containing all the attributes and their types.
-     */
-    function getAllAttributes($tag = false)
-    {
-        if ($tag === false) {
-            return $this->_attributes;
-        }
-        $result = array();
-        foreach ($this->_attributes as $attribute) {
-            if ($attribute['name'] == $tag) {
-                $result[] = $attribute;
-            }
-        }
-        return $result;
-    }
-
-    /**
-     * Add a vCalendar component (eg vEvent, vTimezone, etc.).
-     *
-     * @param mixed  Either a Horde_iCalendar component (subclass) or an array
-     *               of them.
-     */
-    function addComponent($components)
-    {
-        if (!is_array($components)) {
-            $components = array($components);
-        }
-
-        foreach ($components as $component) {
-            if ($component instanceOf Horde_iCalendar) {
-                $component->_container = &$this;
-                $this->_components[] = $component;
-            }
-        }
-    }
-
-    /**
-     * Retrieve all the components.
-     *
-     * @return array  Array of Horde_iCalendar objects.
-     */
-    function getComponents()
-    {
-        return $this->_components;
-    }
-
-    function getType()
-    {
-        return $this->type;
-    }
-
-    /**
-     * Return the classes (entry types) we have.
-     *
-     * @return array  Hash with class names Horde_iCalendar_xxx as keys
-     *                and number of components of this class as value.
-     */
-    function getComponentClasses()
-    {
-        $r = array();
-        foreach ($this->_components as $c) {
-            $cn = strtolower(get_class($c));
-            if (empty($r[$cn])) {
-                $r[$cn] = 1;
-            } else {
-                $r[$cn]++;
-            }
-        }
-
-        return $r;
-    }
-
-    /**
-     * Number of components in this container.
-     *
-     * @return integer  Number of components in this container.
-     */
-    function getComponentCount()
-    {
-        return count($this->_components);
-    }
-
-    /**
-     * Retrieve a specific component.
-     *
-     * @param integer $idx  The index of the object to retrieve.
-     *
-     * @return mixed    (boolean) False if the index does not exist.
-     *                  (Horde_iCalendar_*) The requested component.
-     */
-    function getComponent($idx)
-    {
-        if (isset($this->_components[$idx])) {
-            return $this->_components[$idx];
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Locates the first child component of the specified class, and returns a
-     * reference to it.
-     *
-     * @param string $type  The type of component to find.
-     *
-     * @return boolean|Horde_iCalendar_*  False if no subcomponent of the
-     *                                    specified class exists or a reference
-     *                                    to the requested component.
-     */
-    function &findComponent($childclass)
-    {
-        $childclass = 'Horde_iCalendar_' . Horde_String::lower($childclass);
-        $keys = array_keys($this->_components);
-        foreach ($keys as $key) {
-            if (is_a($this->_components[$key], $childclass)) {
-                return $this->_components[$key];
-            }
-        }
-
-        $component = false;
-        return $component;
-    }
-
-    /**
-     * Locates the first matching child component of the specified class, and
-     * returns a reference to it.
-     *
-     * @param string $childclass  The type of component to find.
-     * @param string $attribute   This attribute must be set in the component
-     *                            for it to match.
-     * @param string $value       Optional value that $attribute must match.
-     *
-     * @return boolean|Horde_iCalendar_*  False if no matching subcomponent of
-     *                                    the specified class exists, or a
-     *                                    reference to the requested component.
-     */
-    function &findComponentByAttribute($childclass, $attribute, $value = null)
-    {
-        $childclass = 'Horde_iCalendar_' . Horde_String::lower($childclass);
-        $keys = array_keys($this->_components);
-        foreach ($keys as $key) {
-            if ($this->_components[$key] instanceOf $childclass) {
-                $attr = $this->_components[$key]->getAttribute($attribute);
-                if ($attr instanceOf PEAR_Error) {
-                    continue;
-                }
-                if ($value !== null && $value != $attr) {
-                    continue;
-                }
-                return $this->_components[$key];
-            }
-        }
-
-        $component = false;
-        return $component;
-    }
-
-    /**
-     * Clears the iCalendar object (resets the components and attributes
-     * arrays).
-     */
-    function clear()
-    {
-        $this->_components = array();
-        $this->_attributes = array();
-    }
-
-    /**
-     * @deprecated
-     */
-    function isOldFormat()
-    {
-        return $this->oldFormat;
-    }
-
-    /**
-     * Export as vCalendar format.
-     */
-    function exportvCalendar()
-    {
-        // Default values.
-        $requiredAttributes['PRODID'] = '-//The Horde Project//Horde_iCalendar Library' . (defined('HORDE_VERSION') ? ', Horde ' . constant('HORDE_VERSION') : '') . '//EN';
-        $requiredAttributes['METHOD'] = 'PUBLISH';
-
-        foreach ($requiredAttributes as $name => $default_value) {
-            if (is_a($this->getattribute($name), 'PEAR_Error')) {
-                $this->setAttribute($name, $default_value);
-            }
-        }
-
-        return $this->_exportvData('VCALENDAR');
-    }
-
-    /**
-     * Export this entry as a hash array with tag names as keys.
-     *
-     * @param boolean $paramsInKeys
-     *                If false, the operation can be quite lossy as the
-     *                parameters are ignored when building the array keys.
-     *                So if you export a vcard with
-     *                LABEL;TYPE=WORK:foo
-     *                LABEL;TYPE=HOME:bar
-     *                the resulting hash contains only one label field!
-     *                If set to true, array keys look like 'LABEL;TYPE=WORK'
-     * @return array  A hash array with tag names as keys.
-     */
-    function toHash($paramsInKeys = false)
-    {
-        $hash = array();
-        foreach ($this->_attributes as $a)  {
-            $k = $a['name'];
-            if ($paramsInKeys && is_array($a['params'])) {
-                foreach ($a['params'] as $p => $v) {
-                    $k .= ";$p=$v";
-                }
-            }
-            $hash[$k] = $a['value'];
-        }
-
-        return $hash;
-    }
-
-    /**
-     * Parses a string containing vCalendar data.
-     *
-     * @todo This method doesn't work well at all, if $base is VCARD.
-     *
-     * @param string $text     The data to parse.
-     * @param string $base     The type of the base object.
-     * @param string $charset  The encoding charset for $text. Defaults to
-     *                         utf-8 for new format, iso-8859-1 for old format.
-     * @param boolean $clear   If true clears the iCal object before parsing.
-     *
-     * @return boolean  True on successful import, false otherwise.
-     */
-    function parsevCalendar($text, $base = 'VCALENDAR', $charset = null,
-                            $clear = true)
-    {
-        if ($clear) {
-            $this->clear();
-        }
-        if (preg_match('/^BEGIN:' . $base . '(.*)^END:' . $base . '/ism', $text, $matches)) {
-            $container = true;
-            $vCal = $matches[1];
-        } else {
-            // Text isn't enclosed in BEGIN:VCALENDAR
-            // .. END:VCALENDAR. We'll try to parse it anyway.
-            $container = false;
-            $vCal = $text;
-        }
-        $vCal = trim($vCal);
-
-        // All subcomponents.
-        $matches = null;
-        if (preg_match_all('/^BEGIN:(.*)(\r\n|\r|\n)(.*)^END:\1/Uims', $vCal, $matches)) {
-            // vTimezone components are processed first. They are
-            // needed to process vEvents that may use a TZID.
-            foreach ($matches[0] as $key => $data) {
-                $type = trim($matches[1][$key]);
-                if ($type != 'VTIMEZONE') {
-                    continue;
-                }
-                $component = &Horde_iCalendar::newComponent($type, $this);
-                if ($component === false) {
-                    return PEAR::raiseError("Unable to create object for type $type");
-                }
-                $component->parsevCalendar($data, $type, $charset);
-
-                $this->addComponent($component);
-
-                // Remove from the vCalendar data.
-                $vCal = str_replace($data, '', $vCal);
-            }
-
-            // Now process the non-vTimezone components.
-            foreach ($matches[0] as $key => $data) {
-                $type = trim($matches[1][$key]);
-                if ($type == 'VTIMEZONE') {
-                    continue;
-                }
-                $component = &Horde_iCalendar::newComponent($type, $this);
-                if ($component === false) {
-                    return PEAR::raiseError("Unable to create object for type $type");
-                }
-                $component->parsevCalendar($data, $type, $charset);
-
-                $this->addComponent($component);
-
-                // Remove from the vCalendar data.
-                $vCal = str_replace($data, '', $vCal);
-            }
-        } elseif (!$container) {
-            return false;
-        }
-
-        // Unfold "quoted printable" folded lines like:
-        //  BODY;ENCODING=QUOTED-PRINTABLE:=
-        //  another=20line=
-        //  last=20line
-        while (preg_match_all('/^([^:]+;\s*(ENCODING=)?QUOTED-PRINTABLE(.*=\r?\n)+(.*[^=])?\r?\n)/mU', $vCal, $matches)) {
-            foreach ($matches[1] as $s) {
-                $r = preg_replace('/=\r?\n/', '', $s);
-                $vCal = str_replace($s, $r, $vCal);
-            }
-        }
-
-        // Unfold any folded lines.
-        if ($this->isOldFormat()) {
-            $vCal = preg_replace('/[\r\n]+([ \t])/', '$1', $vCal);
-        } else {
-            $vCal = preg_replace('/[\r\n]+[ \t]/', '', $vCal);
-        }
-
-        // Parse the remaining attributes.
-        if (preg_match_all('/^((?:[^":]+|(?:"[^"]*")+)*):([^\r\n]*)\r?$/m', $vCal, $matches)) {
-            foreach ($matches[0] as $attribute) {
-                preg_match('/([^;^:]*)((;(?:[^":]+|(?:"[^"]*")+)*)?):([^\r\n]*)[\r\n]*/', $attribute, $parts);
-                $tag = trim(Horde_String::upper($parts[1]));
-                $value = $parts[4];
-                $params = array();
-
-                // Parse parameters.
-                if (!empty($parts[2])) {
-                    preg_match_all('/;(([^;=]*)(=("[^"]*"|[^;]*))?)/', $parts[2], $param_parts);
-                    foreach ($param_parts[2] as $key => $paramName) {
-                        $paramName = Horde_String::upper($paramName);
-                        $paramValue = $param_parts[4][$key];
-                        if ($paramName == 'TYPE') {
-                            $paramValue = preg_split('/(?<!\\\\),/', $paramValue);
-                            if (count($paramValue) == 1) {
-                                $paramValue = $paramValue[0];
-                            }
-                        }
-                        if (preg_match('/"([^"]*)"/', $paramValue, $parts)) {
-                            $paramValue = $parts[1];
-                        }
-                        $params[$paramName] = $paramValue;
-                    }
-                }
-
-                // Charset and encoding handling.
-                if ((isset($params['ENCODING']) &&
-                     Horde_String::upper($params['ENCODING']) == 'QUOTED-PRINTABLE') ||
-                    isset($params['QUOTED-PRINTABLE'])) {
-
-                    $value = quoted_printable_decode($value);
-                    if (isset($params['CHARSET'])) {
-                        $value = Horde_String::convertCharset($value, $params['CHARSET']);
-                    } else {
-                        $value = Horde_String::convertCharset($value, empty($charset) ? ($this->oldFormat ? 'iso-8859-1' : 'utf-8') : $charset);
-                    }
-                } elseif (isset($params['CHARSET'])) {
-                    $value = Horde_String::convertCharset($value, $params['CHARSET']);
-                } else {
-                    // As per RFC 2279, assume UTF8 if we don't have an
-                    // explicit charset parameter.
-                    $value = Horde_String::convertCharset($value, empty($charset) ? ($this->oldFormat ? 'iso-8859-1' : 'utf-8') : $charset);
-                }
-
-                // Get timezone info for date fields from $params.
-                $tzid = isset($params['TZID']) ? trim($params['TZID'], '\"') : false;
-
-                switch ($tag) {
-                // Date fields.
-                case 'COMPLETED':
-                case 'CREATED':
-                case 'LAST-MODIFIED':
-                case 'X-MOZ-LASTACK':
-                case 'X-MOZ-SNOOZE-TIME':
-                    $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params);
-                    break;
-
-                case 'BDAY':
-                case 'X-ANNIVERSARY':
-                    $this->setAttribute($tag, $this->_parseDate($value), $params);
-                    break;
-
-                case 'DTEND':
-                case 'DTSTART':
-                case 'DTSTAMP':
-                case 'DUE':
-                case 'AALARM':
-                case 'RECURRENCE-ID':
-                    // types like AALARM may contain additional data after a ;
-                    // ignore these.
-                    $ts = explode(';', $value);
-                    if (isset($params['VALUE']) && $params['VALUE'] == 'DATE') {
-                        $this->setAttribute($tag, $this->_parseDate($ts[0]), $params);
-                    } else {
-                        $this->setAttribute($tag, $this->_parseDateTime($ts[0], $tzid), $params);
-                    }
-                    break;
-
-                case 'TRIGGER':
-                    if (isset($params['VALUE']) &&
-                        $params['VALUE'] == 'DATE-TIME') {
-                            $this->setAttribute($tag, $this->_parseDateTime($value, $tzid), $params);
-                    } else {
-                        $this->setAttribute($tag, $this->_parseDuration($value), $params);
-                    }
-                    break;
-
-                // Comma seperated dates.
-                case 'EXDATE':
-                case 'RDATE':
-                    $dates = array();
-                    preg_match_all('/,([^,]*)/', ',' . $value, $values);
-
-                    foreach ($values[1] as $value) {
-                        $dates[] = $this->_parseDate($value);
-                    }
-                    $this->setAttribute($tag, isset($dates[0]) ? $dates[0] : null, $params, true, $dates);
-                    break;
-
-                // Duration fields.
-                case 'DURATION':
-                    $this->setAttribute($tag, $this->_parseDuration($value), $params);
-                    break;
-
-                // Period of time fields.
-                case 'FREEBUSY':
-                    $periods = array();
-                    preg_match_all('/,([^,]*)/', ',' . $value, $values);
-                    foreach ($values[1] as $value) {
-                        $periods[] = $this->_parsePeriod($value);
-                    }
-
-                    $this->setAttribute($tag, isset($periods[0]) ? $periods[0] : null, $params, true, $periods);
-                    break;
-
-                // UTC offset fields.
-                case 'TZOFFSETFROM':
-                case 'TZOFFSETTO':
-                    $this->setAttribute($tag, $this->_parseUtcOffset($value), $params);
-                    break;
-
-                // Integer fields.
-                case 'PERCENT-COMPLETE':
-                case 'PRIORITY':
-                case 'REPEAT':
-                case 'SEQUENCE':
-                    $this->setAttribute($tag, intval($value), $params);
-                    break;
-
-                // Geo fields.
-                case 'GEO':
-                    if ($this->oldFormat) {
-                        $floats = explode(',', $value);
-                        $value = array('latitude' => floatval($floats[1]),
-                                       'longitude' => floatval($floats[0]));
-                    } else {
-                        $floats = explode(';', $value);
-                        $value = array('latitude' => floatval($floats[0]),
-                                       'longitude' => floatval($floats[1]));
-                    }
-                    $this->setAttribute($tag, $value, $params);
-                    break;
-
-                // Recursion fields.
-                case 'EXRULE':
-                case 'RRULE':
-                    $this->setAttribute($tag, trim($value), $params);
-                    break;
-
-                // ADR, ORG and N are lists seperated by unescaped semicolons
-                // with a specific number of slots.
-                case 'ADR':
-                case 'N':
-                case 'ORG':
-                    $value = trim($value);
-                    // As of rfc 2426 2.4.2 semicolon, comma, and colon must
-                    // be escaped (comma is unescaped after splitting below).
-                    $value = str_replace(array('\\n', '\\N', '\\;', '\\:'),
-                                         array($this->_newline, $this->_newline, ';', ':'),
-                                         $value);
-
-                    // Split by unescaped semicolons:
-                    $values = preg_split('/(?<!\\\\);/', $value);
-                    $value = str_replace('\\;', ';', $value);
-                    $values = str_replace('\\;', ';', $values);
-                    $this->setAttribute($tag, trim($value), $params, true, $values);
-                    break;
-
-                // String fields.
-                default:
-                    if ($this->oldFormat) {
-                        // vCalendar 1.0 and vCard 2.1 only escape semicolons
-                        // and use unescaped semicolons to create lists.
-                        $value = trim($value);
-                        // Split by unescaped semicolons:
-                        $values = preg_split('/(?<!\\\\);/', $value);
-                        $value = str_replace('\\;', ';', $value);
-                        $values = str_replace('\\;', ';', $values);
-                        $this->setAttribute($tag, trim($value), $params, true, $values);
-                    } else {
-                        $value = trim($value);
-                        // As of rfc 2426 2.4.2 semicolon, comma, and colon
-                        // must be escaped (comma is unescaped after splitting
-                        // below).
-                        $value = str_replace(array('\\n', '\\N', '\\;', '\\:', '\\\\'),
-                                             array($this->_newline, $this->_newline, ';', ':', '\\'),
-                                             $value);
-
-                        // Split by unescaped commas.
-                        $values = preg_split('/(?<!\\\\),/', $value);
-                        $value = str_replace('\\,', ',', $value);
-                        $values = str_replace('\\,', ',', $values);
-
-                        $this->setAttribute($tag, trim($value), $params, true, $values);
-                    }
-                    break;
-                }
-            }
-        }
-
-        return true;
-    }
-
-    /**
-     * Export this component in vCal format.
-     *
-     * @param string $base  The type of the base object.
-     *
-     * @return string  vCal format data.
-     */
-    function _exportvData($base = 'VCALENDAR')
-    {
-        $result = 'BEGIN:' . Horde_String::upper($base) . $this->_newline;
-
-        // VERSION is not allowed for entries enclosed in VCALENDAR/ICALENDAR,
-        // as it is part of the enclosing VCALENDAR/ICALENDAR. See rfc2445
-        if ($base !== 'VEVENT' && $base !== 'VTODO' && $base !== 'VALARM' &&
-            $base !== 'VJOURNAL' && $base !== 'VFREEBUSY') {
-            // Ensure that version is the first attribute.
-            $result .= 'VERSION:' . $this->version . $this->_newline;
-        }
-        foreach ($this->_attributes as $attribute) {
-            $name = $attribute['name'];
-            if ($name == 'VERSION') {
-                // Already done.
-                continue;
-            }
-
-            $params_str = '';
-            $params = $attribute['params'];
-            if ($params) {
-                foreach ($params as $param_name => $param_value) {
-                    /* Skip CHARSET for iCalendar 2.0 data, not allowed. */
-                    if ($param_name == 'CHARSET' && !$this->oldFormat) {
-                        continue;
-                    }
-                    /* Skip VALUE=DATE for vCalendar 1.0 data, not allowed. */
-                    if ($this->oldFormat &&
-                        $param_name == 'VALUE' && $param_value == 'DATE') {
-                        continue;
-                    }
-
-                    if ($param_value === null) {
-                        $params_str .= ";$param_name";
-                    } else {
-                        $len = strlen($param_value);
-                        $safe_value = '';
-                        $quote = false;
-                        for ($i = 0; $i < $len; ++$i) {
-                            $ord = ord($param_value[$i]);
-                            // Accept only valid characters.
-                            if ($ord == 9 || $ord == 32 || $ord == 33 ||
-                                ($ord >= 35 && $ord <= 126) ||
-                                $ord >= 128) {
-                                $safe_value .= $param_value[$i];
-                                // Characters above 128 do not need to be
-                                // quoted as per RFC2445 but Outlook requires
-                                // this.
-                                if ($ord == 44 || $ord == 58 || $ord == 59 ||
-                                    $ord >= 128) {
-                                    $quote = true;
-                                }
-                            }
-                        }
-                        if ($quote) {
-                            $safe_value = '"' . $safe_value . '"';
-                        }
-                        $params_str .= ";$param_name=$safe_value";
-                    }
-                }
-            }
-
-            $value = $attribute['value'];
-            switch ($name) {
-            // Date fields.
-            case 'COMPLETED':
-            case 'CREATED':
-            case 'DCREATED':
-            case 'LAST-MODIFIED':
-            case 'X-MOZ-LASTACK':
-            case 'X-MOZ-SNOOZE-TIME':
-                $value = $this->_exportDateTime($value);
-                break;
-
-            case 'DTEND':
-            case 'DTSTART':
-            case 'DTSTAMP':
-            case 'DUE':
-            case 'AALARM':
-            case 'RECURRENCE-ID':
-                if (isset($params['VALUE'])) {
-                    if ($params['VALUE'] == 'DATE') {
-                        // VCALENDAR 1.0 uses T000000 - T235959 for all day events:
-                        if ($this->oldFormat && $name == 'DTEND') {
-                            $d = new Horde_Date($value);
-                            $value = new Horde_Date(array(
-                                'year' => $d->year,
-                                'month' => $d->month,
-                                'mday' => $d->mday - 1));
-                            $value->correct();
-                            $value = $this->_exportDate($value, '235959');
-                        } else {
-                            $value = $this->_exportDate($value, '000000');
-                        }
-                    } else {
-                        $value = $this->_exportDateTime($value);
-                    }
-                } else {
-                    $value = $this->_exportDateTime($value);
-                }
-                break;
-
-            // Comma seperated dates.
-            case 'EXDATE':
-            case 'RDATE':
-                $dates = array();
-                foreach ($value as $date) {
-                    if (isset($params['VALUE'])) {
-                        if ($params['VALUE'] == 'DATE') {
-                            $dates[] = $this->_exportDate($date, '000000');
-                        } elseif ($params['VALUE'] == 'PERIOD') {
-                            $dates[] = $this->_exportPeriod($date);
-                        } else {
-                            $dates[] = $this->_exportDateTime($date);
-                        }
-                    } else {
-                        $dates[] = $this->_exportDateTime($date);
-                    }
-                }
-                $value = implode(',', $dates);
-                break;
-
-            case 'TRIGGER':
-                if (isset($params['VALUE'])) {
-                    if ($params['VALUE'] == 'DATE-TIME') {
-                        $value = $this->_exportDateTime($value);
-                    } elseif ($params['VALUE'] == 'DURATION') {
-                        $value = $this->_exportDuration($value);
-                    }
-                } else {
-                    $value = $this->_exportDuration($value);
-                }
-                break;
-
-            // Duration fields.
-            case 'DURATION':
-                $value = $this->_exportDuration($value);
-                break;
-
-            // Period of time fields.
-            case 'FREEBUSY':
-                $value_str = '';
-                foreach ($value as $period) {
-                    $value_str .= empty($value_str) ? '' : ',';
-                    $value_str .= $this->_exportPeriod($period);
-                }
-                $value = $value_str;
-                break;
-
-            // UTC offset fields.
-            case 'TZOFFSETFROM':
-            case 'TZOFFSETTO':
-                $value = $this->_exportUtcOffset($value);
-                break;
-
-            // Integer fields.
-            case 'PERCENT-COMPLETE':
-            case 'PRIORITY':
-            case 'REPEAT':
-            case 'SEQUENCE':
-                $value = "$value";
-                break;
-
-            // Geo fields.
-            case 'GEO':
-                if ($this->oldFormat) {
-                    $value = $value['longitude'] . ',' . $value['latitude'];
-                } else {
-                    $value = $value['latitude'] . ';' . $value['longitude'];
-                }
-                break;
-
-            // Recurrence fields.
-            case 'EXRULE':
-            case 'RRULE':
-                break;
-
-            default:
-                if ($this->oldFormat) {
-                    if (is_array($attribute['values']) &&
-                        count($attribute['values']) > 1) {
-                        $values = $attribute['values'];
-                        if ($name == 'N' || $name == 'ADR' || $name == 'ORG') {
-                            $glue = ';';
-                        } else {
-                            $glue = ',';
-                        }
-                        $values = str_replace(';', '\\;', $values);
-                        $value = implode($glue, $values);
-                    } else {
-                        /* vcard 2.1 and vcalendar 1.0 escape only
-                         * semicolons */
-                        $value = str_replace(';', '\\;', $value);
-                    }
-                    // Text containing newlines or ASCII >= 127 must be BASE64
-                    // or QUOTED-PRINTABLE encoded. Currently we use
-                    // QUOTED-PRINTABLE as default.
-                    if (preg_match("/[^\x20-\x7F]/", $value) &&
-                        empty($params['ENCODING']))  {
-                        $params['ENCODING'] = 'QUOTED-PRINTABLE';
-                        $params_str .= ';ENCODING=QUOTED-PRINTABLE';
-                        // Add CHARSET as well. At least the synthesis client
-                        // gets confused otherwise
-                        if (empty($params['CHARSET'])) {
-                            $params['CHARSET'] = $GLOBALS['registry']->getCharset();
-                            $params_str .= ';CHARSET=' . $params['CHARSET'];
-                        }
-                    }
-                } else {
-                    if (is_array($attribute['values']) &&
-                        count($attribute['values'])) {
-                        $values = $attribute['values'];
-                        if ($name == 'N' || $name == 'ADR' || $name == 'ORG') {
-                            $glue = ';';
-                        } else {
-                            $glue = ',';
-                        }
-                        // As of rfc 2426 2.5 semicolon and comma must be
-                        // escaped.
-                        $values = str_replace(array('\\', ';', ','),
-                                              array('\\\\', '\\;', '\\,'),
-                                              $values);
-                        $value = implode($glue, $values);
-                    } else {
-                        // As of rfc 2426 2.5 semicolon and comma must be
-                        // escaped.
-                        $value = str_replace(array('\\', ';', ','),
-                                             array('\\\\', '\\;', '\\,'),
-                                             $value);
-                    }
-                    $value = preg_replace('/\r?\n/', '\n', $value);
-                }
-                break;
-            }
-
-            $value = str_replace("\r", '', $value);
-            if (!empty($params['ENCODING']) &&
-                $params['ENCODING'] == 'QUOTED-PRINTABLE' &&
-                strlen(trim($value))) {
-                $result .= $name . $params_str . ':'
-                    . str_replace('=0A', '=0D=0A',
-                                  $this->_quotedPrintableEncode($value))
-                    . $this->_newline;
-            } else {
-                $attr_string = $name . $params_str . ':' . $value;
-                if (!$this->oldFormat) {
-                    $attr_string = Horde_String::wordwrap($attr_string, 75, $this->_newline . ' ',
-                                                    true, 'utf-8', true);
-                }
-                $result .= $attr_string . $this->_newline;
-            }
-        }
-
-        foreach ($this->_components as $component) {
-            $result .= $component->exportvCalendar();
-        }
-
-        return $result . 'END:' . $base . $this->_newline;
-    }
-
-    /**
-     * Parse a UTC Offset field.
-     */
-    function _parseUtcOffset($text)
-    {
-        $offset = array();
-        if (preg_match('/(\+|-)([0-9]{2})([0-9]{2})([0-9]{2})?/', $text, $timeParts)) {
-            $offset['ahead']  = (bool)($timeParts[1] == '+');
-            $offset['hour']   = intval($timeParts[2]);
-            $offset['minute'] = intval($timeParts[3]);
-            if (isset($timeParts[4])) {
-                $offset['second'] = intval($timeParts[4]);
-            }
-            return $offset;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Export a UTC Offset field.
-     */
-    function _exportUtcOffset($value)
-    {
-        $offset = $value['ahead'] ? '+' : '-';
-        $offset .= sprintf('%02d%02d',
-                           $value['hour'], $value['minute']);
-        if (isset($value['second'])) {
-            $offset .= sprintf('%02d', $value['second']);
-        }
-
-        return $offset;
-    }
-
-    /**
-     * Parse a Time Period field.
-     */
-    function _parsePeriod($text)
-    {
-        $periodParts = explode('/', $text);
-
-        $start = $this->_parseDateTime($periodParts[0]);
-
-        if ($duration = $this->_parseDuration($periodParts[1])) {
-            return array('start' => $start, 'duration' => $duration);
-        } elseif ($end = $this->_parseDateTime($periodParts[1])) {
-            return array('start' => $start, 'end' => $end);
-        }
-    }
-
-    /**
-     * Export a Time Period field.
-     */
-    function _exportPeriod($value)
-    {
-        $period = $this->_exportDateTime($value['start']);
-        $period .= '/';
-        if (isset($value['duration'])) {
-            $period .= $this->_exportDuration($value['duration']);
-        } else {
-            $period .= $this->_exportDateTime($value['end']);
-        }
-        return $period;
-    }
-
-    /**
-     * Grok the TZID and return an offset in seconds from UTC for this
-     * date and time.
-     */
-    function _parseTZID($date, $time, $tzid)
-    {
-        $vtimezone = $this->_container->findComponentByAttribute('vtimezone', 'TZID', $tzid);
-        if (!$vtimezone) {
-            return false;
-        }
-
-        $change_times = array();
-        foreach ($vtimezone->getComponents() as $o) {
-            $t = $vtimezone->parseChild($o, $date['year']);
-            if ($t !== false) {
-                $change_times[] = $t;
-            }
-        }
-
-        if (!$change_times) {
-            return false;
-        }
-
-        sort($change_times);
-
-        // Time is arbitrarily based on UTC for comparison.
-        $t = @gmmktime($time['hour'], $time['minute'], $time['second'],
-                       $date['month'], $date['mday'], $date['year']);
-
-        if ($t < $change_times[0]['time']) {
-            return $change_times[0]['from'];
-        }
-
-        for ($i = 0, $n = count($change_times); $i < $n - 1; $i++) {
-            if (($t >= $change_times[$i]['time']) &&
-                ($t < $change_times[$i + 1]['time'])) {
-                return $change_times[$i]['to'];
-            }
-        }
-
-        if ($t >= $change_times[$n - 1]['time']) {
-            return $change_times[$n - 1]['to'];
-        }
-
-        return false;
-    }
-
-    /**
-     * Parses a DateTime field and returns a unix timestamp. If the
-     * field cannot be parsed then the original text is returned
-     * unmodified.
-     *
-     * @todo This function should be moved to Horde_Date and made public.
-     */
-    function _parseDateTime($text, $tzid = false)
-    {
-        $dateParts = explode('T', $text);
-        if (count($dateParts) != 2 && !empty($text)) {
-            // Not a datetime field but may be just a date field.
-            if (!preg_match('/^(\d{4})-?(\d{2})-?(\d{2})$/', $text, $match)) {
-                // Or not
-                return $text;
-            }
-            $dateParts = array($text, '000000');
-        }
-
-        if (!$date = Horde_iCalendar::_parseDate($dateParts[0])) {
-            return $text;
-        }
-        if (!$time = Horde_iCalendar::_parseTime($dateParts[1])) {
-            return $text;
-        }
-
-        // Get timezone info for date fields from $tzid and container.
-        $tzoffset = ($time['zone'] == 'Local' && $tzid &&
-                     $this->_container instanceOf Horde_iCalendar)
-            ? $this->_parseTZID($date, $time, $tzid) : false;
-        if ($time['zone'] == 'UTC' || $tzoffset !== false) {
-            $result = @gmmktime($time['hour'], $time['minute'], $time['second'],
-                                $date['month'], $date['mday'], $date['year']);
-            if ($tzoffset) {
-                $result -= $tzoffset;
-            }
-        } else {
-            // We don't know the timezone so assume local timezone.
-            // FIXME: shouldn't this be based on the user's timezone
-            // preference rather than the server's timezone?
-            $result = @mktime($time['hour'], $time['minute'], $time['second'],
-                              $date['month'], $date['mday'], $date['year']);
-        }
-
-        return ($result !== false) ? $result : $text;
-    }
-
-    /**
-     * Export a DateTime field.
-     */
-    function _exportDateTime($value)
-    {
-        $temp = array();
-        if (!is_object($value) && !is_array($value)) {
-            $tz = date('O', $value);
-            $TZOffset = (3600 * substr($tz, 0, 3)) + (60 * substr(date('O', $value), 3, 2));
-            $value -= $TZOffset;
-
-            $temp['zone']   = 'UTC';
-            $temp['year']   = date('Y', $value);
-            $temp['month']  = date('n', $value);
-            $temp['mday']   = date('j', $value);
-            $temp['hour']   = date('G', $value);
-            $temp['minute'] = date('i', $value);
-            $temp['second'] = date('s', $value);
-        } else {
-            $dateOb = new Horde_Date($value);
-            return Horde_iCalendar::_exportDateTime($dateOb->timestamp());
-        }
-
-        return Horde_iCalendar::_exportDate($temp) . 'T' . Horde_iCalendar::_exportTime($temp);
-    }
-
-    /**
-     * Parses a Time field.
-     *
-     * @static
-     */
-    function _parseTime($text)
-    {
-        if (!preg_match('/([0-9]{2})([0-9]{2})([0-9]{2})(Z)?/', $text, $timeParts)) {
-            return false;
-        }
-
-        $time = array('hour' => $timeParts[1],
-                      'minute' => $timeParts[2],
-                      'second' => $timeParts[3]);
-        if (isset($timeParts[4])) {
-            $time['zone'] = 'UTC';
-        } else {
-            $time['zone'] = 'Local';
-        }
-
-        return $time;
-    }
-
-    /**
-     * Exports a Time field.
-     */
-    function _exportTime($value)
-    {
-        $time = sprintf('%02d%02d%02d',
-                        $value['hour'], $value['minute'], $value['second']);
-        if ($value['zone'] == 'UTC') {
-            $time .= 'Z';
-        }
-        return $time;
-    }
-
-    /**
-     * Parses a Date field.
-     *
-     * @static
-     */
-    function _parseDate($text)
-    {
-        $parts = explode('T', $text);
-        if (count($parts) == 2) {
-            $text = $parts[0];
-        }
-
-        if (!preg_match('/^(\d{4})-?(\d{2})-?(\d{2})$/', $text, $match)) {
-            return false;
-        }
-
-        return array('year' => $match[1],
-                     'month' => $match[2],
-                     'mday' => $match[3]);
-    }
-
-    /**
-     * Exports a date field.
-     *
-     * @param object|array $value  Date object or hash.
-     * @param string $autoconvert  If set, use this as time part to export the
-     *                             date as datetime when exporting to Vcalendar
-     *                             1.0. Examples: '000000' or '235959'
-     */
-    function _exportDate($value, $autoconvert = false)
-    {
-        if (is_object($value)) {
-            $value = array('year' => $value->year, 'month' => $value->month, 'mday' => $value->mday);
-        }
-        if ($autoconvert !== false && $this->oldFormat) {
-            return sprintf('%04d%02d%02dT%s', $value['year'], $value['month'], $value['mday'], $autoconvert);
-        } else {
-            return sprintf('%04d%02d%02d', $value['year'], $value['month'], $value['mday']);
-        }
-    }
-
-    /**
-     * Parse a Duration Value field.
-     */
-    function _parseDuration($text)
-    {
-        if (preg_match('/([+]?|[-])P(([0-9]+W)|([0-9]+D)|)(T(([0-9]+H)|([0-9]+M)|([0-9]+S))+)?/', trim($text), $durvalue)) {
-            // Weeks.
-            $duration = 7 * 86400 * intval($durvalue[3]);
-
-            if (count($durvalue) > 4) {
-                // Days.
-                $duration += 86400 * intval($durvalue[4]);
-            }
-            if (count($durvalue) > 5) {
-                // Hours.
-                $duration += 3600 * intval($durvalue[7]);
-
-                // Mins.
-                if (isset($durvalue[8])) {
-                    $duration += 60 * intval($durvalue[8]);
-                }
-
-                // Secs.
-                if (isset($durvalue[9])) {
-                    $duration += intval($durvalue[9]);
-                }
-            }
-
-            // Sign.
-            if ($durvalue[1] == "-") {
-                $duration *= -1;
-            }
-
-            return $duration;
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Export a duration value.
-     */
-    function _exportDuration($value)
-    {
-        $duration = '';
-        if ($value < 0) {
-            $value *= -1;
-            $duration .= '-';
-        }
-        $duration .= 'P';
-
-        $weeks = floor($value / (7 * 86400));
-        $value = $value % (7 * 86400);
-        if ($weeks) {
-            $duration .= $weeks . 'W';
-        }
-
-        $days = floor($value / (86400));
-        $value = $value % (86400);
-        if ($days) {
-            $duration .= $days . 'D';
-        }
-
-        if ($value) {
-            $duration .= 'T';
-
-            $hours = floor($value / 3600);
-            $value = $value % 3600;
-            if ($hours) {
-                $duration .= $hours . 'H';
-            }
-
-            $mins = floor($value / 60);
-            $value = $value % 60;
-            if ($mins) {
-                $duration .= $mins . 'M';
-            }
-
-            if ($value) {
-                $duration .= $value . 'S';
-            }
-        }
-
-        return $duration;
-    }
-
-    /**
-     * Converts an 8bit string to a quoted-printable string according to RFC
-     * 2045, section 6.7.
-     *
-     * imap_8bit() does not apply all necessary rules.
-     *
-     * @param string $input  The string to be encoded.
-     *
-     * @return string  The quoted-printable encoded string.
-     */
-    function _quotedPrintableEncode($input = '')
-    {
-        $output = $line = '';
-        $len = strlen($input);
-
-        for ($i = 0; $i < $len; ++$i) {
-            $ord = ord($input[$i]);
-            // Encode non-printable characters (rule 2).
-            if ($ord == 9 ||
-                ($ord >= 32 && $ord <= 60) ||
-                ($ord >= 62 && $ord <= 126)) {
-                $chunk = $input[$i];
-            } else {
-                // Quoted printable encoding (rule 1).
-                $chunk = '=' . Horde_String::upper(sprintf('%02X', $ord));
-            }
-            $line .= $chunk;
-            // Wrap long lines (rule 5)
-            if (strlen($line) + 1 > 76) {
-                $line = Horde_String::wordwrap($line, 75, "=\r\n", true, 'us-ascii', true);
-                $newline = strrchr($line, "\r\n");
-                if ($newline !== false) {
-                    $output .= substr($line, 0, -strlen($newline) + 2);
-                    $line = substr($newline, 2);
-                } else {
-                    $output .= $line;
-                }
-                continue;
-            }
-            // Wrap at line breaks for better readability (rule 4).
-            if (substr($line, -3) == '=0A') {
-                $output .= $line . "=\r\n";
-                $line = '';
-            }
-        }
-        $output .= $line;
-
-        // Trailing whitespace must be encoded (rule 3).
-        $lastpos = strlen($output) - 1;
-        if ($output[$lastpos] == chr(9) ||
-            $output[$lastpos] == chr(32)) {
-            $output[$lastpos] = '=';
-            $output .= Horde_String::upper(sprintf('%02X', ord($output[$lastpos])));
-        }
-
-        return $output;
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/valarm.php b/framework/iCalendar/iCalendar/valarm.php
deleted file mode 100644 (file)
index 6803c78..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Class representing vAlarms.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_valarm extends Horde_iCalendar
-{
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vAlarm';
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('VALARM');
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vcard.php b/framework/iCalendar/iCalendar/vcard.php
deleted file mode 100644 (file)
index bc4d333..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php
-// The following were shamelessly yoinked from Contact_Vcard_Build
-// Part numbers for N components.
-define('VCARD_N_FAMILY',     0);
-define('VCARD_N_GIVEN',      1);
-define('VCARD_N_ADDL',       2);
-define('VCARD_N_PREFIX',     3);
-define('VCARD_N_SUFFIX',     4);
-
-// Part numbers for ADR components.
-define('VCARD_ADR_POB',      0);
-define('VCARD_ADR_EXTEND',   1);
-define('VCARD_ADR_STREET',   2);
-define('VCARD_ADR_LOCALITY', 3);
-define('VCARD_ADR_REGION',   4);
-define('VCARD_ADR_POSTCODE', 5);
-define('VCARD_ADR_COUNTRY',  6);
-
-// Part numbers for GEO components.
-define('VCARD_GEO_LAT',      0);
-define('VCARD_GEO_LON',      1);
-
-/**
- * Class representing vCard entries.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Karsten Fourmont <karsten@horde.org>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vcard extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vcard';
-
-    function Horde_iCalendar_vcard($version = '2.1')
-    {
-        return parent::Horde_iCalendar($version);
-    }
-
-    /**
-     * Sets the version of this component.
-     *
-     * @see $version
-     * @see $oldFormat
-     *
-     * @param string  A float-like version string.
-     */
-    function setVersion($version)
-    {
-        $this->oldFormat = $version < 3;
-        $this->version = $version;
-    }
-
-    /**
-     * Unlike vevent and vtodo, a vcard is normally not enclosed in an
-     * iCalendar container. (BEGIN..END)
-     */
-    function exportvCalendar()
-    {
-        $requiredAttributes['VERSION'] = $this->version;
-        $requiredAttributes['N'] = ';;;;;;';
-        if ($this->version == '3.0') {
-            $requiredAttributes['FN'] = '';
-        }
-
-        foreach ($requiredAttributes as $name => $default_value) {
-            if (is_a($this->getAttribute($name), 'PEAR_Error')) {
-                $this->setAttribute($name, $default_value);
-            }
-        }
-
-        return $this->_exportvData('VCARD');
-    }
-
-    /**
-     * Returns the contents of the "N" tag as a printable Name:
-     * i.e. converts:
-     *
-     *   N:Duck;Dagobert;T;Professor;Sen.
-     * to
-     *   "Professor Dagobert T Duck Sen"
-     *
-     * @return string  Full name of vcard "N" tag or null if no N tag.
-     */
-    function printableName()
-    {
-        $name_parts = $this->getAttributeValues('N');
-        if (is_a($name_parts, 'PEAR_Error')) {
-            return null;
-        }
-
-        $name_arr = array();
-
-        if (!empty($name_parts[VCARD_N_PREFIX])) {
-            $name_arr[] = $name_parts[VCARD_N_PREFIX];
-        }
-        if (!empty($name_parts[VCARD_N_GIVEN])) {
-            $name_arr[] = $name_parts[VCARD_N_GIVEN];
-        }
-        if (!empty($name_parts[VCARD_N_ADDL])) {
-            $name_arr[] = $name_parts[VCARD_N_ADDL];
-        }
-        if (!empty($name_parts[VCARD_N_FAMILY])) {
-            $name_arr[] = $name_parts[VCARD_N_FAMILY];
-        }
-        if (!empty($name_parts[VCARD_N_SUFFIX])) {
-            $name_arr[] = $name_parts[VCARD_N_SUFFIX];
-        }
-
-        return implode(' ', $name_arr);
-    }
-
-    /**
-     * Static function to make a given email address rfc822 compliant.
-     *
-     * @param string $address  An email address.
-     *
-     * @return string  The RFC822-formatted email address.
-     */
-    static function getBareEmail($address)
-    {
-        // Empty values are still empty.
-        if (!$address) {
-            return $address;
-        }
-
-        $rfc822 = new Horde_Mail_Rfc822();
-        return $rfc822->validateMailbox($address)
-            ? Horde_Mime_Address::writeAddress($address->mailbox, $address->host)
-            : $address;
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vevent.php b/framework/iCalendar/iCalendar/vevent.php
deleted file mode 100644 (file)
index 3043c82..0000000
+++ /dev/null
@@ -1,227 +0,0 @@
-<?php
-/**
- * Class representing vEvents.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vevent extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vEvent';
-
-    function exportvCalendar()
-    {
-        // Default values.
-        $requiredAttributes = array();
-        $requiredAttributes['DTSTAMP'] = time();
-        $requiredAttributes['UID'] = strval(new Horde_Support_Uuid());
-
-        $method = !empty($this->_container) ?
-            $this->_container->getAttribute('METHOD') : 'PUBLISH';
-
-        switch ($method) {
-        case 'PUBLISH':
-            $requiredAttributes['DTSTART'] = time();
-            $requiredAttributes['SUMMARY'] = '';
-            break;
-
-        case 'REQUEST':
-            $requiredAttributes['ATTENDEE'] = '';
-            $requiredAttributes['DTSTART'] = time();
-            $requiredAttributes['SUMMARY'] = '';
-            break;
-
-        case 'REPLY':
-            $requiredAttributes['ATTENDEE'] = '';
-            break;
-
-        case 'ADD':
-            $requiredAttributes['DTSTART'] = time();
-            $requiredAttributes['SEQUENCE'] = 1;
-            $requiredAttributes['SUMMARY'] = '';
-            break;
-
-        case 'CANCEL':
-            $requiredAttributes['ATTENDEE'] = '';
-            $requiredAttributes['SEQUENCE'] = 1;
-            break;
-
-        case 'REFRESH':
-            $requiredAttributes['ATTENDEE'] = '';
-            break;
-        }
-
-        foreach ($requiredAttributes as $name => $default_value) {
-            if (is_a($this->getAttribute($name), 'PEAR_Error')) {
-                $this->setAttribute($name, $default_value);
-            }
-        }
-
-        return parent::_exportvData('VEVENT');
-    }
-
-    /**
-     * Update the status of an attendee of an event.
-     *
-     * @param $email    The email address of the attendee.
-     * @param $status   The participant status to set.
-     * @param $fullname The full name of the participant to set.
-     */
-    function updateAttendee($email, $status, $fullname = '')
-    {
-        foreach ($this->_attributes as $key => $attribute) {
-            if ($attribute['name'] == 'ATTENDEE' &&
-                $attribute['value'] == 'mailto:' . $email) {
-                $this->_attributes[$key]['params']['PARTSTAT'] = $status;
-                if (!empty($fullname)) {
-                    $this->_attributes[$key]['params']['CN'] = $fullname;
-                }
-                unset($this->_attributes[$key]['params']['RSVP']);
-                return;
-            }
-        }
-        $params = array('PARTSTAT' => $status);
-        if (!empty($fullname)) {
-            $params['CN'] = $fullname;
-        }
-        $this->setAttribute('ATTENDEE', 'mailto:' . $email, $params);
-    }
-
-    /**
-     * Return the organizer display name or email.
-     *
-     * @return string  The organizer name to display for this event.
-     */
-    function organizerName()
-    {
-        $organizer = $this->getAttribute('ORGANIZER', true);
-        if (is_a($organizer, 'PEAR_Error')) {
-            return _("An unknown person");
-        }
-
-        if (isset($organizer[0]['CN'])) {
-            return $organizer[0]['CN'];
-        }
-
-        $organizer = parse_url($this->getAttribute('ORGANIZER'));
-
-        return $organizer['path'];
-    }
-
-    /**
-     * Update this event with details from another event.
-     *
-     * @param Horde_iCalendar_vEvent $vevent  The vEvent with latest details.
-     */
-    function updateFromvEvent($vevent)
-    {
-        $newAttributes = $vevent->getAllAttributes();
-        foreach ($newAttributes as $newAttribute) {
-            $currentValue = $this->getAttribute($newAttribute['name']);
-            if (is_a($currentValue, 'PEAR_error')) {
-                // Already exists so just add it.
-                $this->setAttribute($newAttribute['name'],
-                                    $newAttribute['value'],
-                                    $newAttribute['params']);
-            } else {
-                // Already exists so locate and modify.
-                $found = false;
-
-                // Try matching the attribte name and value incase
-                // only the params changed (eg attendee updating
-                // status).
-                foreach ($this->_attributes as $id => $attr) {
-                    if ($attr['name'] == $newAttribute['name'] &&
-                        $attr['value'] == $newAttribute['value']) {
-                        // merge the params
-                        foreach ($newAttribute['params'] as $param_id => $param_name) {
-                            $this->_attributes[$id]['params'][$param_id] = $param_name;
-                        }
-                        $found = true;
-                        break;
-                    }
-                }
-                if (!$found) {
-                    // Else match the first attribute with the same
-                    // name (eg changing start time).
-                    foreach ($this->_attributes as $id => $attr) {
-                        if ($attr['name'] == $newAttribute['name']) {
-                            $this->_attributes[$id]['value'] = $newAttribute['value'];
-                            // Merge the params.
-                            foreach ($newAttribute['params'] as $param_id => $param_name) {
-                                $this->_attributes[$id]['params'][$param_id] = $param_name;
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    /**
-     * Update just the attendess of event with details from another
-     * event.
-     *
-     * @param Horde_iCalendar_vEvent $vevent  The vEvent with latest details
-     */
-    function updateAttendeesFromvEvent($vevent)
-    {
-        $newAttributes = $vevent->getAllAttributes();
-        foreach ($newAttributes as $newAttribute) {
-            if ($newAttribute['name'] != 'ATTENDEE') {
-                continue;
-            }
-            $currentValue = $this->getAttribute($newAttribute['name']);
-            if (is_a($currentValue, 'PEAR_error')) {
-                // Already exists so just add it.
-                $this->setAttribute($newAttribute['name'],
-                                    $newAttribute['value'],
-                                    $newAttribute['params']);
-            } else {
-                // Already exists so locate and modify.
-                $found = false;
-                // Try matching the attribte name and value incase
-                // only the params changed (eg attendee updating
-                // status).
-                foreach ($this->_attributes as $id => $attr) {
-                    if ($attr['name'] == $newAttribute['name'] &&
-                        $attr['value'] == $newAttribute['value']) {
-                        // Merge the params.
-                        foreach ($newAttribute['params'] as $param_id => $param_name) {
-                            $this->_attributes[$id]['params'][$param_id] = $param_name;
-                        }
-                        $found = true;
-                        break;
-                    }
-                }
-
-                if (!$found) {
-                    // Else match the first attribute with the same
-                    // name (eg changing start time).
-                    foreach ($this->_attributes as $id => $attr) {
-                        if ($attr['name'] == $newAttribute['name']) {
-                            $this->_attributes[$id]['value'] = $newAttribute['value'];
-                            // Merge the params.
-                            foreach ($newAttribute['params'] as $param_id => $param_name) {
-                                $this->_attributes[$id]['params'][$param_id] = $param_name;
-                            }
-                            break;
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vfreebusy.php b/framework/iCalendar/iCalendar/vfreebusy.php
deleted file mode 100644 (file)
index 730beef..0000000
+++ /dev/null
@@ -1,453 +0,0 @@
-<?php
-/**
- * Class representing vFreebusy components.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @todo Don't use timestamps
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vfreebusy extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vFreebusy';
-
-    var $_busyPeriods = array();
-    var $_extraParams = array();
-
-    /**
-     * Parses a string containing vFreebusy data.
-     *
-     * @param string $data     The data to parse.
-     */
-    function parsevCalendar($data, $type = null, $charset = null)
-    {
-        parent::parsevCalendar($data, 'VFREEBUSY', $charset);
-
-        // Do something with all the busy periods.
-        foreach ($this->_attributes as $key => $attribute) {
-            if ($attribute['name'] != 'FREEBUSY') {
-                continue;
-            }
-            foreach ($attribute['values'] as $value) {
-                $params = isset($attribute['params'])
-                    ? $attribute['params']
-                    : array();
-                if (isset($value['duration'])) {
-                    $this->addBusyPeriod('BUSY', $value['start'], null,
-                                         $value['duration'], $params);
-                } else {
-                    $this->addBusyPeriod('BUSY', $value['start'],
-                                         $value['end'], null, $params);
-                }
-            }
-            unset($this->_attributes[$key]);
-        }
-    }
-
-    /**
-     * Returns the component exported as string.
-     *
-     * @return string  The exported vFreeBusy information according to the
-     *                 iCalender format specification.
-     */
-    function exportvCalendar()
-    {
-        foreach ($this->_busyPeriods as $start => $end) {
-            $periods = array(array('start' => $start, 'end' => $end));
-            $this->setAttribute('FREEBUSY', $periods,
-                                isset($this->_extraParams[$start])
-                                ? $this->_extraParams[$start] : array());
-        }
-
-        $res = parent::_exportvData('VFREEBUSY');
-
-        foreach ($this->_attributes as $key => $attribute) {
-            if ($attribute['name'] == 'FREEBUSY') {
-                unset($this->_attributes[$key]);
-            }
-        }
-
-        return $res;
-    }
-
-    /**
-     * Returns a display name for this object.
-     *
-     * @return string  A clear text name for displaying this object.
-     */
-    function getName()
-    {
-        $name = '';
-        $method = !empty($this->_container) ?
-            $this->_container->getAttribute('METHOD') : 'PUBLISH';
-
-        if (is_a($method, 'PEAR_Error') || $method == 'PUBLISH') {
-            $attr = 'ORGANIZER';
-        } elseif ($method == 'REPLY') {
-            $attr = 'ATTENDEE';
-        }
-
-        $name = $this->getAttribute($attr, true);
-        if (!is_a($name, 'PEAR_Error') && isset($name[0]['CN'])) {
-            return $name[0]['CN'];
-        }
-
-        $name = $this->getAttribute($attr);
-        if (is_a($name, 'PEAR_Error')) {
-            return '';
-        } else {
-            $name = parse_url($name);
-            return $name['path'];
-        }
-    }
-
-    /**
-     * Returns the email address for this object.
-     *
-     * @return string  The email address of this object's owner.
-     */
-    function getEmail()
-    {
-        $name = '';
-        $method = !empty($this->_container)
-                  ? $this->_container->getAttribute('METHOD') : 'PUBLISH';
-
-        if (is_a($method, 'PEAR_Error') || $method == 'PUBLISH') {
-            $attr = 'ORGANIZER';
-        } elseif ($method == 'REPLY') {
-            $attr = 'ATTENDEE';
-        }
-
-        $name = $this->getAttribute($attr);
-        if (is_a($name, 'PEAR_Error')) {
-            return '';
-        } else {
-            $name = parse_url($name);
-            return $name['path'];
-        }
-    }
-
-    /**
-     * Returns the busy periods.
-     *
-     * @return array  All busy periods.
-     */
-    function getBusyPeriods()
-    {
-        return $this->_busyPeriods;
-    }
-
-    /**
-     * Returns any additional freebusy parameters.
-     *
-     * @return array  Additional parameters of the freebusy periods.
-     */
-    function getExtraParams()
-    {
-        return $this->_extraParams;
-    }
-
-    /**
-     * Returns all the free periods of time in a given period.
-     *
-     * @param integer $startStamp  The start timestamp.
-     * @param integer $endStamp    The end timestamp.
-     *
-     * @return array  A hash with free time periods, the start times as the
-     *                keys and the end times as the values.
-     */
-    function getFreePeriods($startStamp, $endStamp)
-    {
-        $this->simplify();
-        $periods = array();
-
-        // Check that we have data for some part of this period.
-        if ($this->getEnd() < $startStamp || $this->getStart() > $endStamp) {
-            return $periods;
-        }
-
-        // Locate the first time in the requested period we have data for.
-        $nextstart = max($startStamp, $this->getStart());
-
-        // Check each busy period and add free periods in between.
-        foreach ($this->_busyPeriods as $start => $end) {
-            if ($start <= $endStamp && $end >= $nextstart) {
-                if ($nextstart <= $start) {
-                    $periods[$nextstart] = min($start, $endStamp);
-                }
-                $nextstart = min($end, $endStamp);
-            }
-        }
-
-        // If we didn't read the end of the requested period but still have
-        // data then mark as free to the end of the period or available data.
-        if ($nextstart < $endStamp && $nextstart < $this->getEnd()) {
-            $periods[$nextstart] = min($this->getEnd(), $endStamp);
-        }
-
-        return $periods;
-    }
-
-    /**
-     * Adds a busy period to the info.
-     *
-     * This function may throw away data in case you add a period with a start
-     * date that already exists. The longer of the two periods will be chosen
-     * (and all information associated with the shorter one will be removed).
-     *
-     * @param string $type       The type of the period. Either 'FREE' or
-     *                           'BUSY'; only 'BUSY' supported at the moment.
-     * @param integer $start     The start timestamp of the period.
-     * @param integer $end       The end timestamp of the period.
-     * @param integer $duration  The duration of the period. If specified, the
-     *                           $end parameter will be ignored.
-     * @param array   $extra     Additional parameters for this busy period.
-     */
-    function addBusyPeriod($type, $start, $end = null, $duration = null,
-                           $extra = array())
-    {
-        if ($type == 'FREE') {
-            // Make sure this period is not marked as busy.
-            return false;
-        }
-
-        // Calculate the end time if duration was specified.
-        $tempEnd = is_null($duration) ? $end : $start + $duration;
-
-        // Make sure the period length is always positive.
-        $end = max($start, $tempEnd);
-        $start = min($start, $tempEnd);
-
-        if (isset($this->_busyPeriods[$start])) {
-            // Already a period starting at this time. Change the current
-            // period only if the new one is longer. This might be a problem
-            // if the callee assumes that there is no simplification going
-            // on. But since the periods are stored using the start time of
-            // the busy periods we have to throw away data here.
-            if ($end > $this->_busyPeriods[$start]) {
-                $this->_busyPeriods[$start] = $end;
-                $this->_extraParams[$start] = $extra;
-            }
-        } else {
-            // Add a new busy period.
-            $this->_busyPeriods[$start] = $end;
-            $this->_extraParams[$start] = $extra;
-        }
-
-        return true;
-    }
-
-    /**
-     * Returns the timestamp of the start of the time period this free busy
-     * information covers.
-     *
-     * @return integer  A timestamp.
-     */
-    function getStart()
-    {
-        if (!is_a($this->getAttribute('DTSTART'), 'PEAR_Error')) {
-            return $this->getAttribute('DTSTART');
-        } elseif (count($this->_busyPeriods)) {
-            return min(array_keys($this->_busyPeriods));
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Returns the timestamp of the end of the time period this free busy
-     * information covers.
-     *
-     * @return integer  A timestamp.
-     */
-    function getEnd()
-    {
-        if (!is_a($this->getAttribute('DTEND'), 'PEAR_Error')) {
-            return $this->getAttribute('DTEND');
-        } elseif (count($this->_busyPeriods)) {
-            return max(array_values($this->_busyPeriods));
-        } else {
-            return false;
-        }
-    }
-
-    /**
-     * Merges the busy periods of another Horde_iCalendar_vfreebusy object
-     * into this one.
-     *
-     * This might lead to simplification no matter what you specify for the
-     * "simplify" flag since periods with the same start date will lead to the
-     * shorter period being removed (see addBusyPeriod).
-     *
-     * @param Horde_iCalendar_vfreebusy $freebusy  A freebusy object.
-     * @param boolean $simplify                    If true, simplify() will
-     *                                             called after the merge.
-     */
-    function merge($freebusy, $simplify = true)
-    {
-        if (!is_a($freebusy, 'Horde_iCalendar_vfreebusy')) {
-            return false;
-        }
-
-        $extra = $freebusy->getExtraParams();
-        foreach ($freebusy->getBusyPeriods() as $start => $end) {
-            // This might simplify the busy periods without taking the
-            // "simplify" flag into account.
-            $this->addBusyPeriod('BUSY', $start, $end, null,
-                                 isset($extra[$start])
-                                 ? $extra[$start] : array());
-        }
-
-        $thisattr = $this->getAttribute('DTSTART');
-        $thatattr = $freebusy->getAttribute('DTSTART');
-        if (is_a($thisattr, 'PEAR_Error') && !is_a($thatattr, 'PEAR_Error')) {
-            $this->setAttribute('DTSTART', $thatattr, array(), false);
-        } elseif (!is_a($thatattr, 'PEAR_Error')) {
-            if ($thatattr < $thisattr) {
-                $this->setAttribute('DTSTART', $thatattr, array(), false);
-            }
-        }
-
-        $thisattr = $this->getAttribute('DTEND');
-        $thatattr = $freebusy->getAttribute('DTEND');
-        if (is_a($thisattr, 'PEAR_Error') && !is_a($thatattr, 'PEAR_Error')) {
-            $this->setAttribute('DTEND', $thatattr, array(), false);
-        } elseif (!is_a($thatattr, 'PEAR_Error')) {
-            if ($thatattr > $thisattr) {
-                $this->setAttribute('DTEND', $thatattr, array(), false);
-            }
-        }
-
-        if ($simplify) {
-            $this->simplify();
-        }
-
-        return true;
-    }
-
-    /**
-     * Removes all overlaps and simplifies the busy periods array as much as
-     * possible.
-     */
-    function simplify()
-    {
-        $clean = false;
-        $busy  = array($this->_busyPeriods, $this->_extraParams);
-        while (!$clean) {
-            $result = $this->_simplify($busy[0], $busy[1]);
-            $clean = $result === $busy;
-            $busy = $result;
-        }
-
-        ksort($result[1], SORT_NUMERIC);
-        $this->_extraParams = $result[1];
-
-        ksort($result[0], SORT_NUMERIC);
-        $this->_busyPeriods = $result[0];
-    }
-
-    function _simplify($busyPeriods, $extraParams = array())
-    {
-        $checked = array();
-        $checkedExtra = array();
-        $checkedEmpty = true;
-
-        foreach ($busyPeriods as $start => $end) {
-            if ($checkedEmpty) {
-                $checked[$start] = $end;
-                $checkedExtra[$start] = isset($extraParams[$start])
-                    ? $extraParams[$start] : array();
-                $checkedEmpty = false;
-            } else {
-                $added = false;
-                foreach ($checked as $testStart => $testEnd) {
-                    // Replace old period if the new period lies around the
-                    // old period.
-                    if ($start <= $testStart && $end >= $testEnd) {
-                        // Remove old period entry.
-                        unset($checked[$testStart]);
-                        unset($checkedExtra[$testStart]);
-                        // Add replacing entry.
-                        $checked[$start] = $end;
-                        $checkedExtra[$start] = isset($extraParams[$start])
-                            ? $extraParams[$start] : array();
-                        $added = true;
-                    } elseif ($start >= $testStart && $end <= $testEnd) {
-                        // The new period lies fully within the old
-                        // period. Just forget about it.
-                        $added = true;
-                    } elseif (($end <= $testEnd && $end >= $testStart) ||
-                              ($start >= $testStart && $start <= $testEnd)) {
-                        // Now we are in trouble: Overlapping time periods. If
-                        // we allow for additional parameters we cannot simply
-                        // choose one of the two parameter sets. It's better
-                        // to leave two separated time periods.
-                        $extra = isset($extraParams[$start])
-                            ? $extraParams[$start] : array();
-                        $testExtra = isset($checkedExtra[$testStart])
-                            ? $checkedExtra[$testStart] : array();
-                        // Remove old period entry.
-                        unset($checked[$testStart]);
-                        unset($checkedExtra[$testStart]);
-                        // We have two periods overlapping. Are their
-                        // additional parameters the same or different?
-                        $newStart = min($start, $testStart);
-                        $newEnd = max($end, $testEnd);
-                        if ($extra === $testExtra) {
-                            // Both periods have the same information. So we
-                            // can just merge.
-                            $checked[$newStart] = $newEnd;
-                            $checkedExtra[$newStart] = $extra;
-                        } else {
-                            // Extra parameters are different. Create one
-                            // period at the beginning with the params of the
-                            // first period and create a trailing period with
-                            // the params of the second period. The break
-                            // point will be the end of the first period.
-                            $break = min($end, $testEnd);
-                            $checked[$newStart] = $break;
-                            $checkedExtra[$newStart] =
-                                isset($extraParams[$newStart])
-                                ? $extraParams[$newStart] : array();
-                            $checked[$break] = $newEnd;
-                            $highStart = max($start, $testStart);
-                            $checkedExtra[$break] =
-                                isset($extraParams[$highStart])
-                                ? $extraParams[$highStart] : array();
-
-                            // Ensure we also have the extra data in the
-                            // extraParams.
-                            $extraParams[$break] =
-                                isset($extraParams[$highStart])
-                                ? $extraParams[$highStart] : array();
-                        }
-                        $added = true;
-                    }
-
-                    if ($added) {
-                        break;
-                    }
-                }
-
-                if (!$added) {
-                    $checked[$start] = $end;
-                    $checkedExtra[$start] = isset($extraParams[$start])
-                        ? $extraParams[$start] : array();
-                }
-            }
-        }
-
-        return array($checked, $checkedExtra);
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vjournal.php b/framework/iCalendar/iCalendar/vjournal.php
deleted file mode 100644 (file)
index 94e07b4..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-<?php
-/**
- * Class representing vJournals.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vjournal extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vJournal';
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('VJOURNAL');
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vnote.php b/framework/iCalendar/iCalendar/vnote.php
deleted file mode 100644 (file)
index f2418e3..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * Class representing vNotes.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @author  Karsten Fourmont <fourmont@gmx.de>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vnote extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vNote';
-
-    function Horde_iCalendar_vnote($version = '1.1')
-    {
-        return parent::Horde_iCalendar($version);
-    }
-
-    /**
-     * Sets the version of this component.
-     *
-     * @see $version
-     * @see $oldFormat
-     *
-     * @param string  A float-like version string.
-     */
-    function setVersion($version)
-    {
-        $this->oldFormat = $version < 1;
-        $this->version = $version;
-    }
-
-    /**
-     * Unlike vevent and vtodo, a vnote is normally not enclosed in an
-     * iCalendar container. (BEGIN..END)
-     */
-    function exportvCalendar()
-    {
-        $requiredAttributes['BODY'] = '';
-        $requiredAttributes['VERSION'] = '1.1';
-
-        foreach ($requiredAttributes as $name => $default_value) {
-            if (is_a($this->getattribute($name), 'PEAR_Error')) {
-                $this->setAttribute($name, $default_value);
-            }
-        }
-
-        return $this->_exportvData('VNOTE');
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vtimezone.php b/framework/iCalendar/iCalendar/vtimezone.php
deleted file mode 100644 (file)
index bcb883a..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-<?php
-/**
- * Class representing vTimezones.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vtimezone extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vTimeZone';
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('VTIMEZONE');
-    }
-
-    /**
-     * Parse child components of the vTimezone component. Returns an
-     * array with the exact time of the time change as well as the
-     * 'from' and 'to' offsets around the change. Time is arbitrarily
-     * based on UTC for comparison.
-     */
-    function parseChild(&$child, $year)
-    {
-        // Make sure 'time' key is first for sort().
-        $result['time'] = 0;
-
-        $t = $child->getAttribute('TZOFFSETFROM');
-        if ($t instanceOf PEAR_Error) {
-            return false;
-        }
-        $result['from'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
-
-        $t = $child->getAttribute('TZOFFSETTO');
-        if ($t instanceOf PEAR_Error) {
-            return false;
-        }
-        $result['to'] = ($t['hour'] * 60 * 60 + $t['minute'] * 60) * ($t['ahead'] ? 1 : -1);
-
-        $switch_time = $child->getAttribute('DTSTART');
-        if ($switch_time instanceOf PEAR_Error) {
-            return false;
-        }
-
-        $rrules = $child->getAttribute('RRULE');
-        if ($rrules instanceOf PEAR_Error) {
-            if (!is_int($switch_time)) {
-                return false;
-            }
-            // Convert this timestamp from local time to UTC for
-            // comparison (All dates are compared as if they are UTC).
-            $t = getdate($switch_time);
-            $result['time'] = @gmmktime($t['hours'], $t['minutes'], $t['seconds'],
-                                        $t['mon'], $t['mday'], $t['year']);
-            return $result;
-        }
-
-        $rrules = explode(';', $rrules);
-        foreach ($rrules as $rrule) {
-            $t = explode('=', $rrule);
-            switch ($t[0]) {
-            case 'FREQ':
-                if ($t[1] != 'YEARLY') {
-                    return false;
-                }
-                break;
-
-            case 'INTERVAL':
-                if ($t[1] != '1') {
-                    return false;
-                }
-                break;
-
-            case 'BYMONTH':
-                $month = intval($t[1]);
-                break;
-
-            case 'BYDAY':
-                $len = strspn($t[1], '1234567890-+');
-                if ($len == 0) {
-                    return false;
-                }
-                $weekday = substr($t[1], $len);
-                $weekdays = array(
-                    'SU' => 0,
-                    'MO' => 1,
-                    'TU' => 2,
-                    'WE' => 3,
-                    'TH' => 4,
-                    'FR' => 5,
-                    'SA' => 6
-                );
-                $weekday = $weekdays[$weekday];
-                $which = intval(substr($t[1], 0, $len));
-                break;
-
-            case 'UNTIL':
-                if (intval($year) > intval(substr($t[1], 0, 4))) {
-                    return false;
-                }
-                break;
-            }
-        }
-
-        if (empty($month) || !isset($weekday)) {
-            return false;
-        }
-
-        if (is_int($switch_time)) {
-            // Was stored as localtime.
-            $switch_time = strftime('%H:%M:%S', $switch_time);
-            $switch_time = explode(':', $switch_time);
-        } else {
-            $switch_time = explode('T', $switch_time);
-            if (count($switch_time) != 2) {
-                return false;
-            }
-            $switch_time[0] = substr($switch_time[1], 0, 2);
-            $switch_time[2] = substr($switch_time[1], 4, 2);
-            $switch_time[1] = substr($switch_time[1], 2, 2);
-        }
-
-        // Get the timestamp for the first day of $month.
-        $when = gmmktime($switch_time[0], $switch_time[1], $switch_time[2],
-                         $month, 1, $year);
-        // Get the day of the week for the first day of $month.
-        $first_of_month_weekday = intval(gmstrftime('%w', $when));
-
-        // Go to the first $weekday before first day of $month.
-        if ($weekday >= $first_of_month_weekday) {
-            $weekday -= 7;
-        }
-        $when -= ($first_of_month_weekday - $weekday) * 60 * 60 * 24;
-
-        // If going backwards go to the first $weekday after last day
-        // of $month.
-        if ($which < 0) {
-            do {
-                $when += 60*60*24*7;
-            } while (intval(gmstrftime('%m', $when)) == $month);
-        }
-
-        // Calculate $weekday number $which.
-        $when += $which * 60 * 60 * 24 * 7;
-
-        $result['time'] = $when;
-
-        return $result;
-    }
-
-}
-
-/**
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_standard extends Horde_iCalendar {
-
-    function getType()
-    {
-        return 'standard';
-    }
-
-    function parsevCalendar($data)
-    {
-        parent::parsevCalendar($data, 'STANDARD');
-    }
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('STANDARD');
-    }
-
-}
-
-/**
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_daylight extends Horde_iCalendar {
-
-    function getType()
-    {
-        return 'daylight';
-    }
-
-    function parsevCalendar($data)
-    {
-        parent::parsevCalendar($data, 'DAYLIGHT');
-    }
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('DAYLIGHT');
-    }
-
-}
diff --git a/framework/iCalendar/iCalendar/vtodo.php b/framework/iCalendar/iCalendar/vtodo.php
deleted file mode 100644 (file)
index ef81d50..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-<?php
-/**
- * Class representing vTodos.
- *
- * Copyright 2003-2010 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_iCalendar
- */
-class Horde_iCalendar_vtodo extends Horde_iCalendar {
-
-    /**
-     * The component type of this class.
-     *
-     * @var string
-     */
-    var $type = 'vTodo';
-
-    function exportvCalendar()
-    {
-        return parent::_exportvData('VTODO');
-    }
-
-    /**
-     * Convert this todo to an array of attributes.
-     *
-     * @return array  Array containing the details of the todo in a hash
-     *                as used by Horde applications.
-     */
-    function toArray()
-    {
-        $todo = array();
-
-        $name = $this->getAttribute('SUMMARY');
-        if (!is_array($name) && !is_a($name, 'PEAR_Error')) {
-            $todo['name'] = $name;
-        }
-        $desc = $this->getAttribute('DESCRIPTION');
-        if (!is_array($desc) && !is_a($desc, 'PEAR_Error')) {
-            $todo['desc'] = $desc;
-        }
-
-        $priority = $this->getAttribute('PRIORITY');
-        if (!is_array($priority) && !is_a($priority, 'PEAR_Error')) {
-            $todo['priority'] = $priority;
-        }
-
-        $due = $this->getAttribute('DTSTAMP');
-        if (!is_array($due) && !is_a($due, 'PEAR_Error')) {
-            $todo['due'] = $due;
-        }
-
-        return $todo;
-    }
-
-    /**
-     * Set the attributes for this todo item from an array.
-     *
-     * @param array $todo  Array containing the details of the todo in
-     *                     the same format that toArray() exports.
-     */
-    function fromArray($todo)
-    {
-        if (isset($todo['name'])) {
-            $this->setAttribute('SUMMARY', $todo['name']);
-        }
-        if (isset($todo['desc'])) {
-            $this->setAttribute('DESCRIPTION', $todo['desc']);
-        }
-
-        if (isset($todo['priority'])) {
-            $this->setAttribute('PRIORITY', $todo['priority']);
-        }
-
-        if (isset($todo['due'])) {
-            $this->setAttribute('DTSTAMP', $todo['due']);
-        }
-    }
-
-}
diff --git a/framework/iCalendar/package.xml b/framework/iCalendar/package.xml
deleted file mode 100644 (file)
index dd19af5..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<package packagerversion="1.4.9" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
-http://pear.php.net/dtd/tasks-1.0.xsd
-http://pear.php.net/dtd/package-2.0
-http://pear.php.net/dtd/package-2.0.xsd">
- <name>iCalendar</name>
- <channel>pear.horde.org</channel>
- <summary>iCalendar API</summary>
- <description>This package provides an API for dealing with iCalendar data.</description>
- <lead>
-  <name>Chuck Hagenbuch</name>
-  <user>chuck</user>
-  <email>chuck@horde.org</email>
-  <active>yes</active>
- </lead>
- <lead>
-  <name>Jan Schneider</name>
-  <user>jan</user>
-  <email>jan@horde.org</email>
-  <active>yes</active>
- </lead>
- <date>2008-09-25</date>
- <version>
-  <release>0.1.0</release>
-  <api>0.1.0</api>
- </version>
- <stability>
-  <release>beta</release>
-  <api>beta</api>
- </stability>
- <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
- <notes>* Fix vFreebusy merging (Bug #4807).
-* Implement handling of vTimezones in iCalendar data (lists-horde@carlthompson.net, Bug #4399).
-* Correctly produce vcard parameters without value, like "ADR;WORK:...".
-* Support departments in vCard's ORG properties (martin@matuska.org, Bug #4285).
-* Fixed _parseDateTime() (wrobel@pardus.de, Bug #4808).
-* Fix exporting of recurring exceptions (Bug #4627).
-* Use lowercase mailto: for better Apple iCal compatibility.
-* We must *not* escape colons per RFC in param values.
-* Fix encoding issues with iCalendar 2.0 exports.
-* Move version specific vCalendar/iCalendar export to Kronolith_Event.
-* Use QUOTED-PRINTABLE when there's a newline in VNOTE data.
-* Anniversary support (ntai@smartfruit.com, Request #5059).
-* Support for all day events with VCALENDAR 1.0.
-* Use ISO-8559-1 as default vCalendar 1.0 and vCard 2.1.
-* Fix unreliably overwriting a variable with itself (rsalmon@mbpgroup.com, Bug #5652).
-* Handle AALARM data with parameters (delimited by a ";").
-* Fix GEO parsing and generation.
-* Refactor line folding and quoted-printable encoding.
-* Add missing softline break (Bug #6541).
-* Don't require a newline after END (Bug #6641, #6706).
-* Fix detecting of "old" formats when parsing vCalendar/vCard data.
-* Request charset on the fly, because it depends on the VERSION property.
-* Fix passing value arrays with only one element.
-* Correctly parse quoted parameters (Bug #7031)
-* Set the correct version if none provided through the vcard data.
-* BODY is not required, but N is, and FN for vcard3.0.
-* Return the passed address unmodified if Mail_RFC822::validateMailbox() fails.
-* Fixed importing of several events at once.
-* Removed required calendar component properties in vevent.php.
-* Fix generation of UIDs with PHP 5.2+.
-* Fix generation of free periods with overlapping events (cedric.parent@multitel.be).
-* Add support for extended vfreebusy parameters (wrobel@gentoo.org, Request #4690).
-* Ensure vnotes and vcards are created with a valid default version number.
- </notes>
- <contents>
-  <dir name="/">
-   <dir name="docs">
-    <dir name="examples">
-     <file baseinstalldir="/Horde" name="exchange.ics" role="doc" />
-     <file baseinstalldir="/Horde" name="exdate.ics" role="doc" />
-     <file baseinstalldir="/Horde" name="parser.php" role="doc" />
-     <file baseinstalldir="/Horde" name="vnote.txt" role="doc" />
-    </dir> <!-- /docs/examples -->
-   </dir> <!-- /docs -->
-   <dir name="iCalendar">
-    <file baseinstalldir="/Horde" name="valarm.php" role="php" />
-    <file baseinstalldir="/Horde" name="vcard.php" role="php" />
-    <file baseinstalldir="/Horde" name="vevent.php" role="php" />
-    <file baseinstalldir="/Horde" name="vfreebusy.php" role="php" />
-    <file baseinstalldir="/Horde" name="vjournal.php" role="php" />
-    <file baseinstalldir="/Horde" name="vnote.php" role="php" />
-    <file baseinstalldir="/Horde" name="vtimezone.php" role="php" />
-    <file baseinstalldir="/Horde" name="vtodo.php" role="php" />
-   </dir> <!-- /iCalendar -->
-   <dir name="tests">
-    <file baseinstalldir="/Horde" name="charset1.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="iCalendar.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="read-escapes.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="read-vcard-org.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="read-write-escapes.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="timezones.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="vfreebusy.phpt" role="test" />
-    <file baseinstalldir="/Horde" name="write-escapes.phpt" role="test" />
-   </dir> <!-- /tests -->
-   <file baseinstalldir="/Horde" name="iCalendar.php" role="php" />
-  </dir> <!-- / -->
- </contents>
- <dependencies>
-  <required>
-   <php>
-    <min>4.3.0</min>
-   </php>
-   <pearinstaller>
-    <min>1.5.4</min>
-   </pearinstaller>
-   <package>
-    <name>Mail</name>
-    <channel>pear.horde.org</channel>
-   </package>
-   <package>
-    <name>Support</name>
-    <channel>pear.horde.org</channel>
-   </package>
-   <package>
-    <name>Util</name>
-    <channel>pear.horde.org</channel>
-   </package>
-  </required>
- </dependencies>
- <phprelease />
- <changelog>
-  <release>
-   <date>2006-05-08</date>
-   <version>
-    <release>0.0.3</release>
-    <api>0.0.3</api>
-   </version>
-   <stability>
-    <release>beta</release>
-    <api>beta</api>
-   </stability>
-   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
-   <notes>* Converted to package.xml 2.0 for pear.horde.org.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>0.0.2</release>
-    <api>0.0.2</api>
-   </version>
-   <stability>
-    <release>beta</release>
-    <api>beta</api>
-   </stability>
-   <date>2004-12-05</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
-   <notes>Lots of improvements, bugfixes and support for more fields and members of the iCalendar family.
-   </notes>
-  </release>
-  <release>
-   <version>
-    <release>0.0.1</release>
-    <api>0.0.1</api>
-   </version>
-   <stability>
-    <release>alpha</release>
-    <api>alpha</api>
-   </stability>
-   <date>2003-07-03</date>
-   <license uri="http://www.gnu.org/copyleft/lesser.html">LGPL</license>
-   <notes>Initial release as a PEAR package
-   </notes>
-  </release>
- </changelog>
-</package>
diff --git a/framework/iCalendar/tests/.cvsignore b/framework/iCalendar/tests/.cvsignore
deleted file mode 100644 (file)
index 4fce866..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-*.diff
-*.log
-*.exp
-*.php
-*.out
diff --git a/framework/iCalendar/tests/bug_7423.phpt b/framework/iCalendar/tests/bug_7423.phpt
deleted file mode 100644 (file)
index 56cc9a2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
---TEST--
-Bug #7423: Leading space on attribute names
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$data = 'BEGIN:VCALENDAR
-VERSION:2.0
-METHOD:PUBLISH
-BEGIN:VEVENT
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER:PT540M
-END:VALARM
-SUMMARY:birthday
-END:VEVENT
-END:VCALENDAR';
-
-$ical->parseVCalendar($data);
-$components = $ical->getComponents();
-foreach ($components as $component) {
-    var_dump($component->toHash(true));
-}
-
-?>
---EXPECT--
-array(1) {
-  ["SUMMARY"]=>
-  string(8) "birthday"
-}
diff --git a/framework/iCalendar/tests/charset1.phpt b/framework/iCalendar/tests/charset1.phpt
deleted file mode 100644 (file)
index b9aec0b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
---TEST--
-Inline charset test
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$data = 'BEGIN:VCALENDAR
-VERSION:1.0
-BEGIN:VEVENT
-SUMMARY;ENCODING=QUOTED-PRINTABLE;CHARSET=UTF-8:m=C3=B6chen
-DTSTART:20040628T080000Z
-DTEND:20040628T090000Z
-X-EPOCAGENDAENTRYTYPE:APPOINTMENT
-CLASS:PUBLIC
-DCREATED:20040627T220000Z
-LAST-MODIFIED:20040628T175300Z
-PRIORITY:0
-STATUS:NEEDS ACTION
-END:VEVENT
-END:VCALENDAR';
-
-$ical->parseVCalendar($data);
-$event = $ical->getComponent(0);
-var_dump($event->getAttribute('SUMMARY'));
-
-$data = 'BEGIN:VCALENDAR
-VERSION:1.0
-BEGIN:VEVENT
-SUMMARY;ENCODING=QUOTED-PRINTABLE:m=C3=B6chen
-DTSTART:20040628T080000Z
-DTEND:20040628T090000Z
-X-EPOCAGENDAENTRYTYPE:APPOINTMENT
-CLASS:PUBLIC
-DCREATED:20040627T220000Z
-LAST-MODIFIED:20040628T175300Z
-PRIORITY:0
-STATUS:NEEDS ACTION
-END:VEVENT
-END:VCALENDAR';
-
-$ical->parseVCalendar($data, 'VCALENDAR', 'UTF-8');
-$event = $ical->getComponent(0);
-var_dump($event->getAttribute('SUMMARY'));
-
-?>
---EXPECT--
-string(6) "möchen"
-string(6) "möchen"
diff --git a/framework/iCalendar/tests/empty_data.phpt b/framework/iCalendar/tests/empty_data.phpt
deleted file mode 100644 (file)
index d29a82b..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
---TEST--
-Empty data parsing test
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$data = 'BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-END:VCALENDAR';
-
-var_export($ical->parseVCalendar($data));
-echo "\n";
-var_export($ical->getComponents());
-echo "\n";
-var_export($ical->parseVCalendar(''));
-echo "\n";
-var_export($ical->getComponents());
-echo "\n";
-
-?>
---EXPECT--
-true
-array (
-)
-false
-array (
-)
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/AuthorChats.ics b/framework/iCalendar/tests/fixtures/vTimezone/AuthorChats.ics
deleted file mode 100644 (file)
index 49956a1..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:AuthorChats\r
-PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
-X-WR-RELCALID:7245D10D-C6E4-40D1-998A-4FDDE8522F8A\r
-X-WR-TIMEZONE:US/Central\r
-CALSCALE:GREGORIAN\r
-METHOD:PUBLISH\r
-X-WR-CALDESC:Chat dates for CPLLC authors.\r
-BEGIN:VTIMEZONE\r
-TZID:US/Central\r
-LAST-MODIFIED:20060901T191936Z\r
-BEGIN:DAYLIGHT\r
-DTSTART:20060402T080000\r
-TZOFFSETTO:-0500\r
-TZOFFSETFROM:+0000\r
-TZNAME:CDT\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20061029T020000\r
-TZOFFSETTO:-0600\r
-TZOFFSETFROM:-0500\r
-TZNAME:CST\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20070311T010000\r
-TZOFFSETTO:-0500\r
-TZOFFSETFROM:-0600\r
-TZNAME:CDT\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060806T090000\r
-DTEND;TZID=US/Central:20060806T180000\r
-SUMMARY:FAR Sexy Sunday Chat\r
-UID:814DEA1F-F531-4E04-B3A2-DD49AA54F54E-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:5\r
-DTSTAMP:20060702T204116Z\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:3210FF94-6D76-495F-9381-6A2F00325466\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060729T100000\r
-DTEND;TZID=US/Central:20060729T170000\r
-SUMMARY:Lady Aibell Chat\r
-UID:934838F2-FB0E-4005-A1CA-A6E0F296BD75-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:8\r
-DTSTAMP:20060710T034417Z\r
-RRULE:FREQ=MONTHLY;INTERVAL=1;BYMONTHDAY=29\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT7H\r
-DTSTAMP:20060710T034417Z\r
-UID:934838F2-FB0E-4005-A1CA-A6E0F296BD75-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:7\r
-RECURRENCE-ID;TZID=US/Central:20060729T100000\r
-DTSTART;TZID=US/Central:20060729T100000\r
-SUMMARY:Lady Aibell Chat\r
-DESCRIPTION:Release author chat on Lady Aibell Loop\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060910T090000\r
-DTEND;TZID=US/Central:20060910T170000\r
-SUMMARY:FAR Sexy Sunday Chat\r
-UID:E8B9C16D-E3A4-4FF8-80BE-F8959008FF75-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:5\r
-DTSTAMP:20060702T204150Z\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:499D81D6-A0DF-4A33-8EEF-6C330D23F3A5\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H\r
-DTSTAMP:20060824T161813Z\r
-UID:633D2C12-E8E9-4C21-855D-48D08D8CCAB4-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
-DTSTART;TZID=US/Central:20060911T200000\r
-SUMMARY:Sapphire Phelan's Birthday and She Wants to Party Chat\r
-DESCRIPTION:Chat starts at 9:00 pm central time.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060826T100000\r
-SUMMARY:Bianca's Chat\r
-URL;VALUE=URI:http://groups.yahoo.com/group/BiancaDArc\r
-UID:B575367D-880A-465A-94E1-3D4D0537C6ED-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:3\r
-DTSTAMP:20060823T145036Z\r
-DURATION:PT1H\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060817T100000\r
-DTEND;TZID=US/Central:20060817T160000\r
-SUMMARY:Lady Aibell Chat @ Coffeetime Devin Group\r
-UID:FC8077B5-DAE0-4EB6-8F36-6DDAB6A87D41-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:7\r
-DTSTAMP:20060710T174446Z\r
-RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=3TH\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060903T190000\r
-DTEND;TZID=US/Central:20060903T210000\r
-SUMMARY:Live Editor Chat\r
-UID:97B15FA9-C33B-4F64-90F0-46BF15C602C5-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
-SEQUENCE:6\r
-DTSTAMP:20060824T132749Z\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:C1525025-1B21-4382-90E6-DCDBE427B4C1\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060709T090000\r
-DTEND;TZID=US/Central:20060709T170000\r
-SUMMARY:FAR Sexy Sunday Chat\r
-UID:9D3E0CD6-0845-4D2A-9514-02D92AD60866-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-URL;VALUE=URI:http://groups.yahoo.com/group/fallenangelreviewchatters\r
-SEQUENCE:7\r
-DTSTAMP:20060702T202936Z\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:8797188A-A8FA-4761-9547-A288E6B31AAE\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060903T130000\r
-DTEND;TZID=US/Central:20060903T150000\r
-SUMMARY:Tammy Lee Author Live Chat\r
-UID:5C18B411-30F3-4594-A13E-FDB3BD963FE7-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
-SEQUENCE:6\r
-DTSTAMP:20060824T132715Z\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:897B3612-2E79-415D-AEC1-3E3814113EFD\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTAMP:20060818T052554Z\r
-UID:27FE0DC8-9F34-442C-931F-59997619017D-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:9\r
-DTSTART;TZID=US/Central:20060804T100000\r
-SUMMARY:CPLLC Romance Authors @ Coffeetime\r
-DTEND;TZID=US/Central:20060804T160000\r
-DESCRIPTION:Coffeetime Karen Find Out About New Books chat for general r\r
- omance every first Friday of the month\n\r
-RRULE:FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT6H\r
-DTSTAMP:20060818T052554Z\r
-UID:27FE0DC8-9F34-442C-931F-59997619017D-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:8\r
-RECURRENCE-ID;TZID=US/Central:20060901T100000\r
-DTSTART;TZID=US/Central:20060901T100000\r
-SUMMARY:CPLLC Romance Authors @ Coffeetime\r
-DESCRIPTION:Coffeetime Karen Find Out About New Books chat for general r\r
- omance every first Friday of the month\ndk\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H\r
-DTSTAMP:20060824T132246Z\r
-UID:C87293E2-7594-467A-A900-493F067063FB-9F560168-F2A5-46FC-9009-47AAF54\r
- FE01A\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://ladyaibell.com/bookstore/information.php?info_id=22\r
\r
-DTSTART;TZID=US/Central:20060830T200000\r
-SUMMARY:Ella Scopilo's Hump Day chat\r
-DESCRIPTION:Come join Ella for an hour of naughty fun!\r
-RRULE:FREQ=WEEKLY;INTERVAL=1\r
-BEGIN:VALARM\r
-ACTION:AUDIO\r
-TRIGGER:-PT15M\r
-X-WR-ALARMUID:A5D69E87-5159-48C6-94BF-F3C7CFF2448B\r
-ATTACH;VALUE=URI:Basso\r
-END:VALARM\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/MMMPseminar.ics b/framework/iCalendar/tests/fixtures/vTimezone/MMMPseminar.ics
deleted file mode 100644 (file)
index f5082cd..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:spring2006\r
-PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
-X-WR-RELCALID:DC5E55FF-E16F-4B73-9E26-1233EFC3A1C9\r
-X-WR-TIMEZONE:US/Central\r
-CALSCALE:GREGORIAN\r
-METHOD:PUBLISH\r
-BEGIN:VTIMEZONE\r
-TZID:US/Central\r
-LAST-MODIFIED:20060130T164630Z\r
-BEGIN:STANDARD\r
-DTSTART:20051030T070000\r
-TZOFFSETTO:-0600\r
-TZOFFSETFROM:+0000\r
-TZNAME:CST\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20060402T010000\r
-TZOFFSETTO:-0500\r
-TZOFFSETFROM:-0600\r
-TZNAME:CDT\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20061029T020000\r
-TZOFFSETTO:-0600\r
-TZOFFSETFROM:-0500\r
-TZNAME:CST\r
-END:STANDARD\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060207T120000\r
-DTEND;TZID=US/Central:20060207T130000\r
-SUMMARY:Jack Murphy\nTrojan Horse or Proton Force: Finding the Right Par\r
- tners for Toxin Translocation\r
-UID:D6E613D7-59A0-4720-875A-760D97A4B3FD\r
-SEQUENCE:2\r
-DTSTAMP:20060130T163846Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060509T120000\r
-DTEND;TZID=US/Central:20060509T130000\r
-SUMMARY:Kai Matuschewski\nHitting the Plasmodium Life Cycle Early On: At\r
- tenuated Liver Stages\r
-UID:11A905EB-B0AB-4101-AA7C-90723C00345D\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164444Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060321T120000\r
-DTEND;TZID=US/Central:20060321T130000\r
-SUMMARY:Felix Rey\nInsights into the Mechanism of Membrane Fusion Derive\r
- d from Structural Studies of Viral Envelope Proteins\r
-UID:BD747E63-BA7D-46E3-9BFF-82ED05963784\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164131Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060221T120000\r
-DTEND;TZID=US/Central:20060221T130000\r
-SUMMARY:Maurizio Del Poeta\nSphingolipid-Mediated Fungal Pathogenesis\r
-UID:ED8190C6-A07F-47EC-A480-20A8FBCF6E17\r
-SEQUENCE:2\r
-DTSTAMP:20060130T163935Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060124T120000\r
-DTEND;TZID=US/Central:20060124T130000\r
-SUMMARY:Jorge Galan\nStructure\, Assembly\, and Function of the Type III\r
-  Secretion Injectisome\r
-UID:2D657A20-917F-49F2-8E6A-D49B9D5A65F1\r
-SEQUENCE:3\r
-DTSTAMP:20060130T163705Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060307T120000\r
-DTEND;TZID=US/Central:20060307T130000\r
-SUMMARY:Don Ganem\nRNAi\, MicroRNAs and Viral Infection\r
-UID:883949DC-C6FF-418A-BDEE-0CB6B6453C45\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164024Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060228T120000\r
-DTEND;TZID=US/Central:20060228T130000\r
-SUMMARY:Barak Cohen\nGenomic Analysis of Natural Variation in Saccharomy\r
- ces\r
-UID:8A81A021-F2A4-426E-BA0C-13C5D12F2248\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164001Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060328T120000\r
-DTEND;TZID=US/Central:20060328T130000\r
-SUMMARY:Michael Ferguson\nThe Structure and Biosynthesis of Trypanosome \r
- Surface Molecules:  Basic Science and Therapeutic Possiblities\r
-UID:0384243F-2858-4BC3-92EC-5940CF0B3C0E\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164200Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060425T120000\r
-DTEND;TZID=US/Central:20060425T130000\r
-SUMMARY:James M. Musser\nMolecular Pathogenomics of Group A Streptococcu\r
- s\, the Flesh-Eater\r
-UID:4599802A-AFFE-45BC-B2DD-13BAB8E1BB6C\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164338Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060411T120000\r
-DTEND;TZID=US/Central:20060411T130000\r
-SUMMARY:Wayne Yokoyama\nInnate Responses to Viral Infections\r
-UID:11610367-EC3F-46CB-9F5F-7EEBAEED722E\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164246Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060314T120000\r
-DTEND;TZID=US/Central:20060314T130000\r
-SUMMARY:Herbert \"Skip\" Virgin\nHost-Herpesvirus Standoff:  Good News F\r
- rom the Front in an Ancient Battle\n\r
-UID:FA8394ED-F737-4E4D-A171-A8A917AFB1CC\r
-SEQUENCE:3\r
-DTSTAMP:20060130T164108Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060102T110000\r
-SUMMARY:New Event\r
-UID:609176ED-56DF-43C2-8931-8EF20C6CFBC0\r
-SEQUENCE:1\r
-DTSTAMP:20060130T163545Z\r
-DURATION:PT1H\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060404T120000\r
-DTEND;TZID=US/Central:20060404T130000\r
-SUMMARY:Matthew Welch\nExploitation of the Host Actin Cytoskeleton by Ba\r
- cterial and Viral Pathogens\r
-UID:F2B5E5E2-A204-4C27-B679-D0D3217D2F5B\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164223Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060502T120000\r
-DTEND;TZID=US/Central:20060502T130000\r
-SUMMARY:Theresa Koeher\nVirulence Gene Expression by Bacillus anthracis \r
- and Implications for the Host\r
-UID:4AA1FDD2-F2A1-43B5-B8FF-60D1003E5A09\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164409Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060214T120000\r
-DTEND;TZID=US/Central:20060214T130000\r
-SUMMARY:Eduardo Groisman\nRegulatory Networks Controlling Bacterial Phys\r
- iology and Virulence\r
-UID:1C1002C3-DEB1-4FA5-9090-C57EB42DE5C2\r
-SEQUENCE:2\r
-DTSTAMP:20060130T163907Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060418T120000\r
-DTEND;TZID=US/Central:20060418T130000\r
-SUMMARY:Brendan Cormack\nTranscriptional Silencing and Adherence in the \r
- Yeast Pathogen Candida glabrata\r
-UID:FB61B2BE-6805-4A18-8FD7-02DF5B6DDAFB\r
-SEQUENCE:2\r
-DTSTAMP:20060130T164311Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=US/Central:20060131T120000\r
-DTEND;TZID=US/Central:20060131T130000\r
-SUMMARY:Andrew Pekosz\nIntracellular Transport of Viral Proteins and Par\r
- ticles \r
-UID:80E1E336-E8BD-406C-B578-D8B08F0DCA4D\r
-SEQUENCE:2\r
-DTSTAMP:20060130T163806Z\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/Moon_Days.ics b/framework/iCalendar/tests/fixtures/vTimezone/Moon_Days.ics
deleted file mode 100644 (file)
index ccd6c71..0000000
+++ /dev/null
@@ -1,226 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:Moon_Days\r
-PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
-X-WR-RELCALID:925E2DFC-D4CC-46BC-AD37-F60F4B459D2D\r
-X-WR-TIMEZONE:America/New_York\r
-CALSCALE:GREGORIAN\r
-METHOD:PUBLISH\r
-X-WR-CALDESC:Full moons\, new moons\, + related dates that are astronomi\r
- cally notable to one chai walla. \r
-BEGIN:VTIMEZONE\r
-TZID:America/New_York\r
-LAST-MODIFIED:20060818T012007Z\r
-BEGIN:DAYLIGHT\r
-DTSTART:20060402T070000\r
-TZOFFSETTO:-0400\r
-TZOFFSETFROM:+0000\r
-TZNAME:EDT\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20061029T020000\r
-TZOFFSETTO:-0500\r
-TZOFFSETFROM:-0400\r
-TZNAME:EST\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20070311T010000\r
-TZOFFSETTO:-0400\r
-TZOFFSETFROM:-0500\r
-TZNAME:EDT\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061029T020000\r
-DTEND;TZID=America/New_York:20061029T020000\r
-SUMMARY:Standard Time resumes\r
-UID:A9672871-FB93-4B76-A1B0-D567D58F32B4-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:7\r
-DTSTAMP:20060302T175347Z\r
-DESCRIPTION:Fall back! Americans must submit to the Lords of Time and ro\r
- ll their clocks back 1 hour at 3am\, making it 2am. Or something like th\r
- at. Basically\, we gain 1 hour.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060625T120500\r
-DTEND;TZID=America/New_York:20060625T120500\r
-SUMMARY:New Moon\r
-UID:D54D42CC-FA01-495A-97C3-316767E97302-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:7\r
-DTSTAMP:20060302T175700Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061006T231300\r
-DTEND;TZID=America/New_York:20061007T231300\r
-SUMMARY:Full Moon\r
-UID:9373EAFB-9F3D-40CB-B27D-98509D16B552-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173533Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061105T075800\r
-DTEND;TZID=America/New_York:20061105T075800\r
-SUMMARY:Full Moon\r
-UID:9B3DFD55-B850-46AA-BD2D-82C9EE4408B1-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T174931Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061204T192500\r
-DTEND;TZID=America/New_York:20061204T192500\r
-SUMMARY:Full Moon\r
-UID:605C9869-E068-4991-97BE-DC960E3BBF25-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:5\r
-DTSTAMP:20060302T173824Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060923T000300\r
-DTEND;TZID=America/New_York:20060923T000300\r
-SUMMARY:Autumnal Equinox\r
-UID:536184D2-EF08-45D6-BC00-E8386DEA7B00-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173447Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;VALUE=DATE:20060711\r
-DTEND;VALUE=DATE:20060712\r
-SUMMARY:Guru Purnima\r
-UID:7F7EA952-C7CB-4E26-ADE2-A30ED3863AE8-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:3\r
-DTSTAMP:20060626T191946Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061120T171800\r
-DTEND;TZID=America/New_York:20061120T171800\r
-SUMMARY:New Moon\r
-UID:B927FEBD-23BC-4763-824A-658F531AAD44-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:8\r
-DTSTAMP:20060302T180443Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060710T230200\r
-DTEND;TZID=America/New_York:20060711T110200\r
-SUMMARY:Full Moon\r
-UID:DB59CF53-79CE-4AD7-8617-B98D4B83DBE3-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T172952Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060922T074500\r
-DTEND;TZID=America/New_York:20060922T194500\r
-SUMMARY:New Moon\r
-UID:50F46337-1301-4A7B-95E2-C952B145E5AE-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173407Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060823T161000\r
-DTEND;TZID=America/New_York:20060823T161000\r
-SUMMARY:New Moon\r
-UID:2AC805A6-C9E1-45A6-88DE-DBF18E80D509-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T175546Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;VALUE=DATE:20060822\r
-LOCATION:AYNY\r
-DTEND;VALUE=DATE:20060828\r
-SUMMARY:Ganesha Chaturthi\r
-UID:AF2D2EE9-B7E6-4182-B6AD-661EA817E942-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:8\r
-DTSTAMP:20060804T162200Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060809T185400\r
-DTEND;TZID=America/New_York:20060809T185400\r
-SUMMARY:Full Moon\r
-UID:BABE196C-0782-488F-8020-5EE86F4466CB-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173138Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060907T144200\r
-DTEND;TZID=America/New_York:20060907T144200\r
-SUMMARY:Full Moon\r
-UID:25BF0B7D-1367-407B-A191-1A2B70183F3F-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173326Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061220T090100\r
-DTEND;TZID=America/New_York:20061220T090100\r
-SUMMARY:New Moon\r
-UID:3F36081E-BE60-4A3A-A912-C023BA5C1B17-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:9\r
-DTSTAMP:20060302T180144Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20070103T085700\r
-DTEND;TZID=America/New_York:20070103T205700\r
-SUMMARY:Full Moon\r
-UID:68396D70-C3A5-451F-8A6C-A6C14D048449-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T174342Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060621T082600\r
-DTEND;TZID=America/New_York:20060621T202600\r
-SUMMARY:Summer Solstice\r
-UID:032EA44A-72A3-4E5F-95B5-F6FD26432D37-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:5\r
-DTSTAMP:20060114T155356Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20070202T004500\r
-DTEND;TZID=America/New_York:20070202T004500\r
-SUMMARY:Full Moon\r
-UID:B0B386E9-48BB-4573-BD89-06D0E1578F03-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T174508Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20070118T230100\r
-DTEND;TZID=America/New_York:20070119T230100\r
-SUMMARY:New Moon\r
-UID:99A40CFA-8968-420E-8873-950340AB4920-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:7\r
-DTSTAMP:20060302T174405Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20060725T003100\r
-DTEND;TZID=America/New_York:20060725T003100\r
-SUMMARY:New Moon\r
-UID:FEF1C01E-3BDF-40CD-B569-A7507866A5A0-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:6\r
-DTSTAMP:20060302T173031Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=America/New_York:20061022T011400\r
-DTEND;TZID=America/New_York:20061022T011400\r
-SUMMARY:New Moon\r
-UID:E252DE90-9954-430C-9F69-AC6E3B5012CF-36E46F1A-4503-4154-A637-F2B87BC\r
- 040D0\r
-SEQUENCE:9\r
-DTSTAMP:20060302T175134Z\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/ProjectCalendar.ics b/framework/iCalendar/tests/fixtures/vTimezone/ProjectCalendar.ics
deleted file mode 100644 (file)
index 16fe534..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r
-BEGIN:VEVENT\r
-CREATED:20060802T220609Z\r
-LAST-MODIFIED:20060817T200742Z\r
-DTSTAMP:20060817T200742Z\r
-UID:{c640032c-6828-404b-b547-69780fe8c1e3}\r
-SUMMARY:Code slush begins\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060825T220000\r
-DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060825T220500\r
-DESCRIPTION:No high risk patch will be accepted at this point.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060802T220716Z\r
-LAST-MODIFIED:20060817T200801Z\r
-DTSTAMP:20060817T200801Z\r
-UID:{035a81e6-5d4e-7642-97e4-e464bf7de96d}\r
-SUMMARY:String freeze\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060902T220000\r
-DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060902T220000\r
-DESCRIPTION:No strings may be changed or added after this point.  \r
- Localization can begin.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060802T220800Z\r
-LAST-MODIFIED:20060816T191907Z\r
-DTSTAMP:20060816T191907Z\r
-UID:{bbf22425-1530-8040-ad11-aef02ba840d5}\r
-SUMMARY:Release Candidate 1\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060906\r
-DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060907\r
-DESCRIPTION:A proposed release candidate will be built for each target \r
- platform.  Final QA tests begin.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060802T220844Z\r
-LAST-MODIFIED:20060816T191940Z\r
-DTSTAMP:20060816T191940Z\r
-UID:{9bd2970a-4dc9-b645-846c-9f68f6860985}\r
-SUMMARY:Sunbird/Lightning 0.3 release\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060909\r
-DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/America/Chicago:20060910\r
-DESCRIPTION:Release of both Sunbird and Lightning 0.3 for en-US on all \r
- platforms.  Any other locales which are ready will also be released.\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060816T192125Z\r
-LAST-MODIFIED:20060817T201332Z\r
-DTSTAMP:20060817T201332Z\r
-UID:{4637c9fa-b45b-4001-a124-aa638db20d20}\r
-SUMMARY:Calendar Test Day\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060822T070000\r
-DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060822T210000\r
-URL:http://wiki.mozilla.org/Calendar:QA_TestDays\r
-LOCATION:#calendar-qa\r
-DESCRIPTION:Join us for the Calendar Test Day!\nhttp:\r
- //wiki.mozilla.org/Calendar:QA_TestDays\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060816T192330Z\r
-LAST-MODIFIED:20060816T192649Z\r
-DTSTAMP:20060816T192649Z\r
-UID:{81fd8527-d5fd-454a-86ea-050c42ca065b}\r
-SUMMARY:Calendar QA Chat\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=TH\r
-DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060817T113000\r
-DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060817T123000\r
-DESCRIPTION:This meeting happens at 16:30 UTC every Thursday and lasts \r
- one hour\r
-LOCATION:#calendar-qa\r
-URL:http://wiki.mozilla.org/Calendar:Current_QA_Chat\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060817T200857Z\r
-LAST-MODIFIED:20060817T201032Z\r
-DTSTAMP:20060817T201032Z\r
-UID:{4e13cc09-7f21-447b-8c76-00fe558fd46a}\r
-SUMMARY:Status Meeting\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-RRULE:FREQ=WEEKLY;INTERVAL=1;BYDAY=WE\r
-DTSTART;TZID=/mozilla.org/20050126_1/America/Chicago:20060816T110000\r
-DTEND;TZID=/mozilla.org/20050126_1/America/Chicago:20060816T120000\r
-LOCATION:http://wiki.mozilla.org/Calendar:Status\r
-DESCRIPTION:Weekly Calendar Status Meeting\n\nhttp:\r
- //wiki.mozilla.org/Calendar:Status\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID:/mozilla.org/20050126_1/America/Chicago\r
-X-LIC-LOCATION:America/Chicago\r
-BEGIN:STANDARD\r
-TZOFFSETFROM:-0500\r
-TZOFFSETTO:-0600\r
-TZNAME:CST\r
-DTSTART:19701025T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-TZOFFSETFROM:-0600\r
-TZOFFSETTO:-0500\r
-TZNAME:CDT\r
-DTSTART:19700405T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID:/mozilla.org/20050126_1/America/Chicago\r
-X-LIC-LOCATION:America/Chicago\r
-BEGIN:DAYLIGHT\r
-TZOFFSETFROM:-0600\r
-TZOFFSETTO:-0500\r
-TZNAME:CDT\r
-DTSTART:19700405T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-TZOFFSETFROM:-0500\r
-TZOFFSETTO:-0600\r
-TZNAME:CST\r
-DTSTART:19701025T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
-END:STANDARD\r
-END:VTIMEZONE\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/SpanishHolidays.ics b/framework/iCalendar/tests/fixtures/vTimezone/SpanishHolidays.ics
deleted file mode 100644 (file)
index 31dae01..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-BEGIN:VCALENDAR
-METHOD
- :PUBLISH
-VERSION
- :2.0
-PRODID
- :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :946822600
-SUMMARY
- :Fiesta del Trabajo
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=5
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020501
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020502
-DTSTAMP
- :20020924T114931Z
-LAST-MODIFIED
- :20041116T225632Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :981227758
-SUMMARY
- :Fiesta Nacional
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=10
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021012
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021013
-DTSTAMP
- :20020924T115005Z
-LAST-MODIFIED
- :20041116T225642Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :981227549
-SUMMARY
- :Natividad del Señor
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=12
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021225
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021226
-DTSTAMP
- :20020924T115110Z
-LAST-MODIFIED
- :20041116T225700Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :947864734
-SUMMARY
- :Todos los Santos
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=11
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021101
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021102
-DTSTAMP
- :20020924T115030Z
-LAST-MODIFIED
- :20041116T225722Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :913583658
-SUMMARY
- :Viernes Santo
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=3
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020329
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020330
-DTSTAMP
- :20020924T114908Z
-LAST-MODIFIED
- :20041116T225737Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :959908481
-SUMMARY
- :Asunción de la Virgen
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=8
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020815
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020816
-DTSTAMP
- :20020924T114948Z
-LAST-MODIFIED
- :20041116T225750Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :967837191
-SUMMARY
- :Año Nuevo
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=1
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020101
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20020102
-DTSTAMP
- :20020924T114801Z
-LAST-MODIFIED
- :20041116T225801Z
-END:VEVENT
-BEGIN:VTIMEZONE
-TZID
- :/Mozilla.org/BasicTimezones/GMT
-LOCATION
- :GMT
-END:VTIMEZONE
-BEGIN:VEVENT
-UID
- :911083728
-SUMMARY
- :Constitución Española
-CATEGORIES
- :Public Holiday
-STATUS
- :TENTATIVE
-CLASS
- :PRIVATE
-X-MOZILLA-RECUR-DEFAULT-UNITS
- :years
-RRULE
- :FREQ=YEARLY;INTERVAL=1;BYMONTH=12
-DTSTART
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021206
-DTEND
- ;VALUE=DATE
- ;TZID=/Mozilla.org/BasicTimezones/GMT
- :20021207
-DTSTAMP
- :20020924T115050Z
-LAST-MODIFIED
- :20041116T225812Z
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/allcategories.vcs b/framework/iCalendar/tests/fixtures/vTimezone/allcategories.vcs
deleted file mode 100644 (file)
index c66be74..0000000
+++ /dev/null
@@ -1,166 +0,0 @@
-BEGIN:VCALENDAR
-BEGIN:VTIMEZONE
-TZID:US/Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-2a27
-SUMMARY:NSS ISDC 2006
-LOCATION:Los Angeles\, CA
-DTSTART;TZID=US/Eastern:20060504
-DTEND;TZID=US/Eastern:20060507
-DESCRIPTION:  Centennial Challenges participation at the NSS ISDC
-  2006\, including panel and mini-workshop.
-URL:http://isdc.nss.org/2006/
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges Appearances*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:df4bfc:109fa68b68b:-6bd6
-SUMMARY:VSE Trailer Ohio State Tour
-LOCATION:Ohio
-DTSTART;TZID=US/Eastern:20060508T080000
-DTEND;TZID=US/Eastern:20060604T170000
-DESCRIPTION:  In partnership with the Glenn Research Center the trailer
-  will visit Cleveland\, COlumbus\, Cincinnati\, and
-  Troy.
-ORGANIZER;CN="Derek Wang":MAILTO:derek.wang-1@nasa.gov
-CATEGORIES:Outreach*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-2833
-SUMMARY:AIAA International Energy Conversion Conference
-LOCATION:San Diego\, CA
-DTSTART;TZID=US/Eastern:20060626
-DTEND;TZID=US/Eastern:20060629
-DESCRIPTION:  Centennial Challenges participation at AIAA International
-  Energy Conversion Conference in San Diego\, CA\, including
-  paper session and mini-workshop.
-URL:www.aiaa.org/events/iecec/
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges Appearances*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-26be
-SUMMARY:42nd AIAA/ASME/SAE/ASEE Joint Propulsion Conference
-LOCATION:Sacramento\, CA
-DTSTART;TZID=US/Eastern:20060709
-DTEND;TZID=US/Eastern:20060712
-DESCRIPTION:  Centennial Challenges participation at 42nd AIAA/ASME/SAE/ASEE
-  Joint Propulsion Conference in Sacramento\, CA\, including
-  panel participation.
-URL:http://www.aiaa.org/content.cfm?pageid=230&lumeetingid=1178
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges Appearances*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-1e77
-SUMMARY:2006 Beam Power Challenge
-LOCATION:Mountain View\, CA
-DTSTART;TZID=US/Eastern:20060804
-DTEND;TZID=US/Eastern:20060806
-URL:http://www.elevator2010.org/site/competitionClimber2006.html
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-1dc5
-SUMMARY:2006 Tether Challenge
-LOCATION:Mountain View\, CA
-DTSTART;TZID=US/Eastern:20060804
-DTEND;TZID=US/Eastern:20060806
-URL:http://www.elevator2010.org/site/competitionTether2006.html
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-24c2
-SUMMARY:X PRIZE Cup Spaceflight Exposition
-LOCATION:Las Cruces\, NM
-DTSTART;TZID=US/Eastern:20061021
-DTEND;TZID=US/Eastern:20061022
-DESCRIPTION:  Centennial Challenges Exhibit at X PRIZE Cup Spaceflight
-  Exposition.
-URL:http://www.xpcup.com/
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges Appearances*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:14b2f1a:10aba5a6339:3fcd
-SUMMARY:2007 Astronaut Glove Challenge: APRIL DATE TBD
-LOCATION:To be determined (TBD)
-DTSTART;TZID=US/Eastern:20070401
-DTEND;TZID=US/Eastern:20070401
-URL:www.astronaut-glove.us
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:18ed77a:10a2cde985c:-1630
-SUMMARY:2007 Regolith Excavation Challenge
-LOCATION:Santa Maria Fair Park\, Santa Maria\, California
-DTSTART;TZID=US/Eastern:20070512
-DTEND;TZID=US/Eastern:20070512
-URL:http://www.californiaspaceauthority.org/regolith/
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:14b2f1a:10aba5a6339:437d
-SUMMARY:2007 Personal Air Vehicle (PAV) Challenge: DATE TBD
-LOCATION:Santa Rosa\, California
-DTSTART;TZID=US/Eastern:20070601
-DTEND;TZID=US/Eastern:20070601
-URL:www.cafefoundation.org/pav.htm
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-BEGIN:VEVENT
-UID:14b2f1a:10aba5a6339:4575
-SUMMARY:2008 MoonROx (Moon Regolith Oxygen) Challenge
-LOCATION:To be determined
-DTSTART;TZID=US/Eastern:20080601
-DTEND;TZID=US/Eastern:20080601
-URL:www.MoonROx.org
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-END:VCALENDAR
\ No newline at end of file
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/arsenal32FC.ics b/framework/iCalendar/tests/fixtures/vTimezone/arsenal32FC.ics
deleted file mode 100644 (file)
index e726a4e..0000000
+++ /dev/null
@@ -1,3594 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:Arsenal32FC\r
-PRODID:-//Apple Computer\, Inc//iCal 2.0//EN\r
-X-WR-RELCALID:546BD00E-C1C1-4EFA-BF00-4CB891A57F6A\r
-X-WR-TIMEZONE:Europe/Oslo\r
-CALSCALE:GREGORIAN\r
-METHOD:PUBLISH\r
-X-WR-CALDESC:All the fixtures (PL\, CL\, FA-cup\, League-cup and friendl\r
- ies) with results and goalscorers. All coming fixtures are updated with \r
- the opposition and kick-off times as they are confirmed by Arsenal FC.\n\r
- \nComments or errors can be reported to piri@start.no\r
-BEGIN:VTIMEZONE\r
-TZID:Europe/Oslo\r
-LAST-MODIFIED:20060901T112450Z\r
-BEGIN:DAYLIGHT\r
-DTSTART:20040328T010000\r
-TZOFFSETTO:+0200\r
-TZOFFSETFROM:+0000\r
-TZNAME:CEST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20041031T030000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0200\r
-TZNAME:CET\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20050327T030000\r
-TZOFFSETTO:+0200\r
-TZOFFSETFROM:+0100\r
-TZNAME:CEST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20051030T030000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0200\r
-TZNAME:CET\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20060326T030000\r
-TZOFFSETTO:+0200\r
-TZOFFSETFROM:+0100\r
-TZNAME:CEST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20061029T030000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0200\r
-TZNAME:CET\r
-END:STANDARD\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID:Europe/London\r
-LAST-MODIFIED:20060901T112450Z\r
-BEGIN:DAYLIGHT\r
-DTSTART:20010325T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20011028T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20020331T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20021027T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20030330T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20031026T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20040328T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20041031T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20050327T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20051030T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20060326T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20061029T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-DTSTART:20070325T010000\r
-TZOFFSETTO:+0100\r
-TZOFFSETFROM:+0000\r
-TZNAME:BST\r
-END:DAYLIGHT\r
-BEGIN:STANDARD\r
-DTSTART:20071028T020000\r
-TZOFFSETTO:+0000\r
-TZOFFSETFROM:+0100\r
-TZNAME:GMT\r
-END:STANDARD\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-LOCATION:Bramall Lane\nFA Cup 5th round replay\r
-DTSTAMP:20050521T181342Z\r
-UID:DD11D698-C0BB-4C5F-A5E1-258D877A84F3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=259072\r
-DTSTART;TZID=Europe/London:20050301T200500\r
-SUMMARY:Sheffield Utd (2)0-0(4) Arsenal\r
-DTEND;TZID=Europe/London:20050301T215000\r
-DESCRIPTION:SHEFFIELD UNITED 0\n\nARSENAL 0\n\nArsenal win 4-2 on penalt\r
- ies\n\nFA Cup 5th round replay\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20040822T171229Z\r
-UID:BDEE4C5D-5EFF-4568-85EB-48B30B4587C1-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=220756\r
-DTSTART;TZID=Europe/London:20040822T160500\r
-SUMMARY:Arsenal 5-3 Middlesbrough\r
-DTEND;TZID=Europe/London:20040822T175000\r
-DESCRIPTION:ARSENAL 5\nHenry 25\, 90\nBergkamp 54\nPires 65\nReyes 65\n \r
- \nMIDDLESBROUGH 3\nJob 43\nHasselbaink 50\nQueudrue 53\n\nFA Barclays Pr\r
- emiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Upton Park\nBarclays Premiership\r
-DTSTAMP:20050924T161228Z\r
-UID:0BFCF965-270C-4432-87DC-49E762B7E541-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=309882\r
-DTSTART;TZID=Europe/London:20050924T150000\r
-SUMMARY:West Ham Utd 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20050924T164500\r
-DESCRIPTION:WEST HAM UNITED 0\n\nARSENAL 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T151953Z\r
-UID:3DC146C7-3CEB-43B5-ACCF-04C4A12718EC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235144\r
-DTSTART;TZID=Europe/London:20031108T150000\r
-SUMMARY:Arsenal 2-1 Tottenham\r
-DTEND;TZID=Europe/London:20031108T164500\r
-DESCRIPTION:ARSENAL 2\nRobert Pires 69\nFreddie Ljungberg 79\n\nTOTTENHA\r
- M HOTSPUR 1\nDarren Anderton 5\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:St. Andrews\nFA Barclays Premiership\r
-DTSTAMP:20050522T190846Z\r
-UID:DEBB97E4-FD20-4B4D-A6B9-2AD8064FE5B0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=276363\r
-DTSTART;TZID=Europe/London:20050515T150000\r
-SUMMARY:Birmingham City 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20050515T164500\r
-DESCRIPTION:BIRMINGHAM CITY 2\nPandiani 80\nHeskey 90\n\nARSENAL 1\nBerg\r
- kamp 88\n\nFA Barclays Premiership\n\nChelsea 38  29-8-1      72-15  95\\r
- nARSENAL      38  25-8-5      87-36  83\nMan Utd      38  22-11-5    58-26  77\nEv\r
- erton 38  18-7-13    45-46  61\nLiverpool     38  17-7-14    52-41  58\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Millennium Stadium\, Cardiff\r
-DTSTAMP:20060623T173011Z\r
-UID:993737EB-27E0-4587-AF8D-3C871E770AFF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070225T150000\r
-SUMMARY:Carling Cup Final\r
-DTEND;TZID=Europe/London:20070225T164500\r
-DESCRIPTION:Carling Cup Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Craven Cottage\nFA Barclays Premiership\r
-DTSTAMP:20040911T165738Z\r
-UID:C4D0B23D-9911-423F-971E-4B24B97F4C04-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=224868\r
-DTSTART;TZID=Europe/London:20040911T150000\r
-SUMMARY:Fulham 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20040911T164500\r
-DESCRIPTION:FULHAM 0\n\nARSENAL 3\nLjungberg 62\nKnight (og) 65\nReyes 7\r
- 1\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup Third Round\nElland Road\r
-DTSTAMP:20040604T150758Z\r
-UID:E90EF253-43D6-4A8F-AD7F-6575B69D9C0A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=248109\r
-DTSTART;TZID=Europe/London:20040104T160500\r
-SUMMARY:Leeds United 1-4 Arsenal\r
-DTEND;TZID=Europe/London:20040104T175000\r
-DESCRIPTION:LEEDS UNITED 1\nViduka 8\n\nARSENAL 4\nHenry 26\nEdu 32\nPir\r
- es 87\nToure 92\n\nFA Cup Third Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stade de France\, Paris\nUEFA Champions League\r
-DTSTAMP:20060809T113424Z\r
-UID:A0718603-83F8-4D8F-BE86-DD628C513434-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:19\r
-URL;VALUE=URI:http://www.uefa.com/Competitions/UCL/index.html\r
-DTSTART;TZID=Europe/London:20060517T194500\r
-SUMMARY:Barcelona 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20060517T213000\r
-DESCRIPTION:BARCELONA 2\nEto`o 77\nBelletti 81\n\nARSENAL 1\nCampbell 37\r
- \n\nUEFA Champions League Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:City of Manchester Stadium\nBarclays Premiership\r
-DTSTAMP:20060809T121458Z\r
-UID:13FA08DC-5869-43FB-A4A3-8F7A8EA8B01B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20060504T194500\r
-SUMMARY:Manchester City 1-3 Arsenal\r
-DESCRIPTION:MANCHESTER CITY 1\nSommeil 39\n\nARSENAL 3\nLjungberg 30\nRe\r
- yes 78\, 84\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060819T193244Z\r
-UID:0F8E5701-6ED3-4742-8FA0-8548906310BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20060819T150000\r
-SUMMARY:Arsenal 1-1 Aston Villa\r
-DTEND;TZID=Europe/London:20060819T164500\r
-DESCRIPTION:ARSENAL 1\nGilberto 83\n\nASTON VILLA 1\nMellberg 54\n\nBarc\r
- lays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Amsterdam Tournament\nArenA Amsterdam\r
-DTSTAMP:20040801T202146Z\r
-UID:2F72FFCD-A2B5-447D-A25F-C40BD7CEC5EE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216698\r
-DTSTART;TZID=Europe/Oslo:20040730T190000\r
-SUMMARY:River Plate 0-0 Arsenal\r
-DTEND;TZID=Europe/Oslo:20040730T204500\r
-DESCRIPTION:RIVER PLATE 0\n\nARSENAL 0\n\nPre-season friendly\nAmsterdam\r
-  Tournament\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Weiz\nPre-Season Friendly\r
-DTSTAMP:20050720T191321Z\r
-UID:5CBA3725-55A6-4665-85AD-36FF841251F7-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:19\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=292922\r
-DTSTART;TZID=Europe/London:20050720T180000\r
-SUMMARY:Weiz 0-5 Arsenal\r
-DTEND;TZID=Europe/London:20050720T194500\r
-DESCRIPTION:WEIZ 0\n\nARSENAL 5\nFlamini 1\nHenry 4\, 37\nBentley 15\nBe\r
- rgkamp 50\n\nAustrian Tour\nPre-Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Meadow Park\r
-DTSTAMP:20060809T113314Z\r
-UID:738BB2CB-4734-45E0-9BB5-FAB00032399F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:23\r
-DTSTART;TZID=Europe/London:20060804T193000\r
-SUMMARY:Boreham Wood 0-4 Arsenal XI\r
-DTEND;TZID=Europe/London:20060804T211500\r
-DESCRIPTION:BOREHAM WOOD 0\n\nARSENAL 4\nLupoli 31\, 90\nMerida Perez 49\r
- \nBarazite 55\n\nFriendly match\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070124T200000\r
-SUMMARY:Carling Cup Semi-Final (2)\r
-UID:FF3C28A5-1B4B-49DB-8D61-F50C0029DD5A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T165935Z\r
-DESCRIPTION:Carling Cup Semi-final (2)\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060704T214320Z\r
-UID:A3605A71-6D29-496A-91F9-7569E0D8475D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20061112T160000\r
-SUMMARY:Arsenal - Liverpool\r
-DTEND;TZID=Europe/London:20061112T174500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060622T110924Z\r
-UID:43ED76B3-AFF9-46BE-8CB9-7E24081053ED-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061118T150000\r
-SUMMARY:Arsenal - Newcastle Utd\r
-DTEND;TZID=Europe/London:20061118T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150308Z\r
-UID:948C672E-DAAD-472A-AF6C-EE0852365A90-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235084\r
-DTSTART;TZID=Europe/London:20040320T150000\r
-SUMMARY:Arsenal 2-1 Bolton Wanderers\r
-DTEND;TZID=Europe/London:20040320T164500\r
-DESCRIPTION:ARSENAL 2\nPires 16\nBergkamp 24\n\nBOLTON WANDERERS 1\nCamp\r
- o 41\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Valley\nFA Barclays Premiership\r
-DTSTAMP:20050101T171929Z\r
-UID:13935549-7B90-406B-9F7A-90819D3E2C3A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=246972\r
-DTSTART;TZID=Europe/London:20050101T150000\r
-SUMMARY:Charlton Athletic 1-3 Arsenal\r
-DTEND;TZID=Europe/London:20050101T164500\r
-DESCRIPTION:CHARLTON ATHLETIC 1\nEl Karkouri 45\n\nARSENAL 3\nLjungberg \r
- 35\, 48\nVan Persie 71\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070127T150000\r
-SUMMARY:F.A. Cup 4rth round\r
-UID:5512BB18-D83F-4046-9F9D-C8CD5DFE787C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T172538Z\r
-DESCRIPTION:F.A. Cup 4rth round\r
-SEQUENCE:7\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:St. Mary's Stadium\nFA Barclays Premiership\r
-DTSTAMP:20050227T195350Z\r
-UID:C68FEB23-6B11-43D2-8636-AC63B9321FB6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=258285\r
-DTSTART;TZID=Europe/London:20050226T124500\r
-SUMMARY:Southampton 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20050226T143000\r
-DESCRIPTION:SOUTHAMPTON 1\nCrouch 67\n\nARSENAL 1\nLjungberg 45\n\nFA Ba\r
- rclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Ritzing\nPre-Season Friendly\r
-DTSTAMP:20060809T122610Z\r
-UID:CF304487-DCC8-44F2-9A54-66F71AF6153F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=293432\r
-DTSTART;TZID=Europe/London:20050724T150000\r
-SUMMARY:Ritzing 2-5 Arsenal\r
-DTEND;TZID=Europe/London:20050724T164500\r
-DESCRIPTION:RITZING 2\nPajer 38\nSchiffer 75\n\nARSENAL 5\nBergkamp 10\n\r
- Henry 17\nReyes (pen) 35\nHleb 79\nLarsson 90\n\nAustrian Tour\nPre-Seas\r
- on Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050402T214701Z\r
-UID:D89D0B30-95D5-4541-8E2A-0E16B1ACD844-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=260128\r
-DTSTART;TZID=Europe/London:20050305T150000\r
-SUMMARY:Arsenal 3-0 Portsmouth\r
-DTEND;TZID=Europe/London:20050305T164500\r
-DESCRIPTION:ARSENAL 3\nHenry 39\, 53\, 85\n\nPORTSMOUTH 0\n\nFA Barclays\r
-  Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nKSK Beveren FC\r
-DTSTAMP:20040805T113442Z\r
-UID:3DE04A4B-9A50-41E7-BA56-7CF096E4B93F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:1\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=217614\r
-DTSTART;TZID=Europe/Oslo:20040804T193000\r
-SUMMARY:Beveren 0-0 Arsenal XI\r
-DTEND;TZID=Europe/Oslo:20040804T211500\r
-DESCRIPTION:KSK BEVEREN 0\n\nARSENAL XI 0\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nMolineux\r
-DTSTAMP:20040604T150601Z\r
-UID:FFCDBB9E-50AA-4477-85A3-76532EDFE9DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235003\r
-DTSTART;TZID=Europe/London:20040207T150000\r
-SUMMARY:Wolverhampton 1-3 Arsenal\r
-DTEND;TZID=Europe/London:20040207T164500\r
-DESCRIPTION:WOLVERHAMPTON 1\nIoan Ganea 26\n\nARSENAL 3\nBergkamp 9\nHen\r
- ry 58\nToure 63\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Craven Cottage\r
-DTSTAMP:20060622T110755Z\r
-UID:6B4B93A2-4BA4-484F-AE7D-F53E851AA5AF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:51\r
-DTSTART;TZID=Europe/London:20061129T194500\r
-SUMMARY:Fulham - Arsenal\r
-DTEND;TZID=Europe/London:20061129T213000\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:AOL - Arena\r
-DTSTAMP:20060825T091034Z\r
-UID:15AE6DB9-9B00-4870-AAB9-7044922FAEA0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20060913T194500\r
-SUMMARY:Hamburg - Arsenal\r
-DESCRIPTION:UEFA Champions League matchday 1\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070306T194500\r
-SUMMARY:Champions League knockout round 2\r
-UID:89BB2B1A-C5E0-461E-BD2C-C452C910263C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T170807Z\r
-DESCRIPTION:Champions League knockout round 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T121950Z\r
-UID:808E335F-99F1-4BD9-8ACE-9DD8DB1D31A9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235226\r
-DTSTART;TZID=Europe/London:20030926T200000\r
-SUMMARY:Arsenal 3-2 Newcastle United\r
-DTEND;TZID=Europe/London:20030926T214500\r
-DESCRIPTION:ARSENAL 3\nHenry 18\, 79 (pen)\nGilberto 67\n\nNEWCASTLE UNI\r
- TED 2\nRobert 26\nBernard 71\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150247Z\r
-UID:71A375EE-E5F8-4461-91FB-E3AB0513A9D6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235094\r
-DTSTART;TZID=Europe/London:20040328T160500\r
-SUMMARY:Arsenal 1-1 Manchester United\r
-DTEND;TZID=Europe/London:20040328T175000\r
-DESCRIPTION:ARSENAL 1\nHenry 50\n\nMANCHESTER UTD 1\nSaha 86\n\nFA Barcl\r
- aycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T122807Z\r
-UID:406FCBBB-339B-459C-81C6-75E044F5E29A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235064\r
-DTSTART;TZID=Europe/London:20040201T160500\r
-SUMMARY:Arsenal 2-1 Manchester City\r
-DTEND;TZID=Europe/London:20040201T175000\r
-DESCRIPTION:ARSENAL 2\nTarnat (og) 37\nHenry 82\n\nMANCHESTER CITY 1\nAn\r
- elka 88\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20051208T091322Z\r
-UID:E24F789D-7189-4F04-B83C-AE8C7F96BCDB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=332048\r
-DTSTART;TZID=Europe/London:20051207T194500\r
-SUMMARY:Arsenal 0-0 AFC Ajax\r
-DESCRIPTION:ARSENAL 0\n\nAJAX 0\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nHighbury\r
-DTSTAMP:20040604T152055Z\r
-UID:5FA11B6C-7436-4FB0-BF0F-AB721273C156-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243484\r
-DTSTART;TZID=Europe/London:20031210T194500\r
-SUMMARY:Arsenal 2-0 Lokomotiv Moscow\r
-DTEND;TZID=Europe/London:20031210T213000\r
-DESCRIPTION:ARSENAL 2\nPires 12\nLjungberg 67\n\nLOKOMOTIV MOSCOW 0\n\nU\r
- EFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Millennium Stadium\, Cardiff\nFA Cup Final\r
-DTSTAMP:20050521T181209Z\r
-UID:B24D3055-80AC-4069-9D43-448432A86997-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=277548\r
-STATUS:CONFIRMED\r
-DTSTART;TZID=Europe/London:20050521T150000\r
-SUMMARY:Arsenal (5)0-0(4) Manchester Utd\r
-DTEND;TZID=Europe/London:20050521T164500\r
-DESCRIPTION:ARSENAL 0\n\nMANCHESTER UNITED 0\n\nArsenal win 5-4 on penal\r
- ties.\n\nFA Cup Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nLokomotiv Stadium\r
-DTSTAMP:20040604T151803Z\r
-UID:1A5325F2-48CE-43BE-8A0B-31D12B9146D5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243418\r
-DTSTART;TZID=Europe/London:20030930T173000\r
-SUMMARY:Lokomotiv Moscow 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20030930T191500\r
-DESCRIPTION:LOKOMOTIV MOSCOW 0\n\nARSENAL 0\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T151836Z\r
-UID:0D2BD950-DA7B-4A87-9CF0-0DB3881463E8-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235184\r
-DTSTART;TZID=Europe/London:20031018T150000\r
-SUMMARY:Arsenal 2-1 Chelsea\r
-DTEND;TZID=Europe/London:20031018T164500\r
-DESCRIPTION:ARSENAL 2\nEdu 4\nHenry 75\n\nCHELSEA 1\nCrespo 8\n\nFA Barc\r
- laycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nOld Trafford\r
-DTSTAMP:20040604T151742Z\r
-UID:83C8DCDD-14B5-43EF-8903-9D1ED17701C9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235220\r
-DTSTART;TZID=Europe/London:20030921T160500\r
-SUMMARY:Manchester Utd 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20030921T175000\r
-DESCRIPTION:MANCHESTER UNITED 0\nVan Nistelrooy missed pen 90\n\nARSENAL\r
-  0\nVieira sent off 79\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nClarence Park\, St Albans\r
-DTSTAMP:20040604T151527Z\r
-UID:09F56274-70F9-4938-9C54-345758F27CAD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241527\r
-DTSTART;TZID=Europe/London:20030731T193000\r
-SUMMARY:St Albans City 1-3 Arsenal XI\r
-DTEND;TZID=Europe/London:20030731T211500\r
-DESCRIPTION:ST ALBANS CITY 1\nMcDonnell 44\n\nARSENAL XI 3\nVolz 19\, 51\r
- \nHalls 60\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stamford Bridge\nBarclays Premiership\r
-DTSTAMP:20050821T175116Z\r
-UID:D1C9C24D-54A8-4F0A-98DE-95664FAFED08-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:15\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=299569\r
-DTSTART;TZID=Europe/London:20050821T160000\r
-SUMMARY:Chelsea 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20050821T174500\r
-DESCRIPTION:CHELSEA 1\nDrogba 73\n\nARSENAL 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:City of Manchester Stadium\r
-DTSTAMP:20060826T181937Z\r
-UID:503BC001-B8C4-4AD9-89F0-C640100E1E74-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-DTSTART;TZID=Europe/London:20060826T171500\r
-SUMMARY:Manchester City 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060826T190000\r
-DESCRIPTION:MANCHESTER CITY 1\nBarton 41 (pen)\n\nARSENAL 0\n\nBarclays \r
- Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060104T074101Z\r
-UID:B5669563-3A5E-44E8-BBD4-56468D1014BB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:29\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=349879\r
-DTSTART;TZID=Europe/London:20060103T200000\r
-SUMMARY:Arsenal 0-0 Manchester Utd\r
-DTEND;TZID=Europe/London:20060103T214500\r
-DESCRIPTION:ARSENAL 0\n\nMANCHESTER UNITED 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Ewood Park\nBarclays Premiership\r
-DTSTAMP:20060225T195303Z\r
-UID:7549B043-643B-4BC9-8E0D-D90646B36C76-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=366342\r
-DTSTART;TZID=Europe/London:20060225T150000\r
-SUMMARY:Blackburn Rovers 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060225T164500\r
-DESCRIPTION:BLACKBURN ROVERS 1\nPedersen 18\n\nARSENAL 0\n\nBarclays Pre\r
- miership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Estadio do Dragao\r
-DTSTAMP:20060825T090935Z\r
-UID:7DEC6928-F5CD-45EB-BEE6-31F026F612F6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20061206T194500\r
-SUMMARY:FC Porto - Arsenal\r
-DESCRIPTION:UEFA Champions League matchday 6\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nReebok Stadium\r
-DTSTAMP:20040604T152138Z\r
-UID:4EE0796B-6C1A-4E9E-9683-9440F26018DF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234966\r
-DTSTART;TZID=Europe/London:20031220T150000\r
-SUMMARY:Bolton W 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20031220T164500\r
-DESCRIPTION:BOLTON WANDERERS 1\nPedersen 83\n\nARSENAL 1\nPires 57\n\nFA\r
-  Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Villa Park\r
-DTSTAMP:20060623T172316Z\r
-UID:1FD6BCDD-A429-4451-8ED3-4F3F3AEA7580-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070224T150000\r
-SUMMARY:Aston Villa - Arsenal\r
-DTEND;TZID=Europe/London:20070224T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Santiago Bernabéu\nUEFA Champions League\r
-DTSTAMP:20060221T231549Z\r
-UID:1658A9A7-CB4E-4592-8521-501A850778FA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=365276\r
-DTSTART;TZID=Europe/London:20060221T194500\r
-SUMMARY:Real Madrid 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20060221T213000\r
-DESCRIPTION:REAL MADRID 0\n\nARSENAL 1\nHenry 47\n\nUEFA Champions Leagu\r
- e\nRound of 16 - First leg\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041120T233806Z\r
-UID:C6261B81-7716-45C5-840F-36304430CDA3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=238106\r
-DTSTART;TZID=Europe/London:20041120T150000\r
-SUMMARY:Arsenal 1-1 West Bromwich Albion\r
-DTEND;TZID=Europe/London:20041120T164500\r
-DESCRIPTION:ARSENAL 1\nPires 54\n\nWEST BROMWICH ALBION 1\nEarnshaw 79\n\r
- \nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Reebok Stadium\nBarclays Premiership\r
-DTSTAMP:20051203T174744Z\r
-UID:FAB58070-B7CA-4898-B0B2-B738D4BC59BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=330807\r
-DTSTART;TZID=Europe/London:20051203T150000\r
-SUMMARY:Bolton Wanderers 2-0 Arsenal\r
-DTEND;TZID=Europe/London:20051203T164500\r
-DESCRIPTION:BOLTON WANDERERS 2\nFaye 20\nStelios 32\n\nARSENAL 0\n\nBarc\r
- lays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Old Trafford\r
-DTSTAMP:20060711T140535Z\r
-UID:8293EFFE-4B34-4E8B-BE3F-6060CD336FF5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20060917T160000\r
-SUMMARY:Manchester Utd - Arsenal\r
-DTEND;TZID=Europe/London:20060917T174500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172437Z\r
-UID:071EA2F2-ACC6-4B00-915F-A645F5D45C07-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070303T150000\r
-SUMMARY:Arsenal - Reading\r
-DTEND;TZID=Europe/London:20070303T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20051023T100152Z\r
-UID:17669441-6749-4279-92E6-9C0778D0B794-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=318610\r
-DTSTART;TZID=Europe/London:20051022T150000\r
-SUMMARY:Arsenal 1-0 Manchester City\r
-DTEND;TZID=Europe/London:20051022T164500\r
-DESCRIPTION:ARSENAL 1\nPires 61 (pen)\n\nMANCHESTER CITY 0\n\nBarclays P\r
- remiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172504Z\r
-UID:FADFCA7D-FF68-41D0-8101-DD0705FEED74-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070505T150000\r
-SUMMARY:Arsenal - Chelsea\r
-DTEND;TZID=Europe/London:20070505T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070307T194500\r
-SUMMARY:Champions League knockout round 2\r
-UID:726C05A2-1DCD-4A1B-8EEA-FC8F00D51943-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T170818Z\r
-DESCRIPTION:Champions League knockout round 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:DSB Stadium\, Netherlands\r
-DTSTAMP:20060809T113344Z\r
-UID:984B5155-B453-4C54-AB2E-AA1B28D6470F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:22\r
-DTSTART;TZID=Europe/Oslo:20060804T190000\r
-SUMMARY:AZ Alkmaar 0-3 Arsenal\r
-DTEND;TZID=Europe/Oslo:20060804T204500\r
-DESCRIPTION:AZ ALKMAAR 0\n\nARSENAL 3\nGilberto 36\nAdebayor 52\nVan Per\r
- sie 74 (pen)\n\nPre-Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Goodison Park\nFA Barclays Premiership\r
-DTSTAMP:20040818T214802Z\r
-UID:CB68CA39-4400-4FA7-8BF0-BF7BF2B4136B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=219470\r
-DTSTART;TZID=Europe/London:20040815T140000\r
-SUMMARY:Everton 1-4 Arsenal\r
-DTEND;TZID=Europe/London:20040815T154500\r
-DESCRIPTION:EVERTON 1\nCarsley 64\n\nARSENAL 4\nBergkamp 23\nReyes 39\nL\r
- jungberg 54\nPires 83\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Madejski Stadium\r
-DTSTAMP:20060704T214235Z\r
-UID:C18A4E98-B99C-4E49-AB4E-FEBE4911102C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20061022T160000\r
-SUMMARY:Readling - Arsenal\r
-DTEND;TZID=Europe/London:20061022T174500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Riverside Stadium\nBarclays Premiership\r
-DTSTAMP:20050911T092135Z\r
-UID:068F415C-7248-40AA-8568-ACEED555ED5D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:15\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=305615\r
-DTSTART;TZID=Europe/London:20050910T171500\r
-SUMMARY:Middlesbrough 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20050910T190000\r
-DESCRIPTION:MIDDLESBROUGH 2\nYakubu 40\nMaccarone 58\n\nARSENAL 1\nReyes\r
-  90\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Underhill Stadium\, Barnet FC\nPre-Season Friendly\r
-DTSTAMP:20060809T122551Z\r
-UID:C46CDC63-BCED-4DA4-B35D-FC4B4931528E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=290980\r
-DTSTART;TZID=Europe/London:20050716T150000\r
-SUMMARY:Barnet 1-4 Arsenal\r
-DTEND;TZID=Europe/London:20050716T164500\r
-DESCRIPTION:BARNET 1\nSinclair 74\n\nARSENAL 4\nHleb 2\nHenry 15 (pen)\n\r
- Bergkamp 28\,\nHoyte 35\n\nPre-Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070425T194500\r
-SUMMARY:Champions League semi-final 1\r
-UID:295A452C-8547-41CF-89CF-2B37B466C42E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171714Z\r
-DESCRIPTION:Champions League semi-final 1\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Dynamo Stadium\r
-DTSTAMP:20060830T131541Z\r
-UID:D0C0E9ED-BAEA-4919-9E42-863C17BC147A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:22\r
-DTSTART;TZID=Europe/London:20061017T173000\r
-SUMMARY:CSKA Moscow - Arsenal\r
-DESCRIPTION:UEFA Champions League matchday 3\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060809T113404Z\r
-UID:42BC0BBA-940D-4170-89AA-52A38FB515EC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:30\r
-DTSTART;TZID=Europe/London:20060722T170000\r
-SUMMARY:Arsenal 2-1 Ajax\r
-DTEND;TZID=Europe/London:20060722T184500\r
-DESCRIPTION:ARSENAL 2\nHenry 55\nKanu 80\n\nAJAX 1\nHuntelaar 37\n\nDenn\r
- is Bergkamp testimonial\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T114551Z\r
-UID:61DA3E4F-41A3-40BE-97F7-0DA5DDA65EDA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=311970\r
-DTSTART;TZID=Europe/London:20051002T133000\r
-SUMMARY:Arsenal 1-0 Birmingham City\r
-DTEND;TZID=Europe/London:20051002T151500\r
-DESCRIPTION:ARSENAL 1\nVan Persie 81\n\nBIRMINGHAM 0\n\nBarclays Premier\r
- ship\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041030T183137Z\r
-UID:48DEEEF9-0226-4CD2-8B7C-0A14CEDC774C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=234427\r
-DTSTART;TZID=Europe/London:20041030T150000\r
-SUMMARY:Arsenal 2-2 Southampton\r
-DTEND;TZID=Europe/London:20041030T164500\r
-DESCRIPTION:ARSENAL 2\nHenry 67\nVan Persie 90\n\nSOUTHAMPTON 2\nDelap 8\r
- 0\, 85\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Goodison Park\r
-DTSTAMP:20060623T172324Z\r
-UID:C62B71C3-B92D-45BA-B6CF-AD07227B6353-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070317T150000\r
-SUMMARY:Everton - Arsenal\r
-DTEND;TZID=Europe/London:20070317T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Schwadorf\, Austria\r
-DTSTAMP:20060809T113334Z\r
-UID:6F77FE30-994F-4E30-B718-ACAF214649C1-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/Oslo:20060731T170000\r
-SUMMARY:Schwadorf 1-8 Arsenal\r
-DTEND;TZID=Europe/Oslo:20060731T184500\r
-DESCRIPTION:SCHWADORF 1\nLabaska 86\n\nARSENAL 8\nVan Persie 6\, 47\nDjo\r
- urou 15\nAdebayor 39\, 45\nToure 53\nBendtner 74\nHleb 84\n\nPre-Season \r
- Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League (knock-out)\nEstadio de Balaidos\r
-DTSTAMP:20040604T150508Z\r
-UID:9FBE54FE-5DE4-4E46-8EC5-C7ED4F31B747-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249279\r
-DTSTART;TZID=Europe/London:20040224T194500\r
-SUMMARY:Celta de Vigo 2-3 Arsenal\r
-DTEND;TZID=Europe/London:20040224T213000\r
-DESCRIPTION:CELTA DE VIGO 2\nEdu 27\nIgnacio 64\n\nARSENAL 3\nEdu 16\, 5\r
- 8\nPires 80\n\nUEFA Champions League (knock-out)\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Bramall Lane\r
-DTSTAMP:20060622T110435Z\r
-UID:264BCC4B-23C0-4E62-9DF0-28D65A1FADFA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061230T150000\r
-SUMMARY:Sheffield Utd - Arsenal\r
-DTEND;TZID=Europe/London:20061230T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nCarling Cup 4th round\r
-DTSTAMP:20041110T084850Z\r
-UID:B96B3EDA-E4F8-4D4E-A38D-E68A0FAC4DAC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20041109T194500\r
-SUMMARY:Arsenal 3-1 Everton\r
-DTEND;TZID=Europe/London:20041109T213000\r
-DESCRIPTION:ARSENAL 3\nOwusu-Abeyie 25\nLupoli 52\, 85\n\nEVERTON 1\nGra\r
- vesen 8\n\nCarling Cup 4th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20050814T143934Z\r
-UID:419B8042-6F04-4BFF-BBFB-87ECD69BA6AC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:19\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=298360\r
-DTSTART;TZID=Europe/London:20050814T133000\r
-SUMMARY:Arsenal 2-0 Newcastle\r
-DTEND;TZID=Europe/London:20050814T151500\r
-DESCRIPTION:ARSENAL 2\nHenry 81 (pen)\nVan Persie 87\n\nNEWCASTLE UNITED\r
-  0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060318T171313Z\r
-UID:02D02AAB-CA95-4836-9BFC-7F6070769027-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTART;TZID=Europe/London:20060318T150000\r
-SUMMARY:Arsenal 3-0 Charlton Athletic\r
-DTEND;TZID=Europe/London:20060318T164500\r
-DESCRIPTION:Arsenal 3\nPires 13\, Adebayor 32\, Hleb 49\n\nCharlton Athl\r
- etic 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T165213Z\r
-UID:A2331E3F-6636-4FCC-976C-A7BE0F267F94-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/London:20070101T150000\r
-SUMMARY:Arsenal - Charlton Athletic\r
-DTEND;TZID=Europe/London:20070101T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172444Z\r
-UID:AE4E258B-D379-497E-B9A1-7705198D684B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070407T150000\r
-SUMMARY:Arsenal - West Ham\r
-DTEND;TZID=Europe/London:20070407T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup 5th round\nHighbury\r
-DTSTAMP:20040604T150528Z\r
-UID:E3CD3E04-6B11-4C2E-9941-D3655DBA30AA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249914\r
-DTSTART;TZID=Europe/London:20040215T113000\r
-SUMMARY:Arsenal 2-1 Chelsea\r
-DTEND;TZID=Europe/London:20040215T131500\r
-DESCRIPTION:ARSENAL 2\nReyes 56\, 62\n\nCHELSEA 1\nMutu 40\n\nFA Cup 5th\r
-  round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Fratton Park\nFA Barclays Premiership\r
-DTSTAMP:20041219T184527Z\r
-UID:3B019F51-AD5D-4D1F-9A08-1B5CDF33D3A6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=244606\r
-DTSTART;TZID=Europe/London:20041219T160500\r
-SUMMARY:Portsmouth 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20041219T175000\r
-DESCRIPTION:PORTSMOUTH 0\n\nARSENAL 1\nCampbell 75\n\nFA Barclays Premie\r
- rship\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20060809T114753Z\r
-UID:A903EEC3-8FDF-4C88-AD72-027667EDD57B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/matchreport.asp?thisNav=fixtures&fx\r
- id=291995\r
-DTSTART;TZID=Europe/London:20060308T194500\r
-SUMMARY:Arsenal 0-0 Real Madrid\r
-DESCRIPTION:ARSENAL 0\n\nREAL MADRID 0\n\n(Arsenal win 1-0 on agg.)\n\nU\r
- EFA Champions League\nRound of 16 - Second leg\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070414T150000\r
-DTEND;TZID=Europe/London:20070414T164500\r
-SUMMARY:F.A. Cup Semi-Final\r
-UID:536C873E-82D3-46AE-BF78-18BC335208E3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTAMP:20060623T172648Z\r
-DESCRIPTION:F.A. Cup Semi-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070424T194500\r
-DTEND;TZID=Europe/London:20070424T213000\r
-SUMMARY:Champions League semi-final 1\r
-UID:34E0D7F1-6ADA-42D4-83F8-8E7A9D6E199A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTAMP:20060623T171711Z\r
-DESCRIPTION:Champions League semi-final 1\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T152030Z\r
-UID:4E482D40-6A2D-47F1-827C-E43334F989E3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235164\r
-DTSTART;TZID=Europe/London:20031130T140000\r
-SUMMARY:Arsenal 0-0 Fulham\r
-DTEND;TZID=Europe/London:20031130T154500\r
-DESCRIPTION:ARSENAL 0\n\nFULHAM 0\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T122517Z\r
-UID:3E361BD1-C2F8-4CFA-A461-0190E7EDC18E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235124\r
-DTSTART;TZID=Europe/London:20040515T150000\r
-SUMMARY:Arsenal 2-1 Leicester City\r
-DTEND;TZID=Europe/London:20040515T164500\r
-DESCRIPTION:ARSENAL 2\nHenry 47 (pen)\nVieira 66\n\nLEICESTER CITY 1\nDi\r
- ckov 26\n\nFA Barclaycard Premiership\n\nARSENAL 38 26 12 0 73-26 90\nCh\r
- elsea   38 24  7 7  67-30 79\nManUtd   38 23  6 9  64-35 75\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20051106T093933Z\r
-UID:992DC227-70DD-4078-8EDD-E1ECE4B64329-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=322549\r
-DTSTART;TZID=Europe/London:20051105T150000\r
-SUMMARY:Arsenal 3-1 Sunderland\r
-DTEND;TZID=Europe/London:20051105T164500\r
-DESCRIPTION:ARSENAL 3\nVan Persie 12\nHenry 36\, 82\n\nSUNDERLAND 1\nStu\r
- bbs 75\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nHighbury\r
-DTSTAMP:20040604T151942Z\r
-UID:2BA39EB6-8A68-4CBA-964C-ED241DE756AB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243454\r
-DTSTART;TZID=Europe/London:20031105T194500\r
-SUMMARY:Arsenal 1-0 Dynamo Kyiv\r
-DTEND;TZID=Europe/London:20031105T213000\r
-DESCRIPTION:ARSENAL 1\nCole 88\n\nDYNAMO KYIV 0\n\nUEFA Champions League\r
\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Bad Waltersdorf\nPre-Season Friendly\r
-DTSTAMP:20060809T122621Z\r
-UID:F6EC7FCD-BF15-4285-81FA-D7F9E12A33BC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=294355\r
-DTSTART;TZID=Europe/London:20050726T170000\r
-SUMMARY:FC Utrecht 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20050726T184500\r
-DESCRIPTION:FC UTRECHT 0\n\nARSENAL 3\nPires (pen) 13\nReyes 54\nHenry 7\r
- 7\n\nAustrian Tour\nPre-Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League quarter-final 1st leg\nStamford Bridge\r
-DTSTAMP:20040604T150255Z\r
-UID:5BE9DF57-153E-4C6E-819D-D4A2A8F5F029-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251918\r
-DTSTART;TZID=Europe/London:20040324T194500\r
-SUMMARY:Chelsea 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20040324T213000\r
-DESCRIPTION:CHELSEA 1\nGudjohnsen 53\nDesailly sent off 83\n\nARSENAL 1\\r
- nPires 59\n\nUEFA Champions League quarter-final 1st leg\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nCity of Manchester Stadium\r
-DTSTAMP:20040604T151701Z\r
-UID:75E6FF81-7E90-4687-ABDA-E4BE2A7B52B8-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234938\r
-DTSTART;TZID=Europe/London:20030831T160500\r
-SUMMARY:Manchester City 1-2 Arsenal\r
-DTEND;TZID=Europe/London:20030831T175000\r
-DESCRIPTION:MANCHESTER CITY 1\nLauren (og) 10\n\nARSENAL 2\nWiltord 47\n\r
- Ljungberg 71\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Old Trafford\nCarling Cup 5th round\r
-DTSTAMP:20041201T220238Z\r
-UID:2F02A638-9F94-4E40-AC02-BB576C3A9A1E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=241175\r
-DTSTART;TZID=Europe/London:20041201T194500\r
-SUMMARY:Man Utd 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20041201T213000\r
-DESCRIPTION:MANCHESTER UNITED 1\nBellion 1\n\nARSENAL 0\n\nCarling Cup 5\r
- th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T152105Z\r
-UID:9AAFC224-471D-4CC5-B774-312462078030-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234954\r
-DTSTART;TZID=Europe/London:20031214T140000\r
-SUMMARY:Arsenal 1-0 Blackburn Rovers\r
-DTEND;TZID=Europe/London:20031214T154500\r
-DESCRIPTION:ARSENAL 1\nBergkamp 11\n\nBLACKBURN ROVERS 0\n\nFA Barclayca\r
- rd Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:JJB Stadium\r
-DTSTAMP:20060704T214914Z\r
-UID:E8745B4A-A27B-459F-8A0C-2A2DDDEFD10A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:29\r
-DTSTART;TZID=Europe/London:20061213T194500\r
-SUMMARY:Wigan Athletic - Arsenal\r
-DTEND;TZID=Europe/London:20061213T213000\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20051102T221749Z\r
-UID:B48AA317-3109-4FE6-8CCF-0DD909DB31AA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=321734\r
-DTSTART;TZID=Europe/London:20051102T194500\r
-SUMMARY:Arsenal 3-0 Sparta Prague\r
-DTEND;TZID=Europe/London:20051102T213000\r
-DESCRIPTION:ARSENAL 3\nHenry 23\nVan Persie 81\, 86\n\nSPARTA PRAGUE 0\n\r
- \nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T121850Z\r
-UID:BC8BD6D1-A4AF-4DC3-9578-8830BF44CF8D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235206\r
-DTSTART;TZID=Europe/London:20030913T150000\r
-SUMMARY:Arsenal 1-1 Portsmouth\r
-DTEND;TZID=Europe/London:20030913T164500\r
-DESCRIPTION:ARSENAL 1\nHenry (pen) 40\n\nPORTSMOUTH 1\nSheringham 26\n\n\r
- FA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060824T150059Z\r
-UID:DC03BAD0-598F-4EFA-9ED4-353BA396DFBB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-DTSTART;TZID=Europe/London:20060823T200500\r
-SUMMARY:Arsenal 2-1 Dinamo Zagreb\r
-DESCRIPTION:ARSENAL 2\nLjungberg 77\nFlamini 90\n\n\nDINAMO ZAGREB 1\nda\r
-  Silva 12\n\nUEFA Champions League 3rd Qualification round\, leg 2\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nSt. Andrews\r
-DTSTAMP:20040604T152004Z\r
-UID:FF5B1C2F-E920-4BA8-A94C-67DAA1B87D82-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235154\r
-DTSTART;TZID=Europe/London:20031122T150000\r
-SUMMARY:Birmingham City 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20031122T164500\r
-DESCRIPTION:BIRMINGHAM CITY 0\n\nARSENAL 3\nFreddie Ljungberg 4\nDennis \r
- Bergkamp 80\nRobert Pires 88\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070404T194500\r
-SUMMARY:Champions League quarter-final 1\r
-UID:A40FE1FA-E3A6-48C1-85D7-7DDE8D162D38-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171102Z\r
-DESCRIPTION:Champions League quarter-final 1\r
-SEQUENCE:1\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Underhill\r
-DTSTAMP:20060715T170512Z\r
-UID:45C4A339-9185-4CD9-9090-3907A4D8D347-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20060715T150000\r
-SUMMARY:Barnet 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20060715T164500\r
-DESCRIPTION:BARNET 0\n\nARSENAL 0\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20040918T141854Z\r
-UID:703995B1-2360-4A6E-B147-F051B35E23D4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=226030\r
-DTSTART;TZID=Europe/London:20040918T124500\r
-SUMMARY:Arsenal 2-2 Bolton Wanderers\r
-DTEND;TZID=Europe/London:20040918T143000\r
-DESCRIPTION:ARSENAL 2\nHenry 31\nPires 66\n\nBOLTON WANDERERS 2\nJaidi 6\r
- 3\nPederson 85\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060711T140526Z\r
-UID:1B4A04D1-4777-46BA-8412-2D703EF4E4C2-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20060909T150000\r
-SUMMARY:Arsenal - Middlesbrough\r
-DTEND;TZID=Europe/London:20060909T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nOlimpiyskiy Stadion\r
-DTSTAMP:20040604T151855Z\r
-UID:13D0B6CF-49EB-41AC-9E81-BB32B522F1A9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243432\r
-DTSTART;TZID=Europe/London:20031021T194500\r
-SUMMARY:Dynamo Kyiv 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20031021T213000\r
-DESCRIPTION:DYNAMO KYIV 2\nShatskikh 27\nBelkevich 64\n\nARSENAL 1\nHenr\r
- y 80\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041016T161511Z\r
-UID:2417891F-6F94-4AD1-8EF5-FB0D01CD5CF5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=231260\r
-DTSTART;TZID=Europe/London:20041016T150000\r
-SUMMARY:Arsenal 3-1 Aston Villa\r
-DTEND;TZID=Europe/London:20041016T164500\r
-DESCRIPTION:ARSENAL 3\nPires 19\, 72\nHenry 45\n\nASTON VILLA 1\nHendrie\r
-  3\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060622T110841Z\r
-UID:4C08120D-A096-485F-B108-DF82A6A718DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20061014T150000\r
-SUMMARY:Arsenal - Watford\r
-DTEND;TZID=Europe/London:20061014T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nFratton Park\r
-DTSTAMP:20040604T145742Z\r
-UID:05A511E4-BE81-4EDA-8C53-491E883B8B48-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=253047\r
-DTSTART;TZID=Europe/London:20040504T200000\r
-SUMMARY:Portsmouth 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20040504T214500\r
-DESCRIPTION:PORTSMOUTH 1\nYakubu 30\n\nARSENAL 1\nReyes 49\n\nFA Barclay\r
- card Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Letná (Toyota Arena)\nUEFA Champions League\r
-DTSTAMP:20051022T113140Z\r
-UID:C10386CB-577B-40FA-B264-BB452E8F3516-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=316290\r
-DTSTART;TZID=Europe/London:20051018T194500\r
-SUMMARY:Sparta Prague 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20051018T213000\r
-DESCRIPTION:SPARTA PRAGUE 0\n\nARSENAL 2\nHenry 21\, 74\n(Henry breaks t\r
- he record as Arsenal's top scorer with his 185th and 186th goal for Arse\r
- nal)\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Reebok Stadium\nFA Cup Quarter-Final\r
-DTSTAMP:20050623T152217Z\r
-UID:C84E4E80-C1A8-403B-A7A2-6E8FBFCA537B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=261752\r
-DTSTART;TZID=Europe/London:20050312T121500\r
-SUMMARY:Bolton 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20050312T140000\r
-DESCRIPTION:BOLTON WANDERERS 0\n\nARSENAL 1\nLjungberg 3\n\nFA Cup Quart\r
- er-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060211T202910Z\r
-UID:D4F80617-14CD-44C4-A318-1A0C77958BC0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=362331\r
-DTSTART;TZID=Europe/London:20060211T150000\r
-SUMMARY:Arsenal 1-1 Bolton Wanderers\r
-DTEND;TZID=Europe/London:20060211T164500\r
-DESCRIPTION:ARSENAL 1\nGilberto 93\n\nBOLTON WANDERERS 1\nNolan 11\n\nBa\r
- rclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20051127T063810Z\r
-UID:3E131558-78BD-4D53-B3C9-B6E1D8A026E7-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=328532\r
-DTSTART;TZID=Europe/London:20051126T150000\r
-SUMMARY:Arsenal 3-0 Blackburn Rovers\r
-DTEND;TZID=Europe/London:20051126T164500\r
-DESCRIPTION:ARSENAL 3\nFabregas 4\nHenry 45\nVan Persie 90\n\nBLACKBURN \r
- ROVERS 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Community Shield\nMillennium Stadium\, Cardiff\r
-DTSTAMP:20040818T214707Z\r
-UID:3C060C0E-D004-4886-808F-A0253C4C8E7C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=218062\r
-DTSTART;TZID=Europe/London:20040808T150000\r
-SUMMARY:Arsenal 3-1 ManUtd\r
-DTEND;TZID=Europe/London:20040808T164500\r
-DESCRIPTION:ARSENAL 3\nGilberto 49\nReyes 59 \nSilvestre 79 (og)\n\nMANC\r
- HESTER UNITED 1\nSmith 54\n\nFA Community Shield\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070502T194500\r
-SUMMARY:Champions League semi-final 2\r
-UID:52A2AAC0-899A-42C8-9C9C-D761094F8E15-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171734Z\r
-DESCRIPTION:Champions League semi-final 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060704T214926Z\r
-UID:7EF6FEA7-C59E-42E8-BD99-430CDB8A5A74-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTART;TZID=Europe/London:20070210T150000\r
-SUMMARY:Arsenal - Wigan Athletic\r
-DTEND;TZID=Europe/London:20070210T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Stadium of Light\nBarclays Premiership\r
-DTSTAMP:20060809T121441Z\r
-UID:2A8C05B3-7CCE-4591-8E50-95F0AF8CF449-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-DTSTART;TZID=Europe/London:20060501T171500\r
-SUMMARY:Sunderland 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20060501T190000\r
-DESCRIPTION:SUNDERLAND 0\n\nARSENAL 3\nCollins 28 (og)\nFabregas 40\nHen\r
- ry 43\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060717T153613Z\r
-UID:19EBD194-F2D9-406D-B1EF-985E096EF6D9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-DTSTART;TZID=Europe/London:20061202T124500\r
-SUMMARY:Arsenal - Tottenham\r
-DTEND;TZID=Europe/London:20061202T143000\r
-DESCRIPTION:Live on Sky Sports PremPlus\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:El Madrigal\nUEFA Champions League Semi-Final 2nd Leg\r
-DTSTAMP:20060809T121430Z\r
-UID:CF307027-1716-4479-B75A-EE6467E30B28-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-DTSTART;TZID=Europe/London:20060425T194500\r
-SUMMARY:Villarreal CF 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20060425T213000\r
-DESCRIPTION:VILLAREAL 0\n\nARSENAL 0\n\nUEFA Champions League Semi-Final\r
\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172454Z\r
-UID:DFE534AD-2FC2-4AA7-8D7B-8DD017EC4612-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070428T150000\r
-SUMMARY:Arsenal - Fulham\r
-DTEND;TZID=Europe/London:20070428T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League Quarter-final 2nd leg\nHighbury\r
-DTSTAMP:20040604T150211Z\r
-UID:426D2286-0D1E-4CB5-9A79-826BE2B7F2FC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251919\r
-DTSTART;TZID=Europe/London:20040406T194500\r
-SUMMARY:Arsenal 1-2 Chelsea\r
-DTEND;TZID=Europe/London:20040406T213000\r
-DESCRIPTION:ARSENAL 1\nReyes 45\n\nCHELSEA 2\nLampard 51\nBridge 87\n\nU\r
- EFA Champions League quarter-final 2nd leg\nChelsea win 3-2 on aggregate\r
\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070217T150000\r
-DTEND;TZID=Europe/London:20070217T164500\r
-SUMMARY:F.A. Cup 5th round\r
-UID:32F08781-3022-44AB-8D66-84E55B90B00C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTAMP:20060623T172558Z\r
-DESCRIPTION:F.A. Cup 5th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nCarling Cup 4th round\r
-DTSTAMP:20051130T071822Z\r
-UID:A4A1C7D0-7AC8-45A8-888F-B41E30301ED2-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=329487\r
-DTSTART;TZID=Europe/London:20051129T194500\r
-SUMMARY:Arsenal 3-0 Reading\r
-DTEND;TZID=Europe/London:20051129T213000\r
-DESCRIPTION:ARSENAL 3\nReyes 12\nVan Persie 42\nLupoli 65\n\nREADING 0\n\r
- \nCarling Cup 4th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Millennium Stadium\, Cardiff\nFA Cup Semi-Final\r
-DTSTAMP:20050417T200307Z\r
-UID:70094E6E-6783-4B69-8E16-14FDDA94C047-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=269980\r
-DTSTART;TZID=Europe/London:20050416T121500\r
-SUMMARY:Arsenal 3-0 Blackburn Rovers\r
-DTEND;TZID=Europe/London:20050416T140000\r
-DESCRIPTION:ARSENAL 3\nPires 42\nVan Persie 86\, 90\n\nBLACKBURN ROVERS \r
- 0\n\nFA Cup Semi-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Anfield\nBarclays Premiership\r
-DTSTAMP:20060215T060540Z\r
-UID:C5D76CAF-567F-44B3-BCCF-9DBA8BECEE67-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:49\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=363382\r
-DTSTART;TZID=Europe/London:20060214T200000\r
-SUMMARY:Liverpool 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060214T214500\r
-DESCRIPTION:LIVERPOOL 1\nGarcia 87\n\nARSENAL 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Amsterdam Tournament\nArenA Amsterdam\r
-DTSTAMP:20060414T115522Z\r
-UID:D0FD6050-D64C-436F-8558-735C4CF9BFFD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216699\r
-DTSTART;TZID=Europe/Oslo:20040801T204500\r
-SUMMARY:Ajax 0-0 Arsenal\r
-DTEND;TZID=Europe/Oslo:20040801T223000\r
-DESCRIPTION:AJAX 0\n\nARSENAL 0\n\nPre-season friendly\nAmsterdam Tourna\r
- ment\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Reebok Stadium\nFA Barclays Premiership\r
-DTSTAMP:20050115T194414Z\r
-UID:897F94A8-1A95-4E30-970A-30807951D575-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=249732\r
-DTSTART;TZID=Europe/London:20050115T171500\r
-SUMMARY:Bolton Wanderers 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20050115T190000\r
-DESCRIPTION:BOLTON WANDERERS 1\nGiannakopoulos 41\n\nARSENAL 0\n\nFA Bar\r
- clays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nCarling Cup Semi-Final 2nd Leg\r
-DTSTAMP:20060129T004945Z\r
-UID:22F348B2-0194-45AC-8247-39E621BCFEA7-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=356504\r
-DTSTART;TZID=Europe/London:20060124T194500\r
-SUMMARY:Arsenal 2-1 Wigan Athletic\r
-DTEND;TZID=Europe/London:20060124T213000\r
-DESCRIPTION:ARSENAL 2\nHenry 65\nVan Persie 108\n\nWIGAN ATHLETIC 1\nRob\r
- erts 120\n\n(agg. 2-2 Wigan wins on away goals)\n\nCarling Cup Semi-Fina\r
- l\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Villa Park\nBarclays Premiership\r
-DTSTAMP:20051231T150645Z\r
-UID:48442716-45AD-4A01-8C72-A0D4D85B2C38-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346483\r
-DTSTART;TZID=Europe/London:20051231T124500\r
-SUMMARY:Aston Villa 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20051231T143000\r
-DESCRIPTION:ASTON VILLA 0\n\nARSENAL 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Maksimir Stadium\, Croatia\r
-DTSTAMP:20060809T113209Z\r
-UID:E186DB7A-0894-448A-89BE-0B0BE1AB626E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:18\r
-DTSTART;TZID=Europe/London:20060808T200500\r
-SUMMARY:Dinamo Zagreb 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20060808T215000\r
-DESCRIPTION:DINAMO ZAGREB 0\n\nARSENAL 3\nFabregas 63\, 79\nVan Persie 6\r
- 4\n\nUEFA Champions League 3rd Qualification round\, leg 1\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070409T150000\r
-LOCATION:St. James' Park\r
-DTEND;TZID=Europe/London:20070409T164500\r
-SUMMARY:Newcastle Utd - Arsenal\r
-UID:8EB7AC23-EA1E-4532-8918-EF495E82405F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTAMP:20060623T171234Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nJudenburg (Austria)\r
-DTSTAMP:20040726T195042Z\r
-UID:1F0EFAA8-F4BF-493E-8812-95A5F56BE2D8-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=208968\r
-DTSTART;TZID=Europe/Oslo:20040724T180000\r
-SUMMARY:Grazer AK 1-2 Arsenal\r
-DTEND;TZID=Europe/Oslo:20040724T194500\r
-DESCRIPTION:GRAZER AK 1\nSkoro 24\n\nARSENAL 2\nBergkamp 6\nVan Persie 5\r
- 7\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070110T200000\r
-DTEND;TZID=Europe/London:20070110T214500\r
-SUMMARY:Carling Cup Semi-Final (1)\r
-UID:37140F55-2259-4268-A255-20837322733C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTAMP:20060623T165804Z\r
-DESCRIPTION:Carling Cup Semi-final (1)\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Goodison Park\nBarclays Premiership\r
-DTSTAMP:20060121T171925Z\r
-UID:17A2E135-14AC-4A63-B317-7F6DC3C7C374-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:15\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=355324\r
-DTSTART;TZID=Europe/London:20060121T124500\r
-SUMMARY:Everton 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060121T143000\r
-DESCRIPTION:EVERTON 1\nBeattie 13\n\nARSENAL 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Amsterdam Arena\nPre-Season Friendly\r
-DTSTAMP:20050731T191357Z\r
-UID:66FECE64-263F-4C68-B76A-D3D60AE02240-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:18\r
-DTSTART;TZID=Europe/London:20050731T173000\r
-SUMMARY:Porto 1-2 Arsenal\r
-DTEND;TZID=Europe/London:20050731T191500\r
-DESCRIPTION:PORTO 1\nLisandro 37\n\nARSENAL 2\nLjungberg 49\, 58\n\nAmst\r
- erdam Tournament\nPre-Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Olympic Stadium\, Munich\nUEFA Champions League\r
-DTSTAMP:20050222T220730Z\r
-UID:8AD7015D-6C0C-4D33-BB7A-6EC49CD3C735-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=257563\r
-DTSTART;TZID=Europe/London:20050222T194500\r
-SUMMARY:Bayern München 3-1 Arsenal\r
-DTEND;TZID=Europe/London:20050222T213000\r
-DESCRIPTION:BAYERN MUNICH 3\nPizarro 4\, 58\nSalihamidzic 65\n\nARSENAL \r
- 1\nToure 88\n\nUEFA Champions League\nKnockout\, 1st leg\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150155Z\r
-UID:D4802891-6EC9-4964-975C-1B977B7C4FF1-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234864\r
-DTSTART;TZID=Europe/London:20040409T123000\r
-SUMMARY:Arsenal 4-2 Liverpool\r
-DTEND;TZID=Europe/London:20040409T141500\r
-DESCRIPTION:ARSENAL 4\nHenry 31\, 50\, 78\nPires 49\n\nLIVERPOOL 2\nHyyp\r
- ia 5\nOwen 42\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T114806Z\r
-UID:50E3810D-B9C2-4DB7-8FE1-B8CD479D4B79-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/matchreport.asp?thisNav=first%20tea\r
- m&fxid=291996&cpid=703&clid=4421\r
-DTSTART;TZID=Europe/London:20060312T160000\r
-SUMMARY:Arsenal 2-1 Liverpool\r
-DTEND;TZID=Europe/London:20060312T174500\r
-DESCRIPTION:ARSENAL 2\nHenry 21\, 84\n\nLIVERPOOL 1\nLuis García 75\n\nB\r
- arclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nUnderhill Stadium\, Barnet\r
-DTSTAMP:20040718T171057Z\r
-UID:5D8C9C3B-72DA-48C7-AAAE-62A382C1A9F9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=214145\r
-DTSTART;TZID=Europe/London:20040717T150000\r
-SUMMARY:Barnet 1-10 Arsenal\r
-DTEND;TZID=Europe/London:20040717T164500\r
-DESCRIPTION:BARNET 1\nGraham 12\n\nARSENAL 10\nReyes 19\, 21\, 42\nvan P\r
- ersie 29\nBergkamp 44\, 67\nJeffers 53\, 55\, 64\nOwusu-Abeyie 70\n\nPre\r
- -season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060622T110941Z\r
-UID:32AC335F-D09A-446B-A321-BC7A56173D5C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061216T150000\r
-SUMMARY:Arsenal - Portsmouth\r
-DTEND;TZID=Europe/London:20061216T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Vicarage Road\r
-DTSTAMP:20060704T214454Z\r
-UID:157D0C10-02AA-4459-A812-4ED052F13E0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/London:20061226T173000\r
-SUMMARY:Watford - Arsenal\r
-DTEND;TZID=Europe/London:20061226T191500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carling Cup 3rd Round\nHighbury\r
-DTSTAMP:20040604T151917Z\r
-UID:29050B7B-BC7C-4863-BE79-74E3BD5045CA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=246035\r
-DTSTART;TZID=Europe/London:20031028T194500\r
-SUMMARY:Arsenal 1(9)-1(8) Rotherham United\r
-DTEND;TZID=Europe/London:20031028T213000\r
-DESCRIPTION:ARSENAL 1(9)\nJeremie Aliadiere 11\n\nROTHERHAM UNITED 1(8)\\r
- nDarren Byfield 90\nMike Pollitt s.o. 100\n\nCarling Cup 3rd Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Old Trafford\nFA Barclays Premiership\r
-DTSTAMP:20060809T113940Z\r
-UID:4BC6EFC3-2F24-4242-8C36-58DE1B6CCE2F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=232920\r
-DTSTART;TZID=Europe/London:20041024T160500\r
-SUMMARY:Manchester Utd 2-0 Arsenal\r
-DTEND;TZID=Europe/London:20041024T175000\r
-DESCRIPTION:MANCHESTER UNITED 2\nVan Nistelrooy 73 (pen)\nRooney 90\n\nA\r
- RSENAL 0\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nVilla Park\r
-DTSTAMP:20060809T122040Z\r
-UID:370B96EE-D9DB-4D94-BDA6-F26AA60EEB7E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235054\r
-DTSTART;TZID=Europe/London:20040118T140000\r
-SUMMARY:Aston Villa 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20040118T154500\r
-DESCRIPTION:ASTON VILLA 0\n\nARSENAL 2\nHenry 28\, 52 (pen)\n\nFA Barcla\r
- ycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Meadow Lodge\, Broughinge Road\nPre-Season Friendly\r
-DTSTAMP:20060809T122643Z\r
-UID:2A9156A9-4218-4037-9DCA-9FD4B1121101-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:25\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=297925\r
-DTSTART;TZID=Europe/London:20050810T193000\r
-SUMMARY:Boreham Wood 2-6 Arsenal XI\r
-DTEND;TZID=Europe/London:20050810T211500\r
-DESCRIPTION:BOREHAM WOOD 2\nArcher 55\nCooper 66 (pen)\n\nARSENAL XI 6\n\r
- Van Persie 6\, 14\nReyes 33 (pen)\, 45\, 71 (pen)\nPires 39\n\nPre-Seaso\r
- n Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070411T194500\r
-SUMMARY:Champions League quarter-final 2\r
-UID:1B5492F8-2E40-4667-9225-3432559E98BA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171323Z\r
-DESCRIPTION:Champions League quarter-final 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Reebok Stadium\nFA Cup 4th Round\r
-DTSTAMP:20060129T005104Z\r
-UID:6EA00A92-F433-4EE9-AD9E-6EF8A52D4E00-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=357676\r
-DTSTART;TZID=Europe/London:20060128T174000\r
-SUMMARY:Bolton 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060128T192500\r
-DESCRIPTION:BOLTON WANDERERS 1\nStelios 84\n\nARSENAL 0\n\nFA Cup 4th Ro\r
- und\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070501T194500\r
-SUMMARY:Champions League semi-final 2\r
-UID:A7A4F3CC-AAE6-4B05-BA75-EE65C74C0A05-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171740Z\r
-DESCRIPTION:Champions League semi-final 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Hawthorns\nFA Barclays Premiership\r
-DTSTAMP:20050503T142456Z\r
-UID:53BCBAC7-C3E0-4B79-997F-40B9580E3FCD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=273320\r
-DTSTART;TZID=Europe/London:20050502T200000\r
-SUMMARY:West Bromwich Albion 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20050502T214500\r
-DESCRIPTION:WEST BROMWICH ALBION 0\n\nARSENAL 2\nVan Persie 66\nEdu 90\n\r
- \nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Rebook Stadium\r
-DTSTAMP:20060717T153551Z\r
-UID:205B447A-02C0-4546-B73A-D186D76E6D7B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/London:20061125T171500\r
-SUMMARY:Bolton Wanderers - Arsenal\r
-DTEND;TZID=Europe/London:20061125T190000\r
-DESCRIPTION:Live on Sky Sports PremPlus\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Cup 5th round\r
-DTSTAMP:20050220T070742Z\r
-UID:792614F3-3B1A-4D78-8001-FBFDFF33A8B5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=256784\r
-DTSTART;TZID=Europe/London:20050219T123000\r
-SUMMARY:Arsenal 1-1 Sheffield Utd\r
-DTEND;TZID=Europe/London:20050219T141500\r
-DESCRIPTION:ARSENAL 1\nPires 78\n\nSHEFFIELD UNITED 1\nGray 90 (pen)\n\n\r
- FA Cup 5th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060622T110947Z\r
-UID:E674357E-C2E4-409E-93CE-1C18FFA677F3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061223T150000\r
-SUMMARY:Arsenal - Blackburn Rovers\r
-DTEND;TZID=Europe/London:20061223T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20061025T200000\r
-DTEND;TZID=Europe/London:20061025T214500\r
-SUMMARY:Carling Cup 3rd round\r
-UID:EA2700D9-0FD4-431C-8C5F-38E54619DECD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-DTSTAMP:20060622T104844Z\r
-DESCRIPTION:Carling Cup 3rd round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T121242Z\r
-UID:D4479C5C-AA03-4337-9B17-C456D99DCB62-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/London:20060401T150000\r
-SUMMARY:Arsenal 5-0 Aston Villa\r
-DTEND;TZID=Europe/London:20060401T164500\r
-DESCRIPTION:ARSENAL 5\nAdebayor 18\nHenry 25\, 46\nVan Persie 72\nDiaby \r
- 81\n\nASTON VILLA 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stadium of Light\nCarling Cup 3rd round\r
-DTSTAMP:20051026T130414Z\r
-UID:45C56563-C9C8-43ED-B282-217844AF8744-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=319640\r
-DTSTART;TZID=Europe/London:20051025T194500\r
-SUMMARY:Sunderland 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20051025T213000\r
-DESCRIPTION:SUNDERLAND 0\n\nARSENAL 3\nEboue 61\nVan Persie 67 (pen)\, 8\r
- 7\n\nCarling Cup 3rd round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150452Z\r
-UID:1F9E3A34-42A9-47C9-84C5-DCA4168BE002-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235024\r
-DTSTART;TZID=Europe/London:20040228T150000\r
-SUMMARY:Arsenal 2-1 Charlton Athletic\r
-DTEND;TZID=Europe/London:20040228T164500\r
-DESCRIPTION:ARSENAL 2\nPires 2\nHenry 4\n\nCHARLTON 1\nJensen 59\n\nFA B\r
- arclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150741Z\r
-UID:1159A274-CE6A-476A-8E7C-1CFE18881F59-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235044\r
-DTSTART;TZID=Europe/London:20040110T150000\r
-SUMMARY:Arsenal 4-1 Middlesbrough\r
-DTEND;TZID=Europe/London:20040110T164500\r
-DESCRIPTION:ARSENAL 4\nHenry 38 (pen)\nQuedrue 45 (o.g.)\nPires 57\nLjun\r
- gberg 68\n\nMIDDLESBROUGH 1\nMaccarone 86 (pen)\n\nFA Barclaycard Premie\r
- rship\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050123T200851Z\r
-UID:4098B064-EE52-48BB-8CF2-111CB788DBD6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=250892\r
-DTSTART;TZID=Europe/London:20050123T160500\r
-SUMMARY:Arsenal 1-0 Newcastle\r
-DTEND;TZID=Europe/London:20050123T175000\r
-DESCRIPTION:ARSENAL 1\nBergkamp 19\n\nNEWCASTLE UNITED 0\n\nFA Barclays \r
- Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041229T220436Z\r
-UID:573F2D10-2364-4D2E-9F87-E70556231A45-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=245320\r
-DTSTART;TZID=Europe/London:20041226T130000\r
-SUMMARY:Arsenal 2-0 Fulham\r
-DTEND;TZID=Europe/London:20041226T144500\r
-DESCRIPTION:ARSENAL 2\nHenry 12\nPires 71\n\nFULHAM 0\n\nFA Barclays Pre\r
- miership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nFreethiel Stadium\, Beveren\, Belgium\r
-DTSTAMP:20040604T151539Z\r
-UID:A3BE1B50-F69A-4375-9EFC-300CCE7FE5B0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20030803T170000\r
-SUMMARY:KSK Beveren 2-2 Arsenal XI\r
-DTEND;TZID=Europe/London:20030803T184500\r
-DESCRIPTION:KSK BEVEREN 2\nConstant Kaïper 85\nGilles Yapi Yapo 88\n\nAR\r
- SENAL XI 2\nNicky Nicolau 55\nQuincy Owusu Abeyie 76\n\nPre-season frien\r
- dly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Stadio Delle Alpi\nUEFA Champions League Quarter-Final 2nd Leg\r
-DTSTAMP:20060809T121304Z\r
-UID:522D73F1-4887-4556-A62C-EBEF99F7E556-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-DTSTART;TZID=Europe/London:20060405T194500\r
-SUMMARY:Juventus 0-0 Arsenal\r
-DESCRIPTION:JUVENTUS 0\n\nARSENAL 0\n\n(Arsenal wins 2-0 on aggregate)\n\r
- \nUEFA Champions League Quarter-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T121717Z\r
-UID:0AC7A6F9-CDD8-4635-B760-2914CB284B7F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:15\r
-DTSTART;TZID=Europe/London:20060507T150000\r
-SUMMARY:Arsenal 4-2 Wigan Athletic\r
-DTEND;TZID=Europe/London:20060507T164500\r
-DESCRIPTION:ARSENAL 4\nPires 8\nHenry 35\, 56\, 76 (pen)\n\nWIGAN ATHLET\r
- IC 2\nScharner 10\nThompson 34\n\nBarclays Premiership\n\nThe final matc\r
- h at Highbury!\n\nChelsea       38  29-4-5    72-22  91\nMan Utd         38  25-\r
- 8-5   72-34  83\nLiverpool     38  25-7-6     57-25  82\nArsenal         38  20-7-1\r
- 1     68-31  67\nTottenham  38  18-11-9       53-38  65\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:St James' Park\nFA Barclays Premiership\r
-DTSTAMP:20041229T220527Z\r
-UID:497FA544-3DFC-4EB7-BB1F-C540C8A4748B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20041229T200000\r
-SUMMARY:Newcastle Utd 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20041229T214500\r
-DESCRIPTION:NEWCASTLE UNITED 0\n\nARSENAL 1\nVieira 45\n\nFA Barclays Pr\r
- emiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:City of Manchester Stadium\nFA Barclays Premiership\r
-DTSTAMP:20040925T181218Z\r
-UID:2B9C752E-C90B-47E6-B890-520A90AD2866-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=227192\r
-DTSTART;TZID=Europe/London:20040925T150000\r
-SUMMARY:Manchester City 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20040925T164500\r
-DESCRIPTION:MANCHESTER CITY 0\n\nARSENAL 1\nCole 14\n\nFA Barclays Premi\r
- ership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Riverside\r
-DTSTAMP:20051213T180511Z\r
-UID:72978E0E-68EA-4CA6-B9F7-3E574DDCB450-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/sportsappcontroller.jsp?command=for\r
- wardOnly&nextPage=/matchday/reports/200102/middlesbrough18082001.jsp\r
-STATUS:CONFIRMED\r
-DTSTART;TZID=Europe/London:20010818T150000\r
-SUMMARY:Middlesbrough 0-4 Arsenal\r
-DTEND;TZID=Europe/London:20010818T164500\r
-DESCRIPTION:MIDDLESBROUGH 0\n Ugo Ehiogu s.o. 85\n\n ARSENAL 4\n Thierry\r
-  Henry 43\n Ray Parlour s.o. 51\n Robert Pires 85 (pen)\n Dennis Bergkam\r
- p 87\, 88\n\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070220T194500\r
-DTEND;TZID=Europe/London:20070220T213000\r
-SUMMARY:Champions League knockout round 1\r
-UID:52155DF8-6458-4074-B277-EFCD4B37AD44-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTAMP:20060623T170502Z\r
-DESCRIPTION:Champions League knockout round 1\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nRiverside Stadium\r
-DTSTAMP:20040604T151646Z\r
-UID:4B967B52-4C17-4C3E-A923-D587ED7596D1-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234919\r
-DTSTART;TZID=Europe/London:20030824T160500\r
-SUMMARY:Middlesbrough 0-4 Arsenal\r
-DTEND;TZID=Europe/London:20030824T175000\r
-DESCRIPTION:MIDDLESBROUGH 0\n\nARSENAL 4\nHenry 5\nGilberto 13\nWiltord \r
- 22\, 60\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nGoodison Park\r
-DTSTAMP:20040604T150750Z\r
-UID:72C792B1-55E9-4A51-AD60-28E30464FA0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235037\r
-DTSTART;TZID=Europe/London:20040107T200000\r
-SUMMARY:Everton 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20040107T214500\r
-DESCRIPTION:EVERTON 1\nRadzinski 75\n\nARSENAL 1\nKanu 29\n\nFA Barclayc\r
- ard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Fratton Park\r
-DTSTAMP:20060623T172355Z\r
-UID:894B1BF5-97DA-4B14-8B31-3ABC6D0EA6FD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070513T150000\r
-SUMMARY:Portsmouth - Arsenal\r
-DTEND;TZID=Europe/London:20070513T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:White Hart Lane\nBarclays Premiership\r
-DTSTAMP:20051029T181848Z\r
-UID:14E6270C-5BB7-4D60-9580-616D767992AD-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=320563\r
-DTSTART;TZID=Europe/London:20051029T130000\r
-SUMMARY:Tottenham Hotspur 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20051029T144500\r
-DESCRIPTION:TOTTENHAM HOTSPUR 1\nKing 17\n\nARSENAL 1\nPires 77\n\nBarcl\r
- ays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070410T194500\r
-SUMMARY:Champions League quarter-final 2\r
-UID:D1F4686F-B73D-4E8C-AA3D-8F48900407DE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T171314Z\r
-DESCRIPTION:Champions League quarter-final 2\r
-SEQUENCE:3\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041204T170053Z\r
-UID:FA62CA4A-3B2D-407A-AC23-D02F996019B4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=241472\r
-DTSTART;TZID=Europe/London:20041204T150000\r
-SUMMARY:Arsenal 3-0 Birmingham City\r
-DTEND;TZID=Europe/London:20041204T164500\r
-DESCRIPTION:ARSENAL 3\nPires 33\nHenry 79\nHenry 86\n\nBIRMINGHAM CITY 0\r
- \n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T121347Z\r
-UID:689F407D-FF0B-4C03-808C-0B0DAA92F673-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20060415T150000\r
-SUMMARY:Arsenal 3-1 West Bromwich Albion\r
-DTEND;TZID=Europe/London:20060415T164500\r
-DESCRIPTION:ARSENAL 3\nHleb 44\nPires 76\nBergkamp 89\n\nWEST BROMWICH A\r
- LBION 1\nQuashie 72\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nElland Road\r
-DTSTAMP:20040604T151928Z\r
-UID:7CEC9125-0F28-459A-94B2-719E36EFB503-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235137\r
-DTSTART;TZID=Europe/London:20031101T150000\r
-SUMMARY:Leeds United 1-4 Arsenal\r
-DTEND;TZID=Europe/London:20031101T164500\r
-DESCRIPTION:LEEDS UNITED 1\nAlan Smith 64\n\nARSENAL 4\nThierry Henry 8\\r
- , 33\nRobert Pires 18\nGilberto 50\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041212T201820Z\r
-UID:7BD47DF1-3D25-405C-96E3-53143F3124C9-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=242880\r
-DTSTART;TZID=Europe/London:20041212T160500\r
-SUMMARY:Arsenal 2-2 Chelsea\r
-DTEND;TZID=Europe/London:20041212T175000\r
-DESCRIPTION:ARSENAL 2\nHenry 2\, 29\n\nCHELSEA 2\nTerry 17\nGudjohnsen 4\r
- 6\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20061108T200000\r
-DTEND;TZID=Europe/London:20061108T214500\r
-SUMMARY:Carling Cup 4th round\r
-UID:D55DACF9-4E4A-4E06-8FA3-9BE0D543098F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-DTSTAMP:20060622T105044Z\r
-DESCRIPTION:Carling Cup 4th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nMaribor (Slovenia)\r
-DTSTAMP:20040726T195100Z\r
-UID:DD833159-DEDD-4E8D-A442-56BD95BB8B31-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=215261\r
-DTSTART;TZID=Europe/Oslo:20040722T193000\r
-SUMMARY:NK Maribor 2-3 Arsenal\r
-DTEND;TZID=Europe/Oslo:20040722T211500\r
-DESCRIPTION:NK MARIBOR 2\nRakic 62\, 86\n\nARSENAL 3\nBergkamp 4\nAliadi\r
- ere 16\nvan Persie 84\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nUnderhill\, Barnet\r
-DTSTAMP:20040604T151411Z\r
-UID:ECE59CCB-BA5C-4F69-81DA-09CB5DBAE95B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241305\r
-DTSTART;TZID=Europe/London:20030719T150000\r
-SUMMARY:Barnet 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20030719T164500\r
-DESCRIPTION:BARNET 0\n\nARSENAL 0\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:JJB Stadium\nCarling Cup Semi-Final 1st Leg\r
-DTSTAMP:20060111T003811Z\r
-UID:B1F22B2D-EDA2-4F57-A861-317625F5E68C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=351860\r
-DTSTART;TZID=Europe/London:20060110T194500\r
-SUMMARY:Wigan Athletic 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20060110T213000\r
-DESCRIPTION:WIGAN ATHLETIC 1\nScharner 77\n\nARSENAL 0\n\nCarling Cup Se\r
- mi-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carrow Road\nFA Barclays Premiership\r
-DTSTAMP:20040911T165657Z\r
-UID:FC8E3299-F87C-48F1-810D-3FD04D379FB0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=222332\r
-DTSTART;TZID=Europe/London:20040828T171500\r
-SUMMARY:Norwich City 1-4 Arsenal\r
-DTEND;TZID=Europe/London:20040828T190000\r
-DESCRIPTION:NORWICH CITY 1\nHuckerby 50 (pen)\n\nARSENAL 4\nReyes 22\nHe\r
- nry 36\nPires 40\nBergkamp 90\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup 6th Round\nFratton Park\r
-DTSTAMP:20040604T150343Z\r
-UID:A3533E11-D054-4E19-B2CC-B7F0A4C4E9D3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=250685\r
-DTSTART;TZID=Europe/London:20040306T180000\r
-SUMMARY:Portsmouth 1-5 Arsenal\r
-DTEND;TZID=Europe/London:20040306T194500\r
-DESCRIPTION:PORTSMOUTH 1\nSheringham 90\n\nARSENAL 5\nHenry 25\, 50\nLju\r
- ngberg 43\, 57\nToure 45\n\nFA Cup 6th Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nEwood Park\r
-DTSTAMP:20040604T150316Z\r
-UID:442C8C92-8482-466E-9993-8D4E326B2FA0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235075\r
-DTSTART;TZID=Europe/London:20040313T150000\r
-SUMMARY:Blackburn Rovers 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20040313T164500\r
-DESCRIPTION:BLACKBURN ROVERS 0\n       \nARSENAL 2\nHenry 56\nPires 87\n\nFA \r
- Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:White Hart Lane\r
-DTSTAMP:20060623T172341Z\r
-UID:9713C2DE-37D8-451B-A358-BBC748AD850D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070421T150000\r
-SUMMARY:Tottenham - Arsenal\r
-DTEND;TZID=Europe/London:20070421T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Anfield\r
-DTSTAMP:20060623T172330Z\r
-UID:EC355FCA-B9D6-4269-8B24-86FB5B2107E0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070331T150000\r
-SUMMARY:Liverpool - Arsenal\r
-DTEND;TZID=Europe/London:20070331T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20050915T082543Z\r
-UID:9DF1956F-858F-4D58-BF87-A6FA9700BA52-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=307637\r
-DTSTART;TZID=Europe/London:20050914T194500\r
-SUMMARY:Arsenal 2-1 FC Thun\r
-DESCRIPTION:ARSENAL 2\nGilberto 51\nBergkamp 90\n\nFC THUN 1\nFerreira 5\r
- 3 \n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Reebok Stadium\r
-DTSTAMP:20060623T165849Z\r
-UID:B5BD4095-3C40-45D9-B4DF-20BBCC2D3D9E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070113T150000\r
-SUMMARY:Blackburn Rovers - Arsenal\r
-DTEND;TZID=Europe/London:20070113T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20040826T080023Z\r
-UID:01E2121F-041C-4232-B922-9386227E81C4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=221872\r
-DTSTART;TZID=Europe/London:20040825T194500\r
-SUMMARY:Arsenal 3-0 Blackburn Rovers\r
-DTEND;TZID=Europe/London:20040825T213000\r
-DESCRIPTION:ARSENAL 3\nHenry 50\nFabregas 58\nReyes 79\n\nBLACKBURN ROVE\r
- RS 0\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T151653Z\r
-UID:A1568B33-EE9F-4082-BEC7-6B72DAC08F0D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234924\r
-DTSTART;TZID=Europe/London:20030827T194500\r
-SUMMARY:Arsenal 2-0 Aston Villa\r
-DTEND;TZID=Europe/London:20030827T213000\r
-DESCRIPTION:ARSENAL 2\nCampbell 57\nHenry 90\n\nASTON VILLA 0\n\nFA Barc\r
- laycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Riverside Stadium\r
-DTSTAMP:20060623T172308Z\r
-UID:26BEA88C-A703-4B58-BC90-0CC7D1DD31DF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070203T150000\r
-SUMMARY:Middlesbrough - Arsenal\r
-DTEND;TZID=Europe/London:20070203T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Cup 3rd Round\r
-DTSTAMP:20060107T223140Z\r
-UID:97C0F4C8-8966-44BC-9632-92F172E00D4B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:16\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=350760\r
-DTSTART;TZID=Europe/London:20060107T130000\r
-SUMMARY:Arsenal 2-1 Cardiff City\r
-DTEND;TZID=Europe/London:20060107T144500\r
-DESCRIPTION:ARSENAL 2\nPires 6\, 18\n\nCARDIFF CITY 1\nJerome 86\n\nFA C\r
- up 3rd Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050509T142242Z\r
-UID:9B91852C-9DCF-4206-9BCF-64DFCDE45E85-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=274644\r
-DTSTART;TZID=Europe/London:20050508T160500\r
-SUMMARY:Arsenal 3-1 Liverpool\r
-DTEND;TZID=Europe/London:20050508T175000\r
-DESCRIPTION:ARSENAL 3\nPires 25\nReyes 29\nFabregas 90\n\nLIVERPOOL 1\nG\r
- errard 51\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070403T194500\r
-DTEND;TZID=Europe/London:20070403T213000\r
-SUMMARY:Champions League quarter-final 1\r
-UID:C54107A9-DA6B-42F6-AEB9-52E0897774A5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTAMP:20060623T171056Z\r
-DESCRIPTION:Champions League quarter-final 1\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup semi-final\nVilla Park\r
-DTSTAMP:20040604T150235Z\r
-UID:651D5D1B-199C-44B7-B8CA-4DB1E816D8CE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=251863\r
-DTSTART;TZID=Europe/London:20040403T120000\r
-SUMMARY:Arsenal 0-1 Manchester Utd\r
-DTEND;TZID=Europe/London:20040403T134500\r
-DESCRIPTION:ARSENAL 0\n\nMANCHESTER UTD 1\nScholes 32\n\nFA Cup semi-fin\r
- al\n\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Riverside Stadium\nFA Barclays Premiership\r
-DTSTAMP:20050410T073659Z\r
-UID:4CD548C4-C06E-4709-B0B5-47D309E77AFE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=268765\r
-DTSTART;TZID=Europe/London:20050409T150000\r
-SUMMARY:Middlesbrough 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20050409T164500\r
-DESCRIPTION:MIDDLESBROUGH 0\n\nARSENAL 1\nPires 73\n\nFA Barclays Premie\r
- rship\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stade de Suisse\nUEFA Champions League\r
-DTSTAMP:20051122T224142Z\r
-UID:AE260A19-3BA3-46E0-B060-2AB0502FD2D0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=326177\r
-DTSTART;TZID=Europe/London:20051122T194500\r
-SUMMARY:FC Thun 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20051122T213000\r
-DESCRIPTION:FC THUN 0\n\nARSENAL 1\nPires 88 (pen)\n\nUEFA Champions Lea\r
- gue\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Apostolos Nikolaidis Stadium\nUEFA Champions League\r
-DTSTAMP:20041020T210440Z\r
-UID:44B78CE2-0B08-47BD-8A44-7FC8512C7296-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=232660\r
-DTSTART;TZID=Europe/London:20041020T194500\r
-SUMMARY:Panathinaikos 2-2 Arsenal\r
-DTEND;TZID=Europe/London:20041020T213000\r
-DESCRIPTION:PANATHINAIKOS 2\nGonzalez 65\nOlisadebe 81\n\nARSENAL 2\nLju\r
- ngberg 17\nHenry 74\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Upton Park\r
-DTSTAMP:20060704T214300Z\r
-UID:BBD1F297-E666-4847-8177-168652487E1E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-DTSTART;TZID=Europe/London:20061105T133000\r
-SUMMARY:West Ham Utd - Arsenal\r
-DTEND;TZID=Europe/London:20061105T151500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nThe Valley\r
-DTSTAMP:20040604T151907Z\r
-UID:A9E5A5D3-5BA6-4E23-B072-DB80657F5602-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235198\r
-DTSTART;TZID=Europe/London:20031026T140000\r
-SUMMARY:Charlton Athletic 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20031026T154500\r
-DESCRIPTION:CHARLTON ATHLETIC 1\nPaolo di Canio 27 (pen)\n\nARSENAL 1\nT\r
- hierry Henry 39\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060622T110850Z\r
-UID:3DC9077C-ADE0-4AD4-8900-85E58FBB7513-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20061028T150000\r
-SUMMARY:Arsenal - Everton\r
-DTEND;TZID=Europe/London:20061028T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060117T200554Z\r
-UID:3F0EFA88-F26C-46DF-A5EA-35F1C0B97953-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=353089\r
-DTSTART;TZID=Europe/London:20060114T150000\r
-SUMMARY:Arsenal 7-0 Middlesbrough\r
-DTEND;TZID=Europe/London:20060114T164500\r
-DESCRIPTION:ARSENAL 7\nHenry 20\, 30\, 68\nSenderos 22\nPires 47\nGilber\r
- to 59\nHleb 84\n\nMIDDLESBROUGH 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nSt. James' Park\r
-DTSTAMP:20040604T150145Z\r
-UID:382B585F-8359-4082-BDD5-11D1991347CF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234880\r
-DTSTART;TZID=Europe/London:20040411T160500\r
-SUMMARY:Newcastle Utd 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20040411T175000\r
-DESCRIPTION:NEWCASTLE 0\n\nARSENAL 0\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Philips Stadion\nUEFA Champions League\r
-DTSTAMP:20041124T214054Z\r
-UID:85BB0787-0CFA-4258-8465-3F41309293E6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-DTSTART;TZID=Europe/London:20041124T194500\r
-SUMMARY:PSV Eindhoven 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20041124T213000\r
-DESCRIPTION:PSV EINDHOVEN 1\nOoijer 8\n\nARSENAL 1\nHenry 31\n\nUEFA Cha\r
- mpions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Valley\r
-DTSTAMP:20060622T110239Z\r
-UID:90619B46-7496-4450-B30C-49FABCB4A0FF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20060930T150000\r
-SUMMARY:Charlton Athletic - Arsenal\r
-DTEND;TZID=Europe/London:20060930T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League Quarter-Final 1st Leg\r
-DTSTAMP:20060809T121227Z\r
-UID:EE9D710E-2EE4-4106-9CA3-BBC363FEAB82-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:16\r
-DTSTART;TZID=Europe/London:20060328T194500\r
-SUMMARY:Arsenal 2-0 Juventus\r
-DTEND;TZID=Europe/London:20060328T213000\r
-DESCRIPTION:ARSENAL 2\nFabregas 40\nHenry 69\n\nJUVENTUS 0\n\nUEFA Champ\r
- ions League Quarter-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070310T150000\r
-DTEND;TZID=Europe/London:20070310T164500\r
-SUMMARY:F.A. Cup 6th round\r
-UID:E6958D10-786F-479D-962E-AF00388FC773-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTAMP:20060623T172621Z\r
-DESCRIPTION:F.A. Cup 6th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060825T090844Z\r
-UID:EF8B2B6B-1A75-4DBB-9C93-D4DA34D639CE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061121T194500\r
-SUMMARY:Arsenal - Hamburg\r
-DESCRIPTION:UEFA Champions League matchday 5\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Fratton Park\nBarclays Premiership\r
-DTSTAMP:20060809T121330Z\r
-UID:1C81DAEE-369F-4597-9BEB-DC070157D3CC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:53\r
-DTSTART;TZID=Europe/London:20060412T200000\r
-SUMMARY:Portsmouth 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20060412T214500\r
-DESCRIPTION:PORTSMOUTH 1\nLua Lua 66\n\nARSENAL 1\nHenry 37\n\nBarclays \r
- Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carling Cup quarter-final\nThe Hawthorns\r
-DTSTAMP:20040604T152130Z\r
-UID:E6E4CB6D-2997-42B5-BF61-EDF582A3DCB0-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=248104\r
-DTSTART;TZID=Europe/London:20031216T200000\r
-SUMMARY:West Bromwich Albion 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20031216T214500\r
-DESCRIPTION:W.B.A. 0\n\nARSENAL 2\nKanu 25\nAliadiere 57\n\nCarling Cup \r
- quarter-final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070221T194500\r
-SUMMARY:Champions League knockout round 1\r
-UID:A15D1562-B880-4CD9-B718-8BE2B7877CCE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-DTSTAMP:20060623T170505Z\r
-DESCRIPTION:Champions League knockout round 1\r
-SEQUENCE:1\r
-DURATION:PT1H45M\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Higbury\nBarclays Premiership\r
-DTSTAMP:20060809T121417Z\r
-UID:A306990B-5831-4E5D-826F-BCDA1529ABDA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:18\r
-DTSTART;TZID=Europe/London:20060422T124500\r
-SUMMARY:Arsenal 1-1 Tottenham Hotspur\r
-DTEND;TZID=Europe/London:20060422T143000\r
-DESCRIPTION:ARSENAL 1\nHenry 84\n\nTOTTENHAM HOTSPUR 1\nKeane 66\n\nBarc\r
- lays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup 3rd round\r
-DTSTAMP:20050109T161653Z\r
-UID:52CB1ED9-06C5-430C-BBDD-CDE163169675-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=248392\r
-DTSTART;TZID=Europe/London:20050109T140000\r
-SUMMARY:Arsenal 2-1 Stoke City\r
-DTEND;TZID=Europe/London:20050109T154500\r
-DESCRIPTION:ARSENAL 2\nReyes 50\nVan Persie 70\n\nSTOKE CITY 1\nThomas 4\r
- 5\n\nFA Cup 3rd round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:St Andrews\nBarclays Premiership\r
-DTSTAMP:20060204T171455Z\r
-UID:C9101475-0446-4183-A7AC-9A97E9CB9F20-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=359958\r
-DTSTART;TZID=Europe/London:20060204T150000\r
-SUMMARY:Birmingham City 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20060204T164500\r
-DESCRIPTION:BIRMINGHAM CITY 0\n\nARSENAL 2\nAdebayor 21\nHenry 63\n\nBar\r
- clays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T150540Z\r
-UID:6E247FD6-13A5-4E96-97ED-D0D0010C4003-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235004\r
-DTSTART;TZID=Europe/London:20040210T194500\r
-SUMMARY:Arsenal 2-0 Southampton\r
-DTEND;TZID=Europe/London:20040210T213000\r
-DESCRIPTION:ARSENAL 2\nHenry 31\, 90\n\nSOUTHAMPTON 0\n\nFA Barclaycard \r
- Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060202T062136Z\r
-UID:6B926B4F-B15E-4894-A490-401931CFD770-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:30\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=359253\r
-DTSTART;TZID=Europe/London:20060201T200000\r
-SUMMARY:Arsenal 2-3 West Ham Utd\r
-DTEND;TZID=Europe/London:20060201T214500\r
-DESCRIPTION:ARSENAL 2\nHenry 45\nPires 89\n\nWEST HAM UNITED 3\nReo-Coke\r
- r 25\nZamora 32\nEtherington 80\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20051218T203711Z\r
-UID:CC0A5B34-7ADA-45AF-B438-867EB05AF0FC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=345687\r
-DTSTART;TZID=Europe/London:20051218T160000\r
-SUMMARY:Arsenal 0-2 Chelsea\r
-DTEND;TZID=Europe/London:20051218T174500\r
-DESCRIPTION:ARSENAL 0\n\nCHELSEA 2\nRobben 39\nCole 73\n\nBarclays Premi\r
- ership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nSt. Mary's Stadium\r
-DTSTAMP:20040604T152155Z\r
-UID:41C6700B-EC5F-4B1B-8CBC-B90FBF4447CB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234991\r
-DTSTART;TZID=Europe/London:20031229T200000\r
-SUMMARY:Southampton 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20031229T214500\r
-DESCRIPTION:SOUTHAMPTON 0\n\nARSENAL 1\nPires 35\n\nFA Barclaycard Premi\r
- ership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050104T221511Z\r
-UID:B7BBA94C-C883-4857-8AD0-779E1F2F8EA4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=247736\r
-DTSTART;TZID=Europe/London:20050104T194500\r
-SUMMARY:Arsenal 1-1 Manchester City\r
-DTEND;TZID=Europe/London:20050104T213000\r
-DESCRIPTION:ARSENAL 1\nLjungberg 75\n\nMANCHESTER CITY 1\nS. Wright-Phil\r
- lips 31\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nWhite Hart Lane\r
-DTSTAMP:20060809T122115Z\r
-UID:4E35FCFA-DD3D-4F6A-AE6C-42E31DC41874-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234903\r
-DTSTART;TZID=Europe/London:20040425T160500\r
-SUMMARY:Tottenham 2-2 Arsenal\r
-DTEND;TZID=Europe/London:20040425T175000\r
-DESCRIPTION:TOTTENHAM HOTSPUR 2\nRedknapp 62\nKeane 94 (pen)\n\nARSENAL \r
- 2\nVieira 3\nPires 35\n\nCHAMPIONS!!!\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nWalkers Stadium\r
-DTSTAMP:20040604T152049Z\r
-UID:116B4332-9E81-4015-8EC2-50F8417CA5A3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234948\r
-DTSTART;TZID=Europe/London:20031206T150000\r
-SUMMARY:Leicester City 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20031206T164500\r
-DESCRIPTION:LEICESTER CITY 1\nHignett 90\n\nARSENAL 1\nGilberto 60\n\nFA\r
-  Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Cup 4th Round\nHighbury\r
-DTSTAMP:20040604T150640Z\r
-UID:EB03F776-88E2-4FDE-8947-3CCFDCA3D3FE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249304\r
-DTSTART;TZID=Europe/London:20040124T150000\r
-SUMMARY:Arsenal 4-1 Middlesbrough\r
-DTEND;TZID=Europe/London:20040124T164500\r
-DESCRIPTION:ARSENAL 4\nBergkamp 19\nLjungberg 28\, 68\nBentley 90\n\nMID\r
- DLESBROUGH 1\nJob 23\ns.o. Boateng 86\n\nFA Cup 4th Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:White Hart Lane\nFA Barclays Premiership\r
-DTSTAMP:20041113T153253Z\r
-UID:EECD6309-4C3D-4633-94DD-772D77E9ED49-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=237415\r
-DTSTART;TZID=Europe/London:20041113T120000\r
-SUMMARY:Tottenham Hotspur 4-5 Arsenal\r
-DTEND;TZID=Europe/London:20041113T134500\r
-DESCRIPTION:TOTTENHAM HOTSPUR 4\nNaybet 37\nDefoe 61\nKing 74\nKanoute 8\r
- 8\n\nARSENAL 5\nHenry 45\nLauren 55 (pen)\nVieira 60\nLjungberg 69\nPire\r
- s 81\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050425T205834Z\r
-UID:3DD81530-4938-4AA7-AD7F-7D8B3B059CA7-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=272363\r
-DTSTART;TZID=Europe/London:20050425T200000\r
-SUMMARY:Arsenal 1-0 Tottenham Hotspur\r
-DTEND;TZID=Europe/London:20050425T214500\r
-DESCRIPTION:ARSENAL 1\nReyes 22\n\nTOTTENHAM HOTSPUR 0\n\nFA Barclays Pr\r
- emiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:St James' Park\nBarclays Premiership\r
-DTSTAMP:20051211T092023Z\r
-UID:CE8D24D4-5A6C-4CB8-BF5B-E92C1C74EF26-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=332057\r
-DTSTART;TZID=Europe/London:20051210T171500\r
-SUMMARY:Newcastle Utd 1-0 Arsenal\r
-DTEND;TZID=Europe/London:20051210T190000\r
-DESCRIPTION:NEWCASTLE UNITED 1\nSolano 82\n\nARSENAL 0\n\nBarclays Premi\r
- ership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Community Shield\nMillennium Stadium\, Cardiff\r
-DTSTAMP:20040604T151623Z\r
-UID:1998AD3F-D167-409C-BAF8-E69525D73E34-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241828\r
-DTSTART;TZID=Europe/London:20030810T140000\r
-SUMMARY:Arsenal 1(3)-1(4) ManUtd\r
-DTEND;TZID=Europe/London:20030810T154500\r
-DESCRIPTION:ARSENAL 1(3)\nThierry Henry 20\ns.o. Francis Jeffers 74\npen\r
-  Edu\npen Sylvain Wiltord\npen Lauren\n\nMANCHESTER UNITED 1(4)\nMikael \r
- Silvestre 15\npen Paul Scholes\npen Rio Ferdinand\npen Ole Gunnar Solskj\r
- aer\npen Diego Forlan\n\nFA Community Shield\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nGiuseppe Meazza Stadium (San Siro)\r
-DTSTAMP:20040604T152013Z\r
-UID:552F971A-B238-4DB0-8C7B-4E10E4419023-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243462\r
-DTSTART;TZID=Europe/London:20031125T194500\r
-SUMMARY:Inter Milan 1-5 Arsenal\r
-DTEND;TZID=Europe/London:20031125T213000\r
-DESCRIPTION:INTER MILAN 1\nVieri 32\n\nARSENAL 5\nHenry 25\, 85\nLjungbe\r
- rg 49\nEdu 87\nPires 89\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Hawthorns\nBarclays Premiership\r
-DTSTAMP:20051016T101059Z\r
-UID:7E533838-66CD-47C3-B81A-D47A31433BE2-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=315472\r
-DTSTART;TZID=Europe/London:20051015T150000\r
-SUMMARY:West Bromwich Albion 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20051015T164500\r
-DESCRIPTION:WEST BROMWICH ALBION 2\nKanu 38\nCarter 77\n\nARSENAL 1\nSen\r
- deros 18\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Ewood Park\nFA Barclays Premiership\r
-DTSTAMP:20050319T232331Z\r
-UID:31469719-54CB-431E-B11C-3058F5D618AC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=263607\r
-DTSTART;TZID=Europe/London:20050319T124500\r
-SUMMARY:Blackburn Rovers 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20050319T143000\r
-DESCRIPTION:BLACKBURN ROVERS 0\n\nARSENAL 1\nVan Persie 43\n\nFA Barclay\r
- s Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Old Trafford\nBarclays Premiership\r
-DTSTAMP:20060809T121318Z\r
-UID:A9C34DC3-FD26-4B13-BEDB-7667F1380E00-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-DTSTART;TZID=Europe/London:20060409T160000\r
-SUMMARY:Manchester Utd 2-0 Arsenal\r
-DTEND;TZID=Europe/London:20060409T174500\r
-DESCRIPTION:MANCHESTER UTD 2\nRooney 54\nPark 78\n\nARSENAL 0\n\nBarclay\r
- s Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nSchwechat Stadium\, Vienna\, Austria\r
-DTSTAMP:20040604T151430Z\r
-UID:69D37CCD-B789-4107-83EE-533A7BD8138D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241547\r
-DTSTART;TZID=Europe/London:20030725T190000\r
-SUMMARY:Austria Vienna 0-2 Arsenal\r
-DTEND;TZID=Europe/London:20030725T204500\r
-DESCRIPTION:AUSTRIA VIENNA 0\n\nARSENAL 2\nDennis Bergkamp 29\nFrancis J\r
- effers 44\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T121844Z\r
-UID:EA6BDD8F-969D-4D20-B13A-9B40C2C487EF-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234904\r
-DTSTART;TZID=Europe/London:20030816T150000\r
-SUMMARY:Arsenal 2-1 Everton\r
-DTEND;TZID=Europe/London:20030816T164500\r
-DESCRIPTION:ARSENAL 2\nHenry 35 (pen)\nPires 58\nCampbell sent off 25\n\\r
- nEVERTON 1\nRadzinski 84\nLi Tie sent off 87\n\nFA Barclaycard Premiersh\r
- ip\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T152148Z\r
-UID:9738F998-0356-499D-B5F4-AAA7442EC126-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234974\r
-DTSTART;TZID=Europe/London:20031226T120000\r
-SUMMARY:Arsenal 3-0 Wolverhampton W\r
-DTEND;TZID=Europe/London:20031226T134500\r
-DESCRIPTION:ARSENAL 3\nCraddock og 13\nHenry 20\, 89\n\nWOLVES 0\n\nFA B\r
- arclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Amsterdam ArenA\nUEFA Champions League\r
-DTSTAMP:20060809T122657Z\r
-UID:00FAFD97-7947-493F-8CE9-DAFB64BBEE0B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:17\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=311047\r
-DTSTART;TZID=Europe/London:20050927T194500\r
-SUMMARY:AFC Ajax 1-2  Arsenal\r
-DTEND;TZID=Europe/London:20050927T213000\r
-DESCRIPTION:AJAX 1\nRosenberg 70\n\nARSENAL 2\nLjungberg 2\nPires (pen) \r
- 68 \n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060711T140543Z\r
-UID:1822C525-9209-430E-9B19-1D7D858C44FE-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20060923T150000\r
-SUMMARY:Arsenal - Sheffield Utd\r
-DTEND;TZID=Europe/London:20060923T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:City of Manchester Stadium\nCarling Cup 3rd round\r
-DTSTAMP:20041028T071910Z\r
-UID:07E51C76-F7DD-4259-A3C3-B17D4F53CC11-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=234108\r
-DTSTART;TZID=Europe/London:20041027T194500\r
-SUMMARY:Manchester City 1-2 Arsenal\r
-DTEND;TZID=Europe/London:20041027T213000\r
-DESCRIPTION:MANCHESTER CITY 1\nFowler 90\n\nARSENAL 2\nvan Persie 78 \nK\r
- arbassyioon 90 \n\nCarling Cup 3rd round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050511T213934Z\r
-UID:06232CAD-0D08-4C7C-BBCC-5B979297B901-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=275961\r
-DTSTART;TZID=Europe/London:20050511T200000\r
-SUMMARY:Arsenal 7-0 Everton\r
-DTEND;TZID=Europe/London:20050511T214500\r
-DESCRIPTION:ARSENAL 7\nVan Persie 8\nPires 12\, 50\nVieira 37\nEdu 70 (p\r
- en)\nBergkamp 77\nFlamini 85\n\nEVERTON 0\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Selhurst Park\nFA Barclays Premiership\r
-DTSTAMP:20041107T082059Z\r
-UID:1B876000-2824-415D-BE23-419DF4FA05FA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=236035\r
-DTSTART;TZID=Europe/London:20041106T171500\r
-SUMMARY:Crystal Palace 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20041106T190000\r
-DESCRIPTION:CRYSTAL PALACE 1\nRiihilahti 65\n\nARSENAL 1\nHenry 63\n\nFA\r
-  Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nBad Waltersdorf\, Austria\r
-DTSTAMP:20040604T151440Z\r
-UID:F689C6A4-861D-4FC5-BEFD-9239A88D003E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241627\r
-DTSTART;TZID=Europe/London:20030729T180000\r
-SUMMARY:Arsenal 1-0 Besiktas\r
-DTEND;TZID=Europe/London:20030729T194500\r
-DESCRIPTION:ARSENAL 1\nDennis Bergkamp 48\n\nBESIKTAS 0\n\nPre-season fr\r
- iendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060825T091024Z\r
-UID:F11AC3FC-63DA-4BDF-971E-7A57DECB3C95-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20060926T194500\r
-SUMMARY:Arsenal - FC Porto\r
-DESCRIPTION:UEFA Champions League matchday 2\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nIbrox\, Glasgow\r
-DTSTAMP:20040604T151611Z\r
-UID:91E54F30-153B-48A6-A660-EB6C79B290F5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241307\r
-DTSTART;TZID=Europe/London:20030805T194500\r
-SUMMARY:Rangers 0-3 Arsenal\r
-DTEND;TZID=Europe/London:20030805T213000\r
-DESCRIPTION:RANGERS 0\n\nARSENAL 3\nEdu 31\nLauren 47 (pen)\nSol Campbel\r
- l 58\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Anfield\nFA Barclays Premiership\r
-DTSTAMP:20041128T203220Z\r
-UID:868B9421-E562-4E63-8F19-487B5AB5BE08-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=238116\r
-DTSTART;TZID=Europe/London:20041128T160500\r
-SUMMARY:Liverpool 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20041128T175000\r
-DESCRIPTION:LIVERPOOL 2\nAlonso 41\nMellor 90\n\nARSENAL 1\nVieira 57\n\\r
- nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20040914T221002Z\r
-UID:F5D8FCCA-0A22-4AF0-AB18-978502AA1022-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=225565\r
-DTSTART;TZID=Europe/London:20040914T194500\r
-SUMMARY:Arsenal 1-0 PSV Eindhoven\r
-DTEND;TZID=Europe/London:20040914T213000\r
-DESCRIPTION:ARSENAL 1\nAlex 42 (og)\n\nPSV EINDHOVEN 0\n\nUEFA Champions\r
-  League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nAnfield\r
-DTSTAMP:20040604T151813Z\r
-UID:CB6539B4-58D6-41D5-AF92-438402ECA1A4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235177\r
-DTSTART;TZID=Europe/London:20031004T123000\r
-SUMMARY:Liverpool 1-2 Arsenal\r
-DTEND;TZID=Europe/London:20031004T141500\r
-DESCRIPTION:LIVERPOOL 1\nKewell 14\n\nARSENAL 2\nHyypia (og) 31\nPires 6\r
- 8\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172413Z\r
-UID:6A8F5322-40FE-453F-8533-1C6D25193C3D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070120T150000\r
-SUMMARY:Arsenal - Manchester Utd\r
-DTEND;TZID=Europe/London:20070120T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Valley\nBarclays Premiership\r
-DTSTAMP:20051226T150410Z\r
-UID:4B295DEE-5F97-4022-BE7A-9D1ED2EDB824-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:16\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346472\r
-DTSTART;TZID=Europe/London:20051226T124500\r
-SUMMARY:Charlton Athletic 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20051226T143000\r
-DESCRIPTION:CHARLTON ATHLETIC 0\n\nARSENAL 1\nReyes 58\n\nBarclays Premi\r
- ership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20050310T183941Z\r
-UID:75B251E8-B36A-4ACD-AB66-0085283EE048-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=261721\r
-DTSTART;TZID=Europe/London:20050309T194500\r
-SUMMARY:Arsenal 1-0 Bayern München\r
-DTEND;TZID=Europe/London:20050309T213000\r
-DESCRIPTION:ARSENAL 1\nHenry 66\n\nBAYERN MUNICH 0\n\nUEFA Champions Lea\r
- gue\nKnockout\, 2nd leg\n\nBayern München win 3-2 on aggregate\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20041208T010508Z\r
-UID:57BE5241-9FAD-4E87-BDF3-759FF103CB42-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=242378\r
-DTSTART;TZID=Europe/London:20041207T194500\r
-SUMMARY:Arsenal 5-1 Rosenborg\r
-DTEND;TZID=Europe/London:20041207T213000\r
-DESCRIPTION:ARSENAL 5\nReyes 3\nHenry 24\nFabregas 29\nPires 41 (pen)\nV\r
- an Persie 84\n\nROSENBORG 1\nHoftun 38\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Millennium Stadium\, Cardiff\nFA Community Shield\r
-DTSTAMP:20050807T160523Z\r
-UID:25784440-F3EE-412D-9B90-740FD42D653D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:15\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=296981\r
-DTSTART;TZID=Europe/London:20050807T150000\r
-SUMMARY:Chelsea 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20050807T164500\r
-DESCRIPTION:ARSENAL 1\nFabregas 65\n\nCHELSEA 2\nDrogba 8\, 57\n\nFA Com\r
- munity Shield\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The Olympic Stadium\, Athens \r
-DTSTAMP:20060623T172219Z\r
-UID:AF9F83A4-8D24-4964-9141-795073619BB3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20070523T194500\r
-SUMMARY:Champions League Final\r
-DTEND;TZID=Europe/London:20070523T213000\r
-DESCRIPTION:Champions League Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League\nHighbury\r
-DTSTAMP:20040604T151729Z\r
-UID:27230D3A-A02E-4DDF-AD56-0DD26514535C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=243409\r
-DTSTART;TZID=Europe/London:20030917T194500\r
-SUMMARY:Arsenal 0-3 Inter Milan\r
-DTEND;TZID=Europe/London:20030917T213000\r
-DESCRIPTION:ARSENAL 0\nHenry missed pen 32\n\nINTER MILAN 3\nCruz 22\nVa\r
- n der Meyde 24\nMartins 41\n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nLoftus Road\r
-DTSTAMP:20040604T145730Z\r
-UID:A5BBD55C-8552-4734-97AB-C33E59272032-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235116\r
-DTSTART;TZID=Europe/London:20040509T160500\r
-SUMMARY:Fulham 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20040509T175000\r
-DESCRIPTION:FULHAM 0\n\nARSENAL 1\nReyes 9\n\nFA Barclaycard Premiership\r
\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carling Cup semi-final 1st leg\nHighbury\r
-DTSTAMP:20040604T150700Z\r
-UID:502AD471-18AB-4157-9237-61E00A5EAA79-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249184\r
-DTSTART;TZID=Europe/London:20040120T194500\r
-SUMMARY:Arsenal 0-1 Middlesbrough\r
-DTEND;TZID=Europe/London:20040120T213000\r
-DESCRIPTION:ARSENAL 0\n\nMIDDLESBROUGH 1\nJuninho 53\n\nCarling Cup semi\r
- -final 1st leg\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060825T090820Z\r
-UID:BBBE4A20-F903-42D0-BC4F-9EEA5962C740-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-DTSTART;TZID=Europe/London:20061101T194500\r
-SUMMARY:Arsenal - CSKA Moscow\r
-DESCRIPTION:UEFA Champions League matchday 4\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nUEFA Champions League\r
-DTSTAMP:20041102T223439Z\r
-UID:6FB64DB7-24F6-4980-843A-F6CE7FA476D6-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=235392\r
-DTSTART;TZID=Europe/London:20041102T194500\r
-SUMMARY:Arsenal 1-1 Panathinaikos\r
-DTEND;TZID=Europe/London:20041102T213000\r
-DESCRIPTION:ARSENAL 1\nHenry 16 (pen)\n\nPANATHINAIKOS 1\nCygan 74 (og)\\r
- n\nUEFA Champions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stamford Bridge\r
-DTSTAMP:20060704T214429Z\r
-UID:6B16A0FE-9169-4399-A0E9-CC77BA3FE76B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-DTSTART;TZID=Europe/London:20061210T160000\r
-SUMMARY:Chelsea - Arsenal\r
-DTEND;TZID=Europe/London:20061210T174500\r
-DESCRIPTION:Live on Sky Sports\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Villa Park\nFA Barclays Premiership\r
-DTSTAMP:20050206T132557Z\r
-UID:9F97ADE0-9344-436C-9899-6E3BA6BF04A5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:21\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=254039\r
-DTSTART;TZID=Europe/London:20050205T171500\r
-SUMMARY:Aston Villa 1-3 Arsenal\r
-DTEND;TZID=Europe/London:20050205T190000\r
-DESCRIPTION:ASTON VILLA 1\nAngel 74\n\nARSENAL 3\nLjungberg 10\nHenry 14\r
- \nCole 28\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:UEFA Champions League (knock-out)\nHighbury\r
-DTSTAMP:20040604T150431Z\r
-UID:3FA9A70F-B1CE-4F90-ACB0-E14F4CDE2B13-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249288\r
-DTSTART;TZID=Europe/London:20040310T194500\r
-SUMMARY:Arsenal 2-0 Celta de Vigo\r
-DTEND;TZID=Europe/London:20040310T213000\r
-DESCRIPTION:ARSENAL 2\nHenry 14\, 34\n\nCELTA DE VIGO 0\ns.o. Contreras \r
- 74\n\nUEFA Champions League (knock-out)\nArsenal win 5-2 on aggregate\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20060809T122101Z\r
-UID:86FE8303-D009-4952-B90E-99A6C5275F26-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=234884\r
-DTSTART;TZID=Europe/London:20040416T200000\r
-SUMMARY:Arsenal 5-0 Leeds\r
-DTEND;TZID=Europe/London:20040416T214500\r
-DESCRIPTION:ARSENAL 5\nPires 6\nHenry 27\, 33 (pen)\, 50\, 67\n\nLEEDS U\r
- NITED 0\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050215T095354Z\r
-UID:82D06749-E8E4-4BF2-B2EE-7DAEB7AE7B1C-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20050214T200000\r
-SUMMARY:Arsenal 5-1 Crystal Palace\r
-DTEND;TZID=Europe/London:20050214T214500\r
-DESCRIPTION:ARSENAL 5\nBergkamp 32\nReyes 35\nHenry 39\, 37\nVieira 54\n\r
- \nCRYSTAL PALACE 1\nJohnson 63 (pen)\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Craven Cottage\nBarclays Premiership\r
-DTSTAMP:20060304T171231Z\r
-UID:6DBA655D-5522-409A-9EE0-76388DF14F4F-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=368249\r
-DTSTART;TZID=Europe/London:20060304T150000\r
-SUMMARY:Fulham 0-4 Arsenal\r
-DTEND;TZID=Europe/London:20060304T164500\r
-DESCRIPTION:FULHAM 0\n\nARSENAL 4\nHenry 31\, 77\nAdebayor 35\nFabregas \r
- 86\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20051228T230659Z\r
-UID:25470AFA-6111-42A0-964B-E2A3083CE53E-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=346477\r
-DTSTART;TZID=Europe/London:20051228T194500\r
-SUMMARY:Arsenal 4-0 Portsmouth\r
-DTEND;TZID=Europe/London:20051228T213000\r
-DESCRIPTION:ARSENAL 4\nBergkamp 7\nReyes 13\nHenry 36\, 42 (pen)\n\nPORT\r
- SMOUTH 0\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172419Z\r
-UID:AF026105-91E1-43D2-82AB-BB4EB3A0D6A3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:56\r
-DTSTART;TZID=Europe/London:20070130T194500\r
-SUMMARY:Arsenal - Manchester City\r
-DTEND;TZID=Europe/London:20070130T213000\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nRitzing Stadium\, Ritzing\, Austria\r
-DTSTAMP:20040604T151422Z\r
-UID:56BC0F1C-DCA5-44A0-9859-EDBE3B762A1A-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241454\r
-DTSTART;TZID=Europe/London:20030722T190000\r
-SUMMARY:Ritzing 2-2 Arsenal\r
-DTEND;TZID=Europe/London:20030722T204500\r
-DESCRIPTION:RITZING 2\nSebasta 20\nEl Senosy 25\n\nARSENAL 2\nCygan 60\n\r
- Ljungberg (pen) 85\n\nPre-season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050201T222828Z\r
-UID:A572A1C4-DF43-4FFE-9E71-9168B2DC0234-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:8\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=253081\r
-DTSTART;TZID=Europe/London:20050201T200000\r
-SUMMARY:Arsenal 2-4 Manchester Utd\r
-DTEND;TZID=Europe/London:20050201T214500\r
-DESCRIPTION:ARSENAL 2\nVieira 8\nBergkamp 36\n\nMANCHESTER UNITED 4\nGig\r
- gs 18\nRonaldo 54\, 58\nO'Shea 89\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Emirates Stadium\r
-DTSTAMP:20060623T172449Z\r
-UID:7477F2CC-005E-49AC-941E-86D7F7097136-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:7\r
-DTSTART;TZID=Europe/London:20070414T150000\r
-SUMMARY:Arsenal - Bolton Wanderers\r
-DTEND;TZID=Europe/London:20070414T164500\r
-DESCRIPTION:Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DURATION:PT1H45M\r
-LOCATION:Highbury\nUEFA Champions League Semi-Final 1st Leg\r
-DTSTAMP:20060809T121358Z\r
-UID:6348F912-F6D7-43BE-A143-35CB7BA20358-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-DTSTART;TZID=Europe/London:20060419T194500\r
-SUMMARY:Arsenal 1-0 Villarreal CF\r
-DESCRIPTION:ARSENAL 1\nToure 41\n\nVILLAREAL 0\n\nUEFA Champions League \r
- Semi-Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carling Cup 4th Round\nHighbury\n\r
-DTSTAMP:20040604T152039Z\r
-UID:C1F69575-3690-42C5-A4A4-95042ADF4BE5-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=247503\r
-DTSTART;TZID=Europe/London:20031202T194500\r
-SUMMARY:Arsenal 5-1 Wolverhampton W.\r
-DTEND;TZID=Europe/London:20031202T213000\r
-DESCRIPTION:ARSENAL 5\nAliadiere 24\, 71\nKanu 67\nWiltord 79\nFabregas \r
- 88\n\nWOLVERHAMPTON W. 1\nRae 81\n\nCarling Cup 4th Round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nCeltic Park\, Glasgow\r
-DTSTAMP:20040604T151534Z\r
-UID:01A4C130-ADAD-4A5E-BC8E-6BC4CF12C268-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=241306\r
-DTSTART;TZID=Europe/London:20030802T150000\r
-SUMMARY:Celtic 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20030802T164500\r
-DESCRIPTION:CELTIC 1\nLiam Miller 57\n\nARSENAL 1\nKanu 70\n\nPre-season\r
-  friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Wembley\r
-DTSTAMP:20060623T172711Z\r
-UID:9F1E2513-7E31-435D-B3AB-6DAE679CE375-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-DTSTART;TZID=Europe/London:20070519T150000\r
-SUMMARY:F.A. Cup Final\r
-DTEND;TZID=Europe/London:20070519T164500\r
-DESCRIPTION:F.A. Cup Final\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Cup 4th round\r
-DTSTAMP:20050129T173246Z\r
-UID:C1EAB9E3-FA90-4E6F-8F0B-703586DDE8EB-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:5\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=252357\r
-DTSTART;TZID=Europe/London:20050129T150000\r
-SUMMARY:Arsenal 2-0 Wolverhampton Wanderers\r
-DTEND;TZID=Europe/London:20050129T164500\r
-DESCRIPTION:ARSENAL 2\nVieira 53\nLjungberg 82\n\nWOLVERHAMPTON W. 0\n\n\r
- FA Cup 4th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nLondon Road\r
-DTSTAMP:20040604T151400Z\r
-UID:45E12578-92AD-456A-984B-3A6CD212F978-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:6\r
-DTSTART;TZID=Europe/London:20030711T193000\r
-SUMMARY:Peterborough 1-0 Arsenal XI\r
-DTEND;TZID=Europe/London:20030711T211500\r
-DESCRIPTION:PETERBOROUGH UNITED 1\nGreen 29\n\nARSENAL XI 0\n\nPre-seaso\r
- n friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20050919T212818Z\r
-UID:A899DA80-AFD5-463E-9CCF-B1EA5AD27D7B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:18\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=305234\r
-DTSTART;TZID=Europe/London:20050919T200000\r
-SUMMARY:Arsenal 2-0 Everton\r
-DTEND;TZID=Europe/London:20050919T214500\r
-DESCRIPTION:ARSENAL 2\nCampbell 11\, 30\n \nEVERTON 0\n\nBarclays Premie\r
- rship\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20041003T060617Z\r
-UID:7DEFC598-A3B1-4A80-8146-1403DB62A092-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=229026\r
-DTSTART;TZID=Europe/London:20041002T150000\r
-SUMMARY:Arsenal 4-0 Charlton Athletic\r
-DTEND;TZID=Europe/London:20041002T164500\r
-DESCRIPTION:ARSENAL 4\nLjungberg 33\nHenry 48\, 69\nReyes 70\n\nCHARLTON\r
-  ATHLETIC 0\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nBarclays Premiership\r
-DTSTAMP:20060809T114516Z\r
-UID:D1D0E52B-9A0E-41A0-96B5-274D27E2021B-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=301475\r
-DTSTART;TZID=Europe/London:20050824T194500\r
-SUMMARY:Arsenal 4-1 Fulham\r
-DTEND;TZID=Europe/London:20050824T213000\r
-DESCRIPTION:ARSENAL 4\nCygan 32\, 90\nHenry 53\, 83\n\nFULHAM 1\nJensen \r
- 22\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Stamford Bridge\nFA Barclays Premiership\r
-DTSTAMP:20050421T081926Z\r
-UID:8543F179-5E2C-46B0-A76E-74D2D1DE5934-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:10\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=270910\r
-DTSTART;TZID=Europe/London:20050420T200000\r
-SUMMARY:Chelsea 0-0 Arsenal\r
-DTEND;TZID=Europe/London:20050420T214500\r
-DESCRIPTION:CHELSEA 0\n\nARSENAL 0\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Belle Vue Stadium\nCarling Cup 5th Round\r
-DTSTAMP:20051222T114529Z\r
-UID:2924AA1A-8E7B-4F3F-81C1-81898501A027-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:18\r
-DTSTART;TZID=Europe/London:20051221T194500\r
-SUMMARY:Doncaster Rovers 2-2P Arsenal\r
-DTEND;TZID=Europe/London:20051221T213000\r
-DESCRIPTION:DONCASTER ROVERS 2\nMcIndoe 4\nGreen 104\n\nARSENAL 2\nQuinc\r
- y 63\nGilberto 120\n\nArsenal win 3-1 on penalties\n\nCarling Cup 5th Ro\r
- und\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nBad Waltersdorf (Austria)\r
-DTSTAMP:20040728T184023Z\r
-UID:62A1186B-DE78-4F2A-B7B2-E1D55CE4B8C3-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=216410\r
-DTSTART;TZID=Europe/Oslo:20040728T183000\r
-SUMMARY:Sturm Graz 0-2 Arsenal\r
-DTEND;TZID=Europe/Oslo:20040728T201500\r
-DESCRIPTION:STURM GRAZ 0\n\nARSENAL 2\nReyes 30 (pen)\nJeffers 74\n\nPre\r
- -season friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Lerkendal stadium\nUEFA Champions League\r
-DTSTAMP:20040930T163019Z\r
-UID:EA88DB10-80AC-4301-A62D-428B6596B8BC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=228351\r
-DTSTART;TZID=Europe/London:20040929T194500\r
-SUMMARY:Rosenborg 1-1 Arsenal\r
-DTEND;TZID=Europe/London:20040929T213000\r
-DESCRIPTION:ROSENBORG 1\nStrand 52\n\nARSENAL 1\nLjungberg 6\n\nUEFA Cha\r
- mpions League\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Keown Testimonial\nHighbury\r
-DTSTAMP:20040604T145655Z\r
-UID:3A11674E-A10F-41FD-8951-53C9471A51DA-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTART;TZID=Europe/London:20040517T194500\r
-SUMMARY:Arsenal 6-0 England XI\r
-DTEND;TZID=Europe/London:20040517T213000\r
-DESCRIPTION:ARSENAL 6\nCole 17\nAliadiere 23\, 77\nReyes 53\, 58\, 66\n\\r
- nENGLAND XI 0\n\nKeown Testimonial\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Highbury\nFA Barclays Premiership\r
-DTSTAMP:20050402T214531Z\r
-UID:147595AD-C34A-4AC1-A840-5C5F25347280-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=26500\r
-DTSTART;TZID=Europe/London:20050402T150000\r
-SUMMARY:Arsenal 4-1 Norwich City\r
-DTEND;TZID=Europe/London:20050402T164500\r
-DESCRIPTION:ARSENAL 4\nHenry 19\, 22\, 66\nLjungberg 50\n\nNORWICH CITY \r
- 1\nHuckerby 30\n\nFA Barclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nHighbury\r
-DTSTAMP:20040604T145755Z\r
-UID:F4E8FD39-31B9-49C3-8E33-CA2E70BC9699-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:11\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235104\r
-DTSTART;TZID=Europe/London:20040501T123000\r
-SUMMARY:Arsenal 0-0 Birmingham City\r
-DTEND;TZID=Europe/London:20040501T141500\r
-DESCRIPTION:ARSENAL 0\n\nBIRMINGHAM CITY 0\n\nFA Barclaycard Premiership\r
\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Carling Cup semi-final 2nd leg\nRiverside Stadium\r
-DTSTAMP:20040604T150613Z\r
-UID:6BE19946-6EFB-4205-B101-8B4F8E6E7CA4-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:12\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=249913\r
-DTSTART;TZID=Europe/London:20040203T200000\r
-SUMMARY:Middlesbrough 2-1 Arsenal\r
-DTEND;TZID=Europe/London:20040203T214500\r
-DESCRIPTION:MIDDLESBROUGH 2\nZenden 69\nReyes o.g. 85\n\nARSENAL 1\nKeow\r
- n sent off 44\nEdu 77\n\nCarling Cup semi-final 2nd leg\nMiddlesbrough w\r
- in 3-1 on aggregate\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Amsterdam Arena\nPre-Season Friendly\r
-DTSTAMP:20050731T133943Z\r
-UID:AACA0049-8229-4DA7-A2B3-1D49C7C7B885-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:20\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=295084\r
-DTSTART;TZID=Europe/London:20050729T201500\r
-SUMMARY:Ajax 0-1 Arsenal\r
-DTEND;TZID=Europe/London:20050729T220000\r
-DESCRIPTION:AJAX 0\n\nARSENAL 1\nLupoli 87\n\nAmsterdam Tournament\nPre-\r
- Season Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:FA Barclaycard Premiership\nStamford Bridge\r
-DTSTAMP:20040604T150520Z\r
-UID:A9782F2E-EDCB-4693-8FBD-EAD7C5353F25-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:2\r
-URL;VALUE=URI:http://www.arsenal.com/matchday.asp?fxid=235017\r
-DTSTART;TZID=Europe/London:20040221T123000\r
-SUMMARY:Chelsea 1-2 Arsenal\r
-DTEND;TZID=Europe/London:20040221T141500\r
-DESCRIPTION:CHELSEA 1\nGudjohnsen 1\nGudjohnsen s.o. 60\n\nARSENAL 2\nVi\r
- eira 15\nEdu 21\n\nFA Barclaycard Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pre-season friendly\nMeadow Lodge\, Broughinge Road\r
-DTSTAMP:20040804T141834Z\r
-UID:FE8DA48F-B209-4ABC-AB74-5E8A1DD57B61-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:3\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=217539\r
-DTSTART;TZID=Europe/London:20040803T194500\r
-SUMMARY:Boreham Wood 1-1 Arsenal XI\r
-DTEND;TZID=Europe/London:20040803T213000\r
-DESCRIPTION:BOREHAM WOOD 1\nMoore 85\n\nARSENAL XI 1\nStokes 47\n\nPre-s\r
- eason friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20061220T200000\r
-DTEND;TZID=Europe/London:20061220T214500\r
-SUMMARY:Carling Cup 5th round\r
-UID:C9AA0DA8-F923-49C9-98DB-7B2127062298-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:4\r
-DTSTAMP:20060622T105658Z\r
-DESCRIPTION:Carling Cup 5th round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Freethiel Stadium\, Beveren\nPre-Season Friendly\r
-DTSTAMP:20050803T155047Z\r
-UID:923ACB4C-6B8E-480A-9728-EBEF6604866D-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:14\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=296135\r
-DTSTART;TZID=Europe/London:20050802T193000\r
-SUMMARY:KSK Beveren 3-3 Arsenal XI\r
-DTEND;TZID=Europe/London:20050802T211500\r
-DESCRIPTION:KSK BEVEREN 3\nAlain Koudou 37\nMahamadou Dissa 40\nGerjinho\r
-  84\n\nARSENAL XI 3\nArturo Lupoli 19\nRobin van Persie 74\, 79\n\nPre-S\r
- eason Friendly\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:The JJB Stadium\nBarclays Premiership\r
-DTSTAMP:20051119T210208Z\r
-UID:8B89DDAA-B971-4CAA-8334-B407E8ED2DD7-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:13\r
-URL;VALUE=URI:http://www.arsenal.com/article.asp?article=326151\r
-DTSTART;TZID=Europe/London:20051119T124500\r
-SUMMARY:Wigan Athletic 2-3 Arsenal\r
-DTEND;TZID=Europe/London:20051119T143000\r
-DESCRIPTION:WIGAN ATHLETIC 2\nCamera 28\nBullard 45\n\nARSENAL 3\nVan Pe\r
- rsie 11\nHenry 21\, 41\n\nBarclays Premiership\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;TZID=Europe/London:20070106T150000\r
-DTEND;TZID=Europe/London:20070106T164500\r
-SUMMARY:F.A. Cup 3rd round\r
-UID:B3908DFB-C6D6-403E-AC9E-485F448A2D08-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:9\r
-DTSTAMP:20060623T172525Z\r
-DESCRIPTION:F.A. Cup 4rth round\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-LOCATION:Pappelstadion\, Austria\r
-DTSTAMP:20060809T113354Z\r
-UID:1D806D3E-B6CF-4257-B5CA-D2A7FA5D8FDC-2793388E-0A6C-4052-AFA4-1B34D1E\r
- 16656\r
-SEQUENCE:16\r
-DTSTART;TZID=Europe/Oslo:20060725T190000\r
-SUMMARY:SV Mattersburg 1-2 Arsenal\r
-DTEND;TZID=Europe/Oslo:20060725T204500\r
-DESCRIPTION:SV MATTERSBURG 1\nPatocka 68\n\nARSENAL 2\nAliadiere 5\nHoyt\r
- e 53\n\nPre-Season Friendly\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/events.ics b/framework/iCalendar/tests/fixtures/vTimezone/events.ics
deleted file mode 100644 (file)
index d54c362..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:Carl Thompson's Calendar\r
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN\r
-METHOD:PUBLISH\r
-BEGIN:VEVENT\r
-DTSTART:20060905T130000Z\r
-DTEND:20060905T140000Z\r
-DTSTAMP:20060905T073750Z\r
-UID:20060905003740.d1f0ts6wocg@carlthompson.net\r
-SUMMARY:test cet 2\r
-TRANSP:OPAQUE\r
-ORGANIZER;CN=Carl Thompson:MAILTO:cet@carlthompson.net\r
-AALARM:20060905T124500Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-DTSTART;VALUE=DATE:20060905\r
-DTEND;VALUE=DATE:20060906\r
-DTSTAMP:20060905T073750Z\r
-UID:20060905003407.15x1fdrot9b4@carlthompson.net\r
-SUMMARY:test cet\r
-TRANSP:OPAQUE\r
-ORGANIZER;CN=Carl Thompson:MAILTO:cet@carlthompson.net\r
-AALARM:20060905T064500Z\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/exchange.ics b/framework/iCalendar/tests/fixtures/vTimezone/exchange.ics
deleted file mode 100644 (file)
index b714cfb..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:Microsoft CDO for Microsoft Exchange
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:Eastern Time (US & Canada)
-X-MICROSOFT-CDO-TZID:10
-BEGIN:STANDARD
-DTSTART:16010101T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:16010101T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:20011115T211047Z
-DTSTART;TZID="Eastern Time (US & Canada)":20011116T140000
-SUMMARY:internal final review of mmc site changes
-UID:040000008200E00074C5B7101A82E00800000000B0549C15F06DC101000000000000000
-  0100000008BF784046BEC174CA6706A51BE3E8B33
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="MHMN002"
-:
-  MAILTO:MHMN002@bitgroup.com
-ORGANIZER;CN="Ann Cave":MAILTO:acave@bitgroup.com
-LOCATION:metcalfe
-DTEND;TZID="Eastern Time (US & Canada)":20011116T143000
-DESCRIPTION:Let's get together to finalize. Way to go team in the final hom
-  estretch!\N
-SEQUENCE:0
-PRIORITY:5
-CLASS:
-CREATED:20011115T212414Z
-LAST-MODIFIED:20011115T212414Z
-STATUS:CONFIRMED
-TRANSP:OPAQUE
-X-MICROSOFT-CDO-BUSYSTATUS:BUSY
-X-MICROSOFT-CDO-INSTTYPE:0
-X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
-X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
-X-MICROSOFT-CDO-IMPORTANCE:1
-BEGIN:VALARM
-ACTION:DISPLAY
-DESCRIPTION:REMINDER
-TRIGGER;RELATED=START:-PT00H15M00S
-END:VALARM
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/exdate.ics b/framework/iCalendar/tests/fixtures/vTimezone/exdate.ics
deleted file mode 100644 (file)
index 1b7644c..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-X-WR-CALNAME:Nasa History\r
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
-X-WR-RELCALID:7A58AF63-46A0-11D7-BCDE-000A95673266-CALP\r
-X-WR-TIMEZONE;VALUE=TEXT:US/Central\r
-CALSCALE:GREGORIAN\r
-BEGIN:VEVENT\r
-DURATION:P1D\r
-EXDATE;VALUE=DATE:20030428\r
-DTSTAMP:20030926T233021Z\r
-UID:D2924923-RID\r
-DTSTART;VALUE=DATE:20020428\r
-SUMMARY:(1961) Little Joe 5B\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=4\r
-END:VEVENT\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/iscw.ics b/framework/iCalendar/tests/fixtures/vTimezone/iscw.ics
deleted file mode 100644 (file)
index a057b37..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-BEGIN:VCALENDAR\r
-CALSCALE:GREGORIAN\r
-METHOD:PUBLISH\r
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN\r
-X-WR-RELCALID;VALUE=TEXT:2C1BAB64-E9F4-11D7-ACE3-000393161A98\r
-X-WR-CALNAME;VALUE=TEXT:ISCW-related events\, Florida\r
-VERSION:2.0\r
-BEGIN:VEVENT\r
-SEQUENCE:52\r
-DTSTAMP:20030918T161429Z\r
-SUMMARY:Ontoweb Day http://nextwebgeneration.com/meetings/ontoweb5/\r
-DTEND;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T180000\r
-UID:2C1B765F-E9F4-11D7-ACE3-000393161A98\r
-DTSTART;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T093000\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:48\r
-DTSTAMP:20030918T161420Z\r
-SUMMARY:Ontoweb SIG day http://nextwebgeneration.com/meetings/ontoweb5/\r
-DTEND;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031018T180000\r
-UID:2C1B809B-E9F4-11D7-ACE3-000393161A98\r
-DTSTART;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031018T093000\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:2\r
-DTSTAMP:20030918T161218Z\r
-SUMMARY:Beach Barbeque\r
-DTEND;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T210000\r
-UID:2C1B8490-E9F4-11D7-ACE3-000393161A98\r
-DTSTART;\r
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20031017T200000\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:4\r
-UID:2C1B8832-E9F4-11D7-ACE3-000393161A98\r
-DTSTAMP:20030918T161537Z\r
-SUMMARY:DAML PI meeting - http:\r
- //www.daml.org/listarchive/daml-all/0283.html\r
-DTSTART;VALUE=DATE:20031016\r
-DTEND;VALUE=DATE:20031019\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:2\r
-UID:2C1B8BE6-E9F4-11D7-ACE3-000393161A98\r
-DTSTAMP:20030918T161930Z\r
-SUMMARY:ISCW workshops & tutorials (including one on OWL)\r
-DTSTART;VALUE=DATE:20031020\r
-DURATION:P1D\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:3\r
-UID:2C1B8F73-E9F4-11D7-ACE3-000393161A98\r
-DTSTAMP:20030918T162117Z\r
-SUMMARY:ISCW conference - technical program\, including invited talks by \r
- Jim and TBL.\r
-DTSTART;VALUE=DATE:20031021\r
-DTEND;VALUE=DATE:20031024\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:4\r
-UID:2C1B9326-E9F4-11D7-ACE3-000393161A98\r
-DTSTAMP:20030918T162014Z\r
-SUMMARY:K-CAP conference - http://sern.ucalgary.ca/ksi/K-CAP/K-CAP2003/\r
-DTSTART;VALUE=DATE:20031023\r
-DTEND;VALUE=DATE:20031026\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-SEQUENCE:5\r
-UID:2C1B96D2-E9F4-11D7-ACE3-000393161A98\r
-DTSTAMP:20030918T162022Z\r
-SUMMARY:K-CAP workshops\, including \"Knowledge Markup and Semantic \r
- Annotation\"\r\"Knowledge Management and the Semantic Web\" - http:\r
- //sern.ucalgary.ca/ksi/K-CAP/K-CAP2003/\r
-DTSTART;VALUE=DATE:20031025\r
-DTEND;VALUE=DATE:20031027\r
-END:VEVENT\r
-\r
-BEGIN:VTIMEZONE\r
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York\r
-X-LIC-LOCATION:America/New_York\r
-BEGIN:STANDARD\r
-TZOFFSETFROM:-0400\r
-TZOFFSETTO:-0500  \r
-TZNAME:EST\r
-DTSTART:19701025T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-TZOFFSETFROM:-0500\r
-TZOFFSETTO:-0400  \r
-TZNAME:EDT\r
-DTSTART:19700405T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-\r
-END:VCALENDAR\r
-\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/meeting.ics b/framework/iCalendar/tests/fixtures/vTimezone/meeting.ics
deleted file mode 100644 (file)
index a91e150..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-BEGIN:VCALENDAR
-METHOD:REQUEST
-PRODID:Microsoft CDO for Microsoft Exchange
-VERSION:2.0
-BEGIN:VTIMEZONE
-TZID:(GMT-05.00) Eastern Time (US & Canada)
-X-MICROSOFT-CDO-TZID:10
-BEGIN:STANDARD
-DTSTART:16010101T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=10;BYDAY=-1SU
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:16010101T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-RRULE:FREQ=YEARLY;WKST=MO;INTERVAL=1;BYMONTH=4;BYDAY=1SU
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:20060524T175426Z
-DTSTART;TZID="(GMT-05.00) Eastern Time (US & Canada)":20060605T130000
-SUMMARY:Updated: Webex Training - Encryption Push
-UID:040000008200E00074C5B7101A82E008000000009067FAA5207FC601000000000000000
- 010000000CE96E700B6553147A79107627E39018C
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE;CN="CT-Sales"
- :MAILTO:CT-Sales@CipherTrust.com
-ORGANIZER;CN="Maribell Buchanan":MAILTO:Maribell.Buchanan@CipherTrust.com
-LOCATION:
-DTEND;TZID="(GMT-05.00) Eastern Time (US & Canada)":20060605T140000
-DESCRIPTION:Topic: Encryption Push Training (Note unlisted meeting)\NDate: 
- Monday\, June 5\, 2006 \NTime: 1:00 pm\, Eastern Daylight Time (GMT -04:00
- \, New York) \NMeeting number: 481 417 492 \NMeeting password: ctpush \N\N
- Please click the following link to view or edit your meeting information\,
-  or to start your meeting. \N\N<https://ciphertrust.webex.com/ciphertrust/
- j.php?ED=90368382> \N\NTeleconference: \NUS Dial In:  877.208.5357 or 770.
- 659.4232\NUnited Kingdom Dial In:  08000320432\NConference Code:  67890491
- 98 \N\NTo add this meeting to your calendar program (for example\, Microso
- ft Outlook or Lotus Notes)\, do the following:  \N\N* For all calendar pro
- grams (except Lotus Notes)\, click the following link\, or copy the link a
- nd paste it into your Web browser: \N<https://ciphertrust.webex.com/cipher
- trust/j.php?ED=90368382&UID=478103317&ICS=MS> \N\N*For Lotus Notes\, follo
- w these steps: \N1.Right-click the attached iCalendar format (*.ics) file\
- , and then choose View. \N2.Click Import All. A new broadcast email messag
- e is added to your Inbox. \N3.Open the new message. \N4.Click Respond butt
- on. A menu appears. \N5.Click Accept. \N\NTo check for compatibility of ri
- ch media players for Universal Communications Format (UCF)\, click the fol
- lowing link: \Nhttps://ciphertrust.webex.com/ciphertrust/systemdiagnosis.p
- hp \N\Nhttp://www.webex.com\NWe've got to start meeting like this(TM) \N\N
- \N
-SEQUENCE:0
-PRIORITY:5
-CLASS:
-CREATED:20060524T175427Z
-LAST-MODIFIED:20060524T175428Z
-STATUS:CONFIRMED
-TRANSP:OPAQUE
-X-MICROSOFT-CDO-BUSYSTATUS:BUSY
-X-MICROSOFT-CDO-INSTTYPE:0
-X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY
-X-MICROSOFT-CDO-ALLDAYEVENT:FALSE
-X-MICROSOFT-CDO-IMPORTANCE:1
-X-MICROSOFT-CDO-OWNERAPPTID:974673878
-BEGIN:VALARM
-ACTION:DISPLAY
-DESCRIPTION:REMINDER
-TRIGGER;RELATED=START:-PT00H15M00S
-END:VALARM
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/privacy_events.ics b/framework/iCalendar/tests/fixtures/vTimezone/privacy_events.ics
deleted file mode 100644 (file)
index 14f51bd..0000000
+++ /dev/null
@@ -1,263 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION:2.0\r
-PRODID:-//Mozilla.org/NONSGML Mozilla Calendar V1.1//EN\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060719T072322Z\r
-DTSTAMP:20060719T072322Z\r
-UID:uuid:1149656622168\r
-SUMMARY:Australian Smart Card Summit\r
-CLASS:PUBLIC\r
-DTSTART;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060628T140000\r
-DTEND;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060628T150000\r
-URL:http://www.acevents.com.au/cards2006/\r
-DESCRIPTION:The Summit brings together the users and suppliers of smart \r
- card technology to discuss critical industry trends\, partnerships & \r
- alliances\, developing standards\, new applications\, new business \r
- opportunities and future direction.\r
-LOCATION:Sydney Convention and Exhibition Centre\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060719T072322Z\r
-DTSTAMP:20060719T072322Z\r
-UID:uuid:1149657736010\r
-SUMMARY:Privacy Laws & Business - 19th Annual International Conference\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20060702\r
-DTEND;VALUE=DATE:20060703\r
-URL:http://www.privacylaws.com/conferences.annual.html\r
-DESCRIPTION:Privacy Crisis Ahead? Investing enough in data protection to \r
- strengthen and defend your reputation\nThe Privacy Laws & Business 19th \r
- Annual International Conference features 50 speakers from 10 countries \r
- over three intensive days. Over half of these speakers are giving a \r
- presentation at this conference for the first time.\r
-LOCATION:St. John's College\, Cambridge\, UK\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060724T033326Z\r
-DTSTAMP:20060724T033326Z\r
-UID:uuid:1151539498937\r
-SUMMARY:Privacy in Practice 2006 - Introductory and Advanced sessions for \r
- Privacy Contact Officers\, tailored for the public and private sectors\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20061024\r
-DTEND;VALUE=DATE:20061027\r
-LOCATION:Sydney CBD\r
-DESCRIPTION:Anna Johnston and Nigel Waters\, former Deputy Privacy \r
- Commissioners for NSW and the Commonwealth respectively\, are offering \r
- Privacy Contact Officers (PCOs) an opportunity to update their knowledge \r
- and upgrade their skills in the practical implementation of privacy \r
- laws.\n\nIntroductory half day sessions on 24 October offer newly \r
- appointed PCOs the opportunity to familiarise themselves with the \r
- relevant privacy principles as they are being interpreted and applied in \r
- practice\, and to learn about the practical role of a PCO\, including \r
- compliance strategies.\n\nSeparate advanced full day sessions will focus \r
- on the law as it applies to the NSW public sector (25 October)\, and to \r
- the private sector in NSW (26 October)\, exploring in more depth the \r
- interpretation and enforcement of  privacy laws\, including new laws \r
- covering health information\, workplace surveillance\, and \r
- telecommunications.  The advanced sessions will also involve small group \r
- workshopping of scenarios\, to further develop the practical skills and \r
- compliance strategies needed to fulfil the PCO role.\r
-URL:http:\r
- //home.iprimus.com.au/nigelwaters/Privacy%20in%20Practice%20seminar%202006\r
- .htm\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060719T072322Z\r
-DTSTAMP:20060719T072322Z\r
-UID:uuid:1149656344744\r
-SUMMARY:Australian Biotechnology Summit 2006\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20060725\r
-DTEND;VALUE=DATE:20060727\r
-URL:http://www.acevents.com.au/bio2006\r
-DESCRIPTION:Now into its 4th year\, this summit attracts leading medical \r
- practitioners\, policy heads\, project financiers\, thought leaders and \r
- scientists. This July\, a distinguished panel of speakers is updating \r
- attendees about advances in a sector valued globally at US$63 billion. \r
- (Source: Chicago Tribune\, April 2006)\n\nBe there this July for a \r
- first-hand look at how the big pharmas\, medical institutions\, partners \r
- and consumers are benefiting from medical discoveries\, commercial \r
- alliances and partnerships\, venture partnerships\, co-development\, as \r
- well as mergers and acquisitions.\n\nMake sure you attend to share \r
- practical and time-saving strategies to:\n\n- DELIVER profits across your \r
- product pipeline\n- MOVE from trials to commercialisation\n- MAXIMISE the \r
- value of your assets\n- STRENGHTEN branding and distribution\n- BENEFIT \r
- from *mergers & acquisitions *co-licensing *joint ventures *capital \r
- raisings\n- READY products for manufacturing and sales\r
-LOCATION:Sydney Convention and Exhibition Centre\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060719T072322Z\r
-DTSTAMP:20060719T072322Z\r
-UID:uuid:1149657358209\r
-SUMMARY:SOCAP Australia 2006 Symposium\r
-CLASS:PUBLIC\r
-DTSTART;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060815T133000\r
-DTEND;TZID=/mozilla.org/20050126_1/Australia/Sydney:20060815T160000\r
-URL:http:\r
- //socap.org.au/html/s02_article/article_view.asp?id=638&nav_cat_id=134&nav\r
- _top_id=58&dsa=20\r
-DESCRIPTION:The Society of Consumer Affairs Professionals (SOCAP) \r
- Australia Symposium is the oldest and most prestigious consumer affairs \r
- and customer service event in Australia. Supported by the various \r
- industry regulatory bodies in Australia\, the Symposium provides a forum \r
- that promotes best practice and research into customer service and \r
- consumer affairs.\r
-LOCATION:Sydney\, Manly Pacific\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060719T072322Z\r
-LAST-MODIFIED:20060719T072322Z\r
-DTSTAMP:20060719T072322Z\r
-UID:uuid:1151028064071\r
-SUMMARY:Health Informatics Conference\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20060819\r
-DTEND;VALUE=DATE:20060822\r
-URL:http://www.hic.org.au\r
-DESCRIPTION:Bridging the Digital Divide: Consumers\, Clinicians & \r
- Computers\n\nHIC 2006 is Australia's premier health informatics \r
- conference. This event brings national and international experts in \r
- health information technology together to address some of the critical \r
- information systems issues in Australian health care. It is also an \r
- important opportunity to meet and exchange views with colleagues in the \r
- health information technology sector.\r
-LOCATION:Sydney Convention Centre\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060720T041700Z\r
-LAST-MODIFIED:20060720T042923Z\r
-DTSTAMP:20060720T042923Z\r
-UID:uuid1153369107395\r
-SUMMARY:Security 2006\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20060829\r
-DTEND;VALUE=DATE:20060901\r
-DESCRIPTION:Security 2006 Conference & Exhibition is the event that \r
- brings the industry's key decision makers\, leaders\, suppliers and \r
- customers together to do business.\n\nNow entering its 21st year\, \r
- Australia's premier security industry event offers a unique platform to \r
- target a highly qualified audience of security professionals.\r
-LOCATION:Hall 5 and 6\, Sydney Convention and Exhibition Centre\, Darling \r
- Harbour\r
-URL:http:\r
- //www.asial.com.au/default.asp?page=security+expo/home&flashver=8.0.22\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060720T041921Z\r
-LAST-MODIFIED:20060720T042110Z\r
-DTSTAMP:20060720T042110Z\r
-UID:uuid1153369270069\r
-SUMMARY:Border Control & Port Security 2006\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20060807\r
-DTEND;VALUE=DATE:20060809\r
-DESCRIPTION:Border Control & Port Security 2006 will focus on the \r
- legislative and technology challenges facilitating the transformation of \r
- inter- agency initiatives to secure ports and strategic points of entry \r
- into Australia. This event will analyse and review the progress\, \r
- achievements and pitfalls of agency and industry initiatives and focus on \r
- future directions.\r
-LOCATION:The Vibe Savoy Hotel\, Melbourne\, Victoria\r
-URL:http:\r
- //www.iir.com.au/conferences/confdetail.html?detail=I0354.html&cat_code=se\r
- curity&conf_code=I0354\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060728T011147Z\r
-LAST-MODIFIED:20060728T011338Z\r
-DTSTAMP:20060728T011338Z\r
-UID:uuid1154049185025\r
-SUMMARY:Identity Fraud Summit\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE:20061031\r
-DTEND;VALUE=DATE:20061103\r
-DESCRIPTION:The key meeting place for those involved with Fraud & \r
- Identity Management in the public and private sector.\nDeveloping a \r
- synthesis between public and private sector to produce a national \r
- response.\n- DISCOVER... the latest Global trends in Identity Fraud\n- \r
- FIND OUT... what the impact and cost of Identity Fraud is on Australia\n- \r
- TAKE PART... in Seven Interactive Discussions\n- MEET... and swap ideas \r
- with your industry peers at the Networking Drinks\n- LEARN... how \r
- collaboration can help to combat Identity Fraud (trust centre concept)... \r
- from Westpac & Australia Post\n- GET INFORMED... on the Hong Kong \r
- National Identity Card featuring Raymond Wai-man Wong\n- UNDERSTAND... \r
- the role and value of the government health and welfare access card\r
-LOCATION:Swissôtel Sydney\r
-URL:http:\r
- //www.iir.com.au/conferences/confdetail.html?conf_code=L1282&cat_code=fina\r
- nce&detail=L1282.html\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-CREATED:20060809T015738Z\r
-LAST-MODIFIED:20060809T023217Z\r
-DTSTAMP:20060809T023217Z\r
-UID:uuid1155089998351\r
-SUMMARY:Privacy Awareness Week\r
-PRIORITY:0\r
-CLASS:PUBLIC\r
-DTSTART;VALUE=DATE;TZID=/mozilla.org/20050126_1/Asia/Sakhalin:20060827\r
-DTEND;VALUE=DATE;TZID=/mozilla.org/20050126_1/Asia/Sakhalin:20060903\r
-URL:http://www.privacy.gov.au/news/paw.html\r
-LOCATION:Victoria\, NSW\, NT and Federal\r
-DESCRIPTION:The week is an opportunity for organisations and agencies \r
- affected by the Privacy Act 1998 (Cth) to promote privacy awareness to \r
- their staff\, custotmers\, and to the wider community.\n\nPrivacy \r
- Awareness Week is a promotional campaign first initiated by Privacy \r
- Victoria in 2001. This year\, for the first time\, Privacy Awareness Week \r
- has gone national and will be jointly promoted by the Office of the \r
- Privacy Commissioner\, Privacy Victorian and Privacy NSW and the Office \r
- of the Information Commissioner of the Northern Territory.\n\nThe theme \r
- is \"Don't leave privacy to chance\".\n\nOPC - http:\r
- //www.privacy.gov.au/news/paw.html\nVictoria - http:\r
- //www.privacy.vic.gov.au/dir100/priweb.nsf\nNSW - http:\r
- //www.lawlink.nsw.gov.au/lawlink/privacynsw/ll_pnsw.nsf/pages/PNSW_index\n\r
- NT - http://www.privacy.nt.gov.au/\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID:/mozilla.org/20050126_1/Asia/Sakhalin\r
-X-LIC-LOCATION:Asia/Sakhalin\r
-BEGIN:STANDARD\r
-TZOFFSETFROM:+1100\r
-TZOFFSETTO:+1000\r
-TZNAME:SAKT\r
-DTSTART:19701025T030000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-TZOFFSETFROM:+1000\r
-TZOFFSETTO:+1100\r
-TZNAME:SAKST\r
-DTSTART:19700329T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID:/mozilla.org/20050126_1/Australia/Sydney\r
-X-LIC-LOCATION:Australia/Sydney\r
-BEGIN:STANDARD\r
-TZOFFSETFROM:+1100\r
-TZOFFSETTO:+1000\r
-TZNAME:EST\r
-DTSTART:19700329T030000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3\r
-END:STANDARD\r
-BEGIN:DAYLIGHT\r
-TZOFFSETFROM:+1000\r
-TZOFFSETTO:+1100\r
-TZNAME:EST\r
-DTSTART:19701025T020000\r
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10\r
-END:DAYLIGHT\r
-END:VTIMEZONE\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/rfc2445.ics b/framework/iCalendar/tests/fixtures/vTimezone/rfc2445.ics
deleted file mode 100644 (file)
index 363231d..0000000
+++ /dev/null
@@ -1,305 +0,0 @@
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//hacksw/handcal//NONSGML v1.0//EN
-BEGIN:VEVENT
-DTSTART:19970714T170000Z
-DTEND:19970715T035959Z
-SUMMARY:Bastille Day Party
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123401@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970903T163000Z
-DTEND:19970903T190000Z
-SUMMARY:Annual Employee Review
-CLASS:PRIVATE
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123402@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970401T163000Z
-DTEND:19970402T010000Z
-SUMMARY:Laurel is in sensitivity awareness class.
-CLASS:PUBLIC
-CATEGORIES:BUSINESS,HUMAN RESOURCES
-TRANSP:TRANSPARENT
-END:VEVENT
-
-BEGIN:VEVENT
-UID:19970901T130000Z-123403@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19971102
-SUMMARY:Our Blissful Anniversary
-CLASS:CONFIDENTIAL
-CATEGORIES:ANNIVERSARY,PERSONAL,SPECIAL OCCASION
-RRULE:FREQ=YEARLY
-END:VEVENT
-
-BEGIN:VTODO
-UID:19970901T130000Z-123404@host.com
-DTSTAMP:19970901T1300Z
-DTSTART:19970415T133000Z
-DUE:19970416T045959Z
-SUMMARY:1996 Income Tax Preparation
-CLASS:CONFIDENTIAL
-CATEGORIES:FAMILY,FINANCE
-PRIORITY:1
-STATUS:NEEDS-ACTION
-END:VTODO
-BEGIN:VJOURNAL
-UID:19970901T130000Z-123405@host.com
-DTSTAMP:19970901T1300Z
-DTSTART;VALUE=DATE:19970317
-SUMMARY:Staff meeting minutes
-DESCRIPTION:1. Staff meeting: Participants include Joe\, Lisa
-  and Bob. Aurora project plans were reviewed. There is currently
-  no budget reserves for this project. Lisa will escalate to
-  management. Next meeting on Tuesday.\n
-  2. Telephone Conference: ABC Corp. sales representative called
-  to discuss new printer. Promised to get us a demo by Friday.\n
-  3. Henry Miller (Handsoff Insurance): Car was totaled by tree.
-  Is looking into a loaner car. 654-2323 (tel).
-END:VJOURNAL
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTART:19971015T050000Z
-DTEND:19971016T050000Z
-DTSTAMP:19970901T083000Z
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jane_doe@host1.com
-ATTENDEE:MAILTO:john_public@host2.com
-DTSTAMP:19970901T100000Z
-FREEBUSY;VALUE=PERIOD:19971015T050000Z/PT8H30M,
- 19971015T160000Z/PT5H30M,19971015T223000Z/PT6H30M
-URL:http://host2.com/pub/busy/jpublic-01.ifb
-COMMENT:This iCalendar file contains busy time information for
-  the next three months.
-END:VFREEBUSY
-BEGIN:VFREEBUSY
-ORGANIZER:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19971026T020000
-RDATE:19971026T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19971026T020000
-RDATE:19970406T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VTIMEZONE
-TZID:US--Fictitious-Eastern
-LAST-MODIFIED:19870101T000000Z
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-BEGIN:DAYLIGHT
-DTSTART:19990424T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19970317T133000Z
-REPEAT:4
-DURATION:PT15M
-ACTION:AUDIO
-ATTACH;FMTTYPE=audio/basic:ftp://host.com/pub/sounds/bell-01.aud
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-PT30M
-REPEAT:2
-DURATION:PT15M
-ACTION:DISPLAY
-DESCRIPTION:Breakfast meeting with executive\n
- team at 8:30 AM EST.
-END:VALARM
-BEGIN:VALARM
-TRIGGER:-P2D
-ACTION:EMAIL
-ATTENDEE:MAILTO:john_doe@host.com
-SUMMARY:*** REMINDER: SEND AGENDA FOR WEEKLY STAFF MEETING ***
-DESCRIPTION:A draft agenda needs to be sent out to the attendees
-  to the weekly managers meeting (MGR-LIST). Attached is a
-  pointer the document template for the agenda file.
-ATTACH;FMTTYPE=application/binary:http://host.com/templates/agen
- da.doc
-END:VALARM
-BEGIN:VALARM
-TRIGGER;VALUE=DATE-TIME:19980101T050000Z
-REPEAT:23
-DURATION:PT1H
-ACTION:PROCEDURE
-ATTACH;FMTTYPE=application/binary:ftp://host.com/novo-
- procs/felizano.exe
-END:VALARM
-
-BEGIN:VTIMEZONE
-TZID:US-Eastern
-BEGIN:STANDARD
-DTSTART:19981025T020000
-RDATE:19981025T020000
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19990404T020000
-RDATE:19990404T020000
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTAMP:19980309T231000Z
-UID:guid-1.host1.com
-ORGANIZER;ROLE=CHAIR:MAILTO:mrbig@host.com
-ATTENDEE;RSVP=TRUE;ROLE=REQ-PARTICIPANT;CUTYPE=GROUP:
- MAILTO:employee-A@host.com
-DESCRIPTION:Project XYZ Review Meeting
-CATEGORIES:MEETING
-CLASS:PUBLIC
-CREATED:19980309T130000Z
-SUMMARY:XYZ Project Review
-DTSTART;TZID=US-Eastern:19980312T083000
-DTEND;TZID=US-Eastern:19980312T093000
-LOCATION:1CP Conference Room 4350
-END:VEVENT
-
-BEGIN:VEVENT
-DTSTAMP:19970324T1200Z
-SEQUENCE:0
-UID:uid3@host1.com
-ORGANIZER:MAILTO:jdoe@host1.com
-DTSTART:19970324T123000Z
-DTEND:19970324T210000Z
-CATEGORIES:MEETING,PROJECT
-CLASS:PUBLIC
-SUMMARY:Calendaring Interoperability Planning Meeting
-DESCRIPTION:Discuss how we can test c&s interoperability\n
- using iCalendar and other IETF standards.
-LOCATION:LDB Lobby
-ATTACH;FMTTYPE=application/postscript:ftp://xyzCorp.com/pub/
- conf/bkgrnd.ps
-END:VEVENT
-
-BEGIN:VTODO
-DTSTAMP:19980130T134500Z
-SEQUENCE:2
-UID:uid4@host1.com
-ORGANIZER:MAILTO:unclesam@us.gov
-ATTENDEE;PARTSTAT=ACCEPTED:MAILTO:jqpublic@host.com
-DUE:19980415T235959
-STATUS:NEEDS-ACTION
-SUMMARY:Submit Income Taxes
-BEGIN:VALARM
-ACTION:AUDIO
-TRIGGER:19980403T120000
-ATTACH;FMTTYPE=audio/basic:http://host.com/pub/audio-
- files/ssbanner.aud
-REPEAT:4
-DURATION:PT1H
-END:VALARM
-END:VTODO
-
-BEGIN:VJOURNAL
-DTSTAMP:19970324T120000Z
-UID:uid5@host1.com
-ORGANIZER:MAILTO:jsmith@host.com
-STATUS:DRAFT
-CLASS:PUBLIC
-CATEGORIES:Project Report, XYZ, Weekly Meeting
-DESCRIPTION:Project xyz Review Meeting Minutes\n
- Agenda\n1. Review of project version 1.0 requirements.\n2.
- Definition
- of project processes.\n3. Review of project schedule.\n
- Participants: John Smith\, Jane Doe\, Jim Dandy\n-It was
-  decided that the requirements need to be signed off by
-  product marketing.\n-Project processes were accepted.\n
- -Project schedule needs to account for scheduled holidays
-  and employee vacation time. Check with HR for specific
-  dates.\n-New schedule will be distributed by Friday.\n-
- Next weeks meeting is cancelled. No meeting until 3/23.
-END:VJOURNAL
-
-BEGIN:VFREEBUSY
-ORGANIZER:MAILTO:jsmith@host.com
-DTSTART:19980313T141711Z
-DTEND:19980410T141711Z
-FREEBUSY:19980314T233000Z/19980315T003000Z
-FREEBUSY:19980316T153000Z/19980316T163000Z
-FREEBUSY:19980318T030000Z/19980318T040000Z
-URL:http://www.host.com/calendar/busytime/jsmith.ifb
-END:VFREEBUSY
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/test.vcs b/framework/iCalendar/tests/fixtures/vTimezone/test.vcs
deleted file mode 100644 (file)
index 33476d1..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-BEGIN:VCALENDAR
-BEGIN:VTIMEZONE
-TZID:US/Eastern
-LAST-MODIFIED:19870101T000000Z
-TZURL:http://zones.stds_r_us.net/tz/US-Eastern
-BEGIN:STANDARD
-DTSTART:19671029T020000
-RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19870405T020000
-RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-END:DAYLIGHT
-END:VTIMEZONE
-
-BEGIN:VEVENT
-UID:14b2f1a:10aba5a6339:3fcd
-SUMMARY:2007 Astronaut Glove Challenge: APRIL DATE TBD
-LOCATION:To be determined (TBD)
-DTSTART;TZID=US/Eastern:20021101
-DTEND;TZID=US/Eastern:20021101
-URL:www.astronaut-glove.us
-ORGANIZER;CN="Barry Epstein":MAILTO:barry.epstein@nasa.gov
-CATEGORIES:Centennial Challenges*
-STATUS:CONFIRMED
-END:VEVENT
-
-END:VCALENDAR
\ No newline at end of file
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/test4.vcs b/framework/iCalendar/tests/fixtures/vTimezone/test4.vcs
deleted file mode 100644 (file)
index ef06c64..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-BEGIN:VCALENDAR
-CALSCALE:GREGORIAN
-X-WR-TIMEZONE;VALUE=TEXT:America/New_York
-METHOD:PUBLISH
-PRODID:-//Apple Computer\, Inc//iCal 1.0//EN
-X-WR-CALNAME;VALUE=TEXT:Chiefs
-X-WR-RELCALID;VALUE=TEXT:D60439DF-C1C9-11D6-9446-003065F198AC
-VERSION:2.0
-
-BEGIN:VEVENT
-DTSTAMP:20020906T031451Z
-SUMMARY:Chiefs vs. Buffalo @ Arrowhead Stadium
-DTEND;
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20021117T170000
-UID:D604022C-C1C9-11D6-9446-003065F198AC
-DTSTART;
- TZID=/softwarestudio.org/Olson_20011030_5/America/New_York:20021117T140000
-END:VEVENT
-
-BEGIN:VTIMEZONE
-TZID:/softwarestudio.org/Olson_20011030_5/America/New_York
-X-LIC-LOCATION:America/New_York
-BEGIN:STANDARD
-TZOFFSETFROM:-0400
-TZOFFSETTO:-0500
-TZNAME:EST
-DTSTART:19701025T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-TZOFFSETFROM:-0500
-TZOFFSETTO:-0400
-TZNAME:EDT
-DTSTART:19700405T020000
-RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=1SU;BYMONTH=4
-END:DAYLIGHT
-END:VTIMEZONE
-
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/test_recurring.vcs b/framework/iCalendar/tests/fixtures/vTimezone/test_recurring.vcs
deleted file mode 100644 (file)
index 8d01f59..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-BEGIN:VCALENDAR
-X-LOTUS-CHARSET:UTF-8
-VERSION:2.0
-PRODID:-//Lotus Development Corporation//NONSGML Notes 6.0//EN
-METHOD:REQUEST
-BEGIN:VTIMEZONE
-TZID:Central European
-BEGIN:STANDARD
-DTSTART:19501029T020000
-TZOFFSETFROM:+0200
-TZOFFSETTO:+0100
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=10
-END:STANDARD
-BEGIN:DAYLIGHT
-DTSTART:19500326T020000
-TZOFFSETFROM:+0100
-TZOFFSETTO:+0200
-RRULE:FREQ=YEARLY;BYMINUTE=0;BYHOUR=2;BYDAY=-1SU;BYMONTH=3
-END:DAYLIGHT
-END:VTIMEZONE
-BEGIN:VEVENT
-DTSTART;TZID="Central European":20040417T110000
-DTEND;TZID="Central European":20040417T113000
-TRANSP:OPAQUE
-DTSTAMP:20040416T075254Z
-SEQUENCE:0
-ATTENDEE;ROLE=CHAIR;PARTSTAT=ACCEPTED;CN="XXXX/UNSA"
- ;RSVP=FALSE:mailto:XXXX@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:XXXX1@XXXX.com
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="XXXX2";RSVP=TRUE:mailto:XXXX2@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION
- ;CN="XXXX3";RSVP=TRUE:mailto:XXXX3@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:XXXX4@XXXX.ba
-ATTENDEE;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP=TRUE
- :mailto:vljubovic@smartnet.ba
-CLASS:PUBLIC
-SUMMARY:XXXStriked out XXX
-ORGANIZER;CN="XXXX/UNSA":mailto:XXXX@XXXX.ba
-UID:59A47452891243FCC1256E78002B082C-Lotus_Notes_Generated
-X-LOTUS-BROADCAST:FALSE
-X-LOTUS-UPDATE-SEQ:1
-X-LOTUS-UPDATE-WISL:$S:1;$L:1;$B:1;$R:1;$E:1
-X-LOTUS-NOTESVERSION:2
-X-LOTUS-NOTICETYPE:I
-X-LOTUS-CHILD_UID:59A47452891243FCC1256E78002B082C
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/fixtures/vTimezone/wicca.ics b/framework/iCalendar/tests/fixtures/vTimezone/wicca.ics
deleted file mode 100644 (file)
index c5b198c..0000000
+++ /dev/null
@@ -1,568 +0,0 @@
-BEGIN:VCALENDAR\r
-VERSION\r
- :2.0\r
-PRODID\r
- :-//Mozilla.org/NONSGML Mozilla Calendar V1.0//EN\r
-BEGIN:VEVENT\r
-UID\r
- :293f6ec0-7d5c-11d9-9edb-86b60372ed4f\r
-SUMMARY\r
- :Wolf Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050125T103200\r
-DTEND\r
- :20050125T103200\r
-DTSTAMP\r
- :20050213T010920Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :4b796be0-7d5c-11d9-a79e-f521d81ef98e\r
-SUMMARY\r
- :Snow Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050224T045400\r
-DTEND\r
- :20050224T045400\r
-DTSTAMP\r
- :20050213T011118Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :687d6650-7d5c-11d9-b9ce-d66b104d4c5c\r
-SUMMARY\r
- :Worm Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050325T205800\r
-DTEND\r
- :20050325T205800\r
-DTSTAMP\r
- :20050213T011216Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :7fdedfc0-7d5c-11d9-9f01-8a1645cec7bc\r
-SUMMARY\r
- :Pink Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050424T100600\r
-DTEND\r
- :20050424T100600\r
-DTSTAMP\r
- :20050213T011313Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :9b7bc120-7d5c-11d9-b9fd-fddd77a2f4ee\r
-SUMMARY\r
- :Flower Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050523T201800\r
-DTEND\r
- :20050523T201800\r
-DTSTAMP\r
- :20050213T011346Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :b74fa540-7d5c-11d9-8bc4-c07a48ed7f9f\r
-SUMMARY\r
- :Strawberry Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050622T041400\r
-DTEND\r
- :20050622T041400\r
-DTSTAMP\r
- :20050213T011447Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :cac83ae0-7d5c-11d9-83a6-c557260cbb42\r
-SUMMARY\r
- :Buck Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050721T110000\r
-DTEND\r
- :20050721T110000\r
-DTSTAMP\r
- :20050213T011521Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :e29632a0-7d5c-11d9-8e39-c4ffeaa792b7\r
-SUMMARY\r
- :Sturgeon Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050819T175300\r
-DTEND\r
- :20050819T175300\r
-DTSTAMP\r
- :20050213T011549Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :f755ca60-7d5c-11d9-834c-eca1a5a058a8\r
-SUMMARY\r
- :Harvest Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20050918T020100\r
-DTEND\r
- :20050918T020100\r
-DTSTAMP\r
- :20050213T011634Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :0e53f0a0-7d5d-11d9-aa77-85a55723aa1a\r
-SUMMARY\r
- :Hunter's Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20041017T121400\r
-DTEND\r
- :20041017T121400\r
-DTSTAMP\r
- :20050213T011711Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :1ef9be90-7d5d-11d9-a40c-bbc7de36c237\r
-SUMMARY\r
- :Beaver Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20051116T005700\r
-DTEND\r
- :20051116T005700\r
-DTSTAMP\r
- :20050213T011742Z\r
-END:VEVENT\r
-BEGIN:VEVENT\r
-UID\r
- :311774a0-7d5d-11d9-9276-c725d4bd91bb\r
-SUMMARY\r
- :Cold Moon\r
-CATEGORIES\r
- :Religious\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- :20051215T161500\r
-DTEND\r
- :20051215T161500\r
-DTSTAMP\r
- :20050213T011811Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :a35db050-7d57-11d9-acd7-80bf3de81f21\r
-SUMMARY\r
- :Imbolc\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Imbolc\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050202\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050203\r
-DTSTAMP\r
- :20050213T003803Z\r
-LAST-MODIFIED\r
- :20050213T013635Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :ee441e90-7d58-11d9-9cee-8ded43aa4674\r
-SUMMARY\r
- :Ostara (Spring Equinox)\r
-DESCRIPTION\r
- :Vernal equinox - 2005-03-20 12:31\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Ostara\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050320\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050321\r
-DTSTAMP\r
- :20050213T004630Z\r
-LAST-MODIFIED\r
- :20050213T013646Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :ca2146f0-7d59-11d9-8273-cf31bbadf60d\r
-SUMMARY\r
- :Beltane\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Beltane\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050501\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050502\r
-DTSTAMP\r
- :20050213T005347Z\r
-LAST-MODIFIED\r
- :20050213T013657Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :475aa800-7d59-11d9-8ed1-d5e698b9bd8a\r
-SUMMARY\r
- :Litha (Summer Solstice)\r
-DESCRIPTION\r
- :Summer solstice: 2005-06-21 06:37\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Midsummer\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050621\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050622\r
-DTSTAMP\r
- :20050213T004839Z\r
-LAST-MODIFIED\r
- :20050213T013708Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :efb2fd10-7d59-11d9-a277-a16bba33fd3b\r
-SUMMARY\r
- :Lughnasadh\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Lughnasadh\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050801\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050802\r
-DTSTAMP\r
- :20050213T005432Z\r
-LAST-MODIFIED\r
- :20050213T013720Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :6bdc5ec0-7d59-11d9-8b46-f9c22fa24f9b\r
-SUMMARY\r
- :Mabon (Autumnal Equinox)\r
-DESCRIPTION\r
- :Autumnal equinox:  2005-09-22 22:15\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Mabon\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050922\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20050923\r
-DTSTAMP\r
- :20050213T005052Z\r
-LAST-MODIFIED\r
- :20050213T013736Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :052e88e0-7d5a-11d9-8b11-cf36bfaf3b82\r
-SUMMARY\r
- :Samhain\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Samhain\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20051031\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20051101\r
-DTSTAMP\r
- :20050213T005533Z\r
-LAST-MODIFIED\r
- :20050213T013749Z\r
-END:VEVENT\r
-BEGIN:VTIMEZONE\r
-TZID\r
- :/Mozilla.org/BasicTimezones/GMT\r
-LOCATION\r
- :GMT\r
-END:VTIMEZONE\r
-BEGIN:VEVENT\r
-UID\r
- :94627ab0-7d59-11d9-baa4-ff7960c01405\r
-SUMMARY\r
- :Yule (Winter Solstice)\r
-DESCRIPTION\r
- :Winter solstice:  2005-12-21 18:33\r
-CATEGORIES\r
- :Religious\r
-URL\r
- :http://en.wikipedia.org/wiki/Yule\r
-STATUS\r
- :CONFIRMED\r
-CLASS\r
- :PUBLIC\r
-X-MOZILLA-ALARM-DEFAULT-LENGTH\r
- :0\r
-DTSTART\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20051221\r
-DTEND\r
- ;VALUE=DATE\r
- ;TZID=/Mozilla.org/BasicTimezones/GMT\r
- :20051222\r
-DTSTAMP\r
- :20050213T005154Z\r
-LAST-MODIFIED\r
- :20050213T013804Z\r
-END:VEVENT\r
-END:VCALENDAR\r
diff --git a/framework/iCalendar/tests/geo.phpt b/framework/iCalendar/tests/geo.phpt
deleted file mode 100644 (file)
index a02df3e..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
---TEST--
-GEO test
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$data = 'BEGIN:VCARD
-VERSION:2.1
-GEO:37.24,-17.87
-END:VCARD';
-
-$ical->parseVCalendar($data);
-$vcard = $ical->getComponent(0);
-var_export($vcard->getAttribute('GEO'));
-echo "\n";
-
-$data = 'BEGIN:VCARD
-VERSION:3.0
-GEO:37.386013;-122.082932
-END:VCARD';
-
-$ical->parseVCalendar($data);
-$vcard = $ical->getComponent(0);
-var_export($vcard->getAttribute('GEO'));
-
-?>
---EXPECT--
-array (
-  'latitude' => -17.87,
-  'longitude' => 37.24,
-)
-array (
-  'latitude' => 37.386013,
-  'longitude' => -122.082932,
-)
diff --git a/framework/iCalendar/tests/iCalendar.phpt b/framework/iCalendar/tests/iCalendar.phpt
deleted file mode 100644 (file)
index 03c9dfc..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
---TEST--
-Tests the date parsing in iCalendar.php
---FILE--
-<?php
-
-$data = 'BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//proko2//freebusy 1.0//EN
-METHOD:PUBLISH
-BEGIN:VFREEBUSY
-ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
-DTSTAMP:20061122T230929Z
-DTSTART:19700101T000000Z
-DTEND:BORKED
-FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;
- X-SUMMARY=dGVzdHRlcm1pbg==:20061123T050000Z/20061123T060000Z
-FREEBUSY:20061123T080000Z/PT2H
-END:VFREEBUSY
-END:VCALENDAR';
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-// Parse the data
-$ical->parseVCalendar($data);
-
-// Get the vFreeBusy component
-$vfb = $ical->getComponent(0);
-
-var_dump($vfb->getAttribute('DTSTART'));
-var_dump($vfb->getAttribute('DTEND'));
-
-?>
---EXPECT--
-int(0)
-string(6) "BORKED"
diff --git a/framework/iCalendar/tests/line-folding.phpt b/framework/iCalendar/tests/line-folding.phpt
deleted file mode 100644 (file)
index 2b551db..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
---TEST--
-Line folding tests.
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-
-$ical = new Horde_iCalendar();
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DESCRIPTION', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.');
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-echo "\n";
-
-$ical = new Horde_iCalendar('1.0');
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DESCRIPTION', 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.');
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-echo "\n";
-
-$ical = new Horde_iCalendar();
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DESCRIPTION', 'Lörem ipsüm dölör sit Ã¤met, cönsectetüer Ã¤dipiscing elit. Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.');
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-echo "\n";
-
-$ical = new Horde_iCalendar('1.0');
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DESCRIPTION', 'Lörem ipsüm dölör sit Ã¤met, cönsectetüer Ã¤dipiscing elit. Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.', array('CHARSET' => 'UTF-8'));
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-echo "\n";
-
-$ical = new Horde_iCalendar('1.0');
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DESCRIPTION', 'Löremipsümdölörsitämet,cönsectetüerädipiscingelit.Aliqüämsöllicitüdinfäücibüsmäürisämet. Löremipsümdölörsitämet,cönsectetüerädipiscingelit.Aliqüämsöllicitüdinfäücibüsmäürisämet.', array('CHARSET' => 'UTF-8'));
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-echo "\n";
-
-$ical = new Horde_iCalendar();
-$event = Horde_iCalendar::newComponent('vevent', $ical);
-$event->setAttribute('UID', 'XXX');
-$event->setAttribute('DTSTART', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$event->setAttribute('DTSTAMP', array('year' => 2008, 'month' => 1, 'mday' => 1), array('VALUE' => 'DATE'));
-$description = <<<EOT
-SYLVIE DAGORNE a Ã©crit :
-
-Bonjour,
-
-suite Ã  mon appel téléphonique auprès de Jacques Benzerara, il m'a renvoyé vers vous. En effet, je souhaiterais vous rencontrer car:
-1°) au niveau de l'observatoire local nous devons lancer une enquête sur un suivi de cohorte Ã  la rentrée prochaine qui concernera tous les Ã©tudiants de L1. Nous souhaiterons faire un questionnaire en ligne ce questionnaire devra Ãªtre hébergé sur un serveur.
-
-2°) dans le cadre de l'observatoire régional, nos partenaires nous demande Ã©galement de faire des questionnaires en ligne. Nous disposons du logiciel Modalisa qui permet de le réaliser mais du point de vu technique, nous avons besoin de voir avec vous,  les difficultés et les limites d'un tel dispositif afin de voir les démarches Ã  suivre et pouvoir Ã©voquer tous ces problèmes techniques, je souhaiterais vous rencontrer. Merci de me précisez vos disponibilités?
-...
-Je serai accompagné d'un collègue pour l'observatoire local (David Le foll) et de la chargée d'études de l'observatoire régional (Amélie Gicquel) pour la partie régionale.
-EOT;
-$event->setAttribute('DESCRIPTION', $description);
-$ical->addComponent($event);
-echo $ical->exportVCalendar();
-
-?>
---EXPECT--
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART;VALUE=DATE:20080101
-DTSTAMP;VALUE=DATE:20080101
-DESCRIPTION:Lorem ipsum dolor sit amet\, consectetuer adipiscing elit.
-  Aliquam sollicitudin faucibus mauris amet.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-VERSION:1.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART:20080101T000000
-DTSTAMP:20080101T000000
-DESCRIPTION:Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aliquam sollicitudin faucibus mauris amet.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART;VALUE=DATE:20080101
-DTSTAMP;VALUE=DATE:20080101
-DESCRIPTION:Lörem ipsüm dölör sit Ã¤met\, cönsectetüer Ã¤dipiscing elit.
-  Aliqüäm söllicitüdin fäücibüs mäüris Ã¤met.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-VERSION:1.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART:20080101T000000
-DTSTAMP:20080101T000000
-DESCRIPTION;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:L=C3=B6rem ips=C3=BCm d=C3=B6l=C3=B6r sit =C3=A4met,=
- c=C3=B6nsectet=C3=BCer =C3=A4dipiscing elit. Aliq=C3=BC=C3=A4m=
- s=C3=B6llicit=C3=BCdin f=C3=A4=C3=BCcib=C3=BCs m=C3=A4=C3=BCris =C3=A4met.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-VERSION:1.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART:20080101T000000
-DTSTAMP:20080101T000000
-DESCRIPTION;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:L=C3=B6remips=C3=BCmd=C3=B6l=C3=B6rsit=C3=A4met,c=C3=B6nsectet=C3=BCer=C3=A=
-4dipiscingelit.Aliq=C3=BC=C3=A4ms=C3=B6llicit=C3=BCdinf=C3=A4=C3=BCcib=C3=B=
-Csm=C3=A4=C3=BCris=C3=A4met.=
- L=C3=B6remips=C3=BCmd=C3=B6l=C3=B6rsit=C3=A4met,c=C3=B6nsectet=C3=BCer=C3==
-A4dipiscingelit.Aliq=C3=BC=C3=A4ms=C3=B6llicit=C3=BCdinf=C3=A4=C3=BCcib=C3==
-BCsm=C3=A4=C3=BCris=C3=A4met.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
-
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:XXX
-DTSTART;VALUE=DATE:20080101
-DTSTAMP;VALUE=DATE:20080101
-DESCRIPTION:SYLVIE DAGORNE a Ã©crit :\n\nBonjour\,\n\nsuite Ã  mon appel
-  téléphonique auprès de Jacques Benzerara\, il m'a renvoyé vers vous. En
-  effet\, je souhaiterais vous rencontrer car:\n1°) au niveau de
-  l'observatoire local nous devons lancer une enquête sur un suivi de
-  cohorte Ã  la rentrée prochaine qui concernera tous les Ã©tudiants de L1.
-  Nous souhaiterons faire un questionnaire en ligne ce questionnaire devra
-  Ãªtre hébergé sur un serveur.\n\n2°) dans le cadre de l'observatoire
-  régional\, nos partenaires nous demande Ã©galement de faire des
-  questionnaires en ligne. Nous disposons du logiciel Modalisa qui permet
-  de le réaliser mais du point de vu technique\, nous avons besoin de voir
-  avec vous\,  les difficultés et les limites d'un tel dispositif afin de
-  voir les démarches Ã  suivre et pouvoir Ã©voquer tous ces problèmes
-  techniques\, je souhaiterais vous rencontrer. Merci de me précisez vos
-  disponibilités?\n...\nJe serai accompagné d'un collègue pour
-  l'observatoire local (David Le foll) et de la chargée d'études de
-  l'observatoire régional (Amélie Gicquel) pour la partie régionale.
-SUMMARY:
-END:VEVENT
-END:VCALENDAR
diff --git a/framework/iCalendar/tests/quoted-params.phpt b/framework/iCalendar/tests/quoted-params.phpt
deleted file mode 100644 (file)
index f9d011d..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
---TEST--
-Ensure parameters are correctly quoted.
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-$readIcal = new Horde_iCalendar();
-
-$event1 = Horde_iCalendar::newComponent('vevent', $ical);
-
-$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
-$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
-$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
-$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
-$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
-$event1->setAttribute('ORGANIZER', 'mailto:mueller@example.org', array('CN' => "Klä,rc\"hen;\n Mül:ler"));
-
-$ical->addComponent($event1);
-
-echo $ical->exportVCalendar();
-
-$readIcal->parseVCalendar($ical->exportVCalendar());
-$event1 = $readIcal->getComponent(0);
-$attr = $event1->getAttribute('ORGANIZER', true);
-echo $attr[0]['CN'];
-?>
---EXPECT--
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:20041120-8550-innerjoin-org
-DTSTART;VALUE=DATE:20050503
-DTSTAMP;VALUE=DATE:20041120
-SUMMARY:Escaped Comma in Description Field
-DESCRIPTION:There is a comma (escaped with a baskslash) in this sentence
-  and some important words after it\, see anything here?
-ORGANIZER;CN="Klä,rchen; Mül:ler":mailto:mueller@example.org
-END:VEVENT
-END:VCALENDAR
-Klä,rchen; Mül:ler
diff --git a/framework/iCalendar/tests/read-escapes.phpt b/framework/iCalendar/tests/read-escapes.phpt
deleted file mode 100644 (file)
index e829c5c..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
---TEST--
-Read data with escaped values test.
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$data = 'BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//innerjoin.org//NONSGML Innerjoin Events Publisher V1.0//EN
-BEGIN:VEVENT
-UID:20041120-8550-innerjoin-org
-DTSTART;VALUE=DATE:20050503
-DTSTAMP;VALUE=DATE:20041120
-URL:
- http://www.innerjoin.org/iCalendar/test-cases/sunbird-0-2/ical-escaped-comma-desc.txt
-SUMMARY:
- Escaped Comma in Description Field
-DESCRIPTION:
- There is a comma (escaped with a baskslash) in this sentence and some important words after it\, see anything here?
-END:VEVENT
-BEGIN:VEVENT
-UID:20041120-8549-innerjoin-org
-DTSTART;VALUE=DATE:20050504
-DTSTAMP;VALUE=DATE:20041120
-URL:
- http://www.innerjoin.org/iCalendar/test-cases/sunbird-0-2/ical-dash-desc.txt
-SUMMARY:
- Dash (rather than Comma) in the Description Field
-DESCRIPTION:
- There are important words after this dash - see anything here or have the words gone?
-ORGANIZER;SENT-BY="mailto
- :a@b.c":mailto:a@b.c
-END:VEVENT
-END:VCALENDAR';
-
-$ical->parseVCalendar($data);
-$event1 = $ical->getComponent(0);
-$event2 = $ical->getComponent(1);
-
-var_dump($event1->getAttributeValues('DESCRIPTION'),
-         $event2->getAttributeValues('DESCRIPTION'),
-         $event2->getAttributeValues('ORGANIZER'));
-
-?>
---EXPECT--
-array(1) {
-  [0]=>
-  string(114) "There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?"
-}
-array(1) {
-  [0]=>
-  string(85) "There are important words after this dash - see anything here or have the words gone?"
-}
-array(1) {
-  [0]=>
-  string(12) "mailto:a@b.c"
-}
diff --git a/framework/iCalendar/tests/read-vcard-org.phpt b/framework/iCalendar/tests/read-vcard-org.phpt
deleted file mode 100644 (file)
index 72df975..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
---TEST--
-Test parsing of ORG fields.
---FILE--
-<?php
-
-$data = 'BEGIN:VCARD
-VERSION:3.0
-FN:Test User
-ORG:My Organization;My Unit
-END:VCARD';
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-$ical->parseVCalendar($data);
-$card = $ical->getComponent(0);
-var_dump($card->getAttributeValues('ORG'));
-
-?>
---EXPECT--
-array(2) {
-  [0]=>
-  string(15) "My Organization"
-  [1]=>
-  string(7) "My Unit"
-}
diff --git a/framework/iCalendar/tests/read-write-escapes.phpt b/framework/iCalendar/tests/read-write-escapes.phpt
deleted file mode 100644 (file)
index 7ffb244..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
---TEST--
-Read/write values with proper escaping test
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$writeIcal = new Horde_iCalendar();
-$readIcal = new Horde_iCalendar();
-
-$event1 = Horde_iCalendar::newComponent('vevent', $writeIcal);
-$event2 = Horde_iCalendar::newComponent('vevent', $writeIcal);
-
-$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
-$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
-$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
-$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
-$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
-
-$event2->setAttribute('UID', '20041120-8549-innerjoin-org');
-$event2->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 4), array('VALUE' => 'DATE'));
-$event2->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
-$event2->setAttribute('SUMMARY', 'Dash (rather than Comma) in the Description Field');
-$event2->setAttribute('DESCRIPTION', 'There are important words after this dash - see anything here or have the words gone?');
-
-$writeIcal->addComponent($event1);
-$writeIcal->addComponent($event2);
-
-$readIcal->parseVCalendar($writeIcal->exportVCalendar());
-$event3 = $readIcal->getComponent(0);
-$event4 = $readIcal->getComponent(1);
-var_dump($event3->getAttributeValues('DESCRIPTION'));
-var_dump($event4->getAttributeValues('DESCRIPTION'));
-
-?>
---EXPECT--
-array(1) {
-  [0]=>
-  string(114) "There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?"
-}
-array(1) {
-  [0]=>
-  string(85) "There are important words after this dash - see anything here or have the words gone?"
-}
diff --git a/framework/iCalendar/tests/timezones.phpt b/framework/iCalendar/tests/timezones.phpt
deleted file mode 100644 (file)
index 5db2701..0000000
+++ /dev/null
@@ -1,828 +0,0 @@
---TEST--
-Timezone handling
---FILE--
-<?php
-
-require_once dirname(dirname(__FILE__)) . '/iCalendar.php';
-require_once 'Horde/Date.php';
-date_default_timezone_set('UTC');
-
-$test_files = glob(dirname(__FILE__) . '/fixtures/vTimezone/*.???');
-foreach ($test_files as $file) {
-    echo basename($file) . "\n";
-    $ical = new Horde_iCalendar();
-    $ical->parsevCalendar(file_get_contents($file));
-    foreach ($ical->getComponents() as $component) {
-        if ($component->getType() != 'vEvent') {
-            continue;
-        }
-        $date = $component->getAttribute('DTSTART');
-        if (is_array($date)) {
-            continue;
-        }
-        echo $component->getAttribute('SUMMARY') . "\n";
-        $d = new Horde_Date($date);
-        echo $d->format('H:i') . "\n";
-    }
-    echo "\n";
-}
-
-?>
---EXPECT--
-AuthorChats.ics
-FAR Sexy Sunday Chat
-14:00
-Lady Aibell Chat
-15:00
-Lady Aibell Chat
-15:00
-FAR Sexy Sunday Chat
-14:00
-Sapphire Phelan's Birthday and She Wants to Party Chat
-01:00
-Bianca's Chat
-15:00
-Lady Aibell Chat @ Coffeetime Devin Group
-15:00
-Live Editor Chat
-00:00
-FAR Sexy Sunday Chat
-14:00
-Tammy Lee Author Live Chat
-18:00
-CPLLC Romance Authors @ Coffeetime
-15:00
-CPLLC Romance Authors @ Coffeetime
-15:00
-Ella Scopilo's Hump Day chat
-01:00
-
-MMMPseminar.ics
-Jack Murphy
-Trojan Horse or Proton Force: Finding the Right Partners for Toxin Translocation
-18:00
-Kai Matuschewski
-Hitting the Plasmodium Life Cycle Early On: Attenuated Liver Stages
-17:00
-Felix Rey
-Insights into the Mechanism of Membrane Fusion Derived from Structural Studies of Viral Envelope Proteins
-18:00
-Maurizio Del Poeta
-Sphingolipid-Mediated Fungal Pathogenesis
-18:00
-Jorge Galan
-Structure, Assembly, and Function of the Type III Secretion Injectisome
-18:00
-Don Ganem
-RNAi, MicroRNAs and Viral Infection
-18:00
-Barak Cohen
-Genomic Analysis of Natural Variation in Saccharomyces
-18:00
-Michael Ferguson
-The Structure and Biosynthesis of Trypanosome Surface Molecules:  Basic Science and Therapeutic Possiblities
-18:00
-James M. Musser
-Molecular Pathogenomics of Group A Streptococcus, the Flesh-Eater
-17:00
-Wayne Yokoyama
-Innate Responses to Viral Infections
-17:00
-Herbert \"Skip\" Virgin
-Host-Herpesvirus Standoff:  Good News From the Front in an Ancient Battle
-18:00
-New Event
-17:00
-Matthew Welch
-Exploitation of the Host Actin Cytoskeleton by Bacterial and Viral Pathogens
-17:00
-Theresa Koeher
-Virulence Gene Expression by Bacillus anthracis and Implications for the Host
-17:00
-Eduardo Groisman
-Regulatory Networks Controlling Bacterial Physiology and Virulence
-18:00
-Brendan Cormack
-Transcriptional Silencing and Adherence in the Yeast Pathogen Candida glabrata
-17:00
-Andrew Pekosz
-Intracellular Transport of Viral Proteins and Particles
-18:00
-
-Moon_Days.ics
-Standard Time resumes
-07:00
-New Moon
-16:05
-Full Moon
-03:13
-Full Moon
-12:58
-Full Moon
-00:25
-Autumnal Equinox
-04:03
-New Moon
-22:18
-Full Moon
-03:02
-New Moon
-11:45
-New Moon
-20:10
-Full Moon
-22:54
-Full Moon
-18:42
-New Moon
-14:01
-Full Moon
-13:57
-Summer Solstice
-12:26
-Full Moon
-05:45
-New Moon
-04:01
-New Moon
-04:31
-New Moon
-05:14
-
-ProjectCalendar.ics
-Code slush begins
-03:00
-String freeze
-03:00
-Calendar Test Day
-12:00
-Calendar QA Chat
-16:30
-Status Meeting
-16:00
-
-SpanishHolidays.ics
-
-allcategories.vcs
-NSS ISDC 2006
-04:00
-VSE Trailer Ohio State Tour
-12:00
-AIAA International Energy Conversion Conference
-04:00
-42nd AIAA/ASME/SAE/ASEE Joint Propulsion Conference
-04:00
-2006 Beam Power Challenge
-04:00
-2006 Tether Challenge
-04:00
-X PRIZE Cup Spaceflight Exposition
-04:00
-2007 Astronaut Glove Challenge: APRIL DATE TBD
-05:00
-2007 Regolith Excavation Challenge
-04:00
-2007 Personal Air Vehicle (PAV) Challenge: DATE TBD
-04:00
-2008 MoonROx (Moon Regolith Oxygen) Challenge
-04:00
-
-arsenal32FC.ics
-Sheffield Utd (2)0-0(4) Arsenal
-20:05
-Arsenal 5-3 Middlesbrough
-15:05
-West Ham Utd 0-0 Arsenal
-14:00
-Arsenal 2-1 Tottenham
-15:00
-Birmingham City 2-1 Arsenal
-14:00
-Carling Cup Final
-15:00
-Fulham 0-3 Arsenal
-14:00
-Leeds United 1-4 Arsenal
-16:05
-Barcelona 2-1 Arsenal
-18:45
-Manchester City 1-3 Arsenal
-18:45
-Arsenal 1-1 Aston Villa
-14:00
-River Plate 0-0 Arsenal
-17:00
-Weiz 0-5 Arsenal
-17:00
-Boreham Wood 0-4 Arsenal XI
-18:30
-Carling Cup Semi-Final (2)
-20:00
-Arsenal - Liverpool
-16:00
-Arsenal - Newcastle Utd
-15:00
-Arsenal 2-1 Bolton Wanderers
-15:00
-Charlton Athletic 1-3 Arsenal
-15:00
-F.A. Cup 4rth round
-15:00
-Southampton 1-1 Arsenal
-12:45
-Ritzing 2-5 Arsenal
-14:00
-Arsenal 3-0 Portsmouth
-15:00
-Beveren 0-0 Arsenal XI
-17:30
-Wolverhampton 1-3 Arsenal
-15:00
-Fulham - Arsenal
-19:45
-Hamburg - Arsenal
-18:45
-Champions League knockout round 2
-19:45
-Arsenal 3-2 Newcastle United
-19:00
-Arsenal 1-1 Manchester United
-15:05
-Arsenal 2-1 Manchester City
-16:05
-Arsenal 0-0 AFC Ajax
-19:45
-Arsenal 2-0 Lokomotiv Moscow
-19:45
-Arsenal (5)0-0(4) Manchester Utd
-14:00
-Lokomotiv Moscow 0-0 Arsenal
-16:30
-Arsenal 2-1 Chelsea
-14:00
-Manchester Utd 0-0 Arsenal
-15:05
-St Albans City 1-3 Arsenal XI
-18:30
-Chelsea 1-0 Arsenal
-15:00
-Manchester City 1-0 Arsenal
-16:15
-Arsenal 0-0 Manchester Utd
-20:00
-Blackburn Rovers 1-0 Arsenal
-15:00
-FC Porto - Arsenal
-19:45
-Bolton W 1-1 Arsenal
-15:00
-Aston Villa - Arsenal
-15:00
-Real Madrid 0-1 Arsenal
-19:45
-Arsenal 1-1 West Bromwich Albion
-15:00
-Bolton Wanderers 2-0 Arsenal
-15:00
-Manchester Utd - Arsenal
-15:00
-Arsenal - Reading
-15:00
-Arsenal 1-0 Manchester City
-14:00
-Arsenal - Chelsea
-14:00
-Champions League knockout round 2
-19:45
-AZ Alkmaar 0-3 Arsenal
-17:00
-Everton 1-4 Arsenal
-13:00
-Readling - Arsenal
-15:00
-Middlesbrough 2-1 Arsenal
-16:15
-Barnet 1-4 Arsenal
-14:00
-Champions League semi-final 1
-18:45
-CSKA Moscow - Arsenal
-16:30
-Arsenal 2-1 Ajax
-16:00
-Arsenal 1-0 Birmingham City
-12:30
-Arsenal 2-2 Southampton
-14:00
-Everton - Arsenal
-15:00
-Schwadorf 1-8 Arsenal
-15:00
-Celta de Vigo 2-3 Arsenal
-19:45
-Sheffield Utd - Arsenal
-15:00
-Arsenal 3-1 Everton
-19:45
-Arsenal 2-0 Newcastle
-12:30
-Arsenal 3-0 Charlton Athletic
-15:00
-Arsenal - Charlton Athletic
-15:00
-Arsenal - West Ham
-14:00
-Arsenal 2-1 Chelsea
-11:30
-Portsmouth 0-1 Arsenal
-16:05
-Arsenal 0-0 Real Madrid
-19:45
-F.A. Cup Semi-Final
-14:00
-Champions League semi-final 1
-18:45
-Arsenal 0-0 Fulham
-14:00
-Arsenal 2-1 Leicester City
-14:00
-Arsenal 3-1 Sunderland
-15:00
-Arsenal 1-0 Dynamo Kyiv
-19:45
-FC Utrecht 0-3 Arsenal
-16:00
-Chelsea 1-1 Arsenal
-19:45
-Manchester City 1-2 Arsenal
-15:05
-Man Utd 1-0 Arsenal
-19:45
-Arsenal 1-0 Blackburn Rovers
-14:00
-Wigan Athletic - Arsenal
-19:45
-Arsenal 3-0 Sparta Prague
-19:45
-Arsenal 1-1 Portsmouth
-14:00
-Arsenal 2-1 Dinamo Zagreb
-19:05
-Birmingham City 0-3 Arsenal
-15:00
-Champions League quarter-final 1
-18:45
-Barnet 0-0 Arsenal
-14:00
-Arsenal 2-2 Bolton Wanderers
-11:45
-Arsenal - Middlesbrough
-14:00
-Dynamo Kyiv 2-1 Arsenal
-18:45
-Arsenal 3-1 Aston Villa
-14:00
-Arsenal - Watford
-14:00
-Portsmouth 1-1 Arsenal
-19:00
-Sparta Prague 0-2 Arsenal
-18:45
-Bolton 0-1 Arsenal
-12:15
-Arsenal 1-1 Bolton Wanderers
-15:00
-Arsenal 3-0 Blackburn Rovers
-15:00
-Arsenal 3-1 ManUtd
-14:00
-Champions League semi-final 2
-18:45
-Arsenal - Wigan Athletic
-15:00
-Sunderland 0-3 Arsenal
-16:15
-Arsenal - Tottenham
-12:45
-Villarreal CF 0-0 Arsenal
-18:45
-Arsenal - Fulham
-14:00
-Arsenal 1-2 Chelsea
-18:45
-F.A. Cup 5th round
-15:00
-Arsenal 3-0 Reading
-19:45
-Arsenal 3-0 Blackburn Rovers
-11:15
-Liverpool 1-0 Arsenal
-20:00
-Ajax 0-0 Arsenal
-18:45
-Bolton Wanderers 1-0 Arsenal
-17:15
-Arsenal 2-1 Wigan Athletic
-19:45
-Aston Villa 0-0 Arsenal
-12:45
-Dinamo Zagreb 0-3 Arsenal
-19:05
-Newcastle Utd - Arsenal
-14:00
-Grazer AK 1-2 Arsenal
-16:00
-Carling Cup Semi-Final (1)
-20:00
-Everton 1-0 Arsenal
-12:45
-Porto 1-2 Arsenal
-16:30
-Bayern München 3-1 Arsenal
-19:45
-Arsenal 4-2 Liverpool
-11:30
-Arsenal 2-1 Liverpool
-16:00
-Barnet 1-10 Arsenal
-14:00
-Arsenal - Portsmouth
-15:00
-Watford - Arsenal
-17:30
-Arsenal 1(9)-1(8) Rotherham United
-19:45
-Manchester Utd 2-0 Arsenal
-15:05
-Aston Villa 0-2 Arsenal
-14:00
-Boreham Wood 2-6 Arsenal XI
-18:30
-Champions League quarter-final 2
-18:45
-Bolton 1-0 Arsenal
-17:40
-Champions League semi-final 2
-18:45
-West Bromwich Albion 0-2 Arsenal
-19:00
-Bolton Wanderers - Arsenal
-17:15
-Arsenal 1-1 Sheffield Utd
-12:30
-Arsenal - Blackburn Rovers
-15:00
-Carling Cup 3rd round
-19:00
-Arsenal 5-0 Aston Villa
-14:00
-Sunderland 0-3 Arsenal
-18:45
-Arsenal 2-1 Charlton Athletic
-15:00
-Arsenal 4-1 Middlesbrough
-15:00
-Arsenal 1-0 Newcastle
-16:05
-Arsenal 2-0 Fulham
-13:00
-KSK Beveren 2-2 Arsenal XI
-16:00
-Juventus 0-0 Arsenal
-18:45
-Arsenal 4-2 Wigan Athletic
-14:00
-Newcastle Utd 0-1 Arsenal
-20:00
-Manchester City 0-1 Arsenal
-14:00
-Middlesbrough 0-4 Arsenal
-14:00
-Champions League knockout round 1
-19:45
-Middlesbrough 0-4 Arsenal
-15:05
-Everton 1-1 Arsenal
-20:00
-Portsmouth - Arsenal
-14:00
-Tottenham Hotspur 1-1 Arsenal
-12:00
-Champions League quarter-final 2
-18:45
-Arsenal 3-0 Birmingham City
-15:00
-Arsenal 3-1 West Bromwich Albion
-14:00
-Leeds United 1-4 Arsenal
-15:00
-Arsenal 2-2 Chelsea
-16:05
-Carling Cup 4th round
-20:00
-NK Maribor 2-3 Arsenal
-17:30
-Barnet 0-0 Arsenal
-14:00
-Wigan Athletic 1-0 Arsenal
-19:45
-Norwich City 1-4 Arsenal
-16:15
-Portsmouth 1-5 Arsenal
-18:00
-Blackburn Rovers 0-2 Arsenal
-15:00
-Tottenham - Arsenal
-14:00
-Liverpool - Arsenal
-14:00
-Arsenal 2-1 FC Thun
-18:45
-Blackburn Rovers - Arsenal
-15:00
-Arsenal 3-0 Blackburn Rovers
-18:45
-Arsenal 2-0 Aston Villa
-18:45
-Middlesbrough - Arsenal
-15:00
-Arsenal 2-1 Cardiff City
-13:00
-Arsenal 3-1 Liverpool
-15:05
-Champions League quarter-final 1
-18:45
-Arsenal 0-1 Manchester Utd
-11:00
-Middlesbrough 0-1 Arsenal
-14:00
-FC Thun 0-1 Arsenal
-19:45
-Panathinaikos 2-2 Arsenal
-18:45
-West Ham Utd - Arsenal
-13:30
-Charlton Athletic 1-1 Arsenal
-14:00
-Arsenal - Everton
-14:00
-Arsenal 7-0 Middlesbrough
-15:00
-Newcastle Utd 0-0 Arsenal
-15:05
-PSV Eindhoven 1-1 Arsenal
-19:45
-Charlton Athletic - Arsenal
-14:00
-Arsenal 2-0 Juventus
-18:45
-F.A. Cup 6th round
-15:00
-Arsenal - Hamburg
-19:45
-Portsmouth 1-1 Arsenal
-19:00
-West Bromwich Albion 0-2 Arsenal
-20:00
-Champions League knockout round 1
-19:45
-Arsenal 1-1 Tottenham Hotspur
-11:45
-Arsenal 2-1 Stoke City
-14:00
-Birmingham City 0-2 Arsenal
-15:00
-Arsenal 2-0 Southampton
-19:45
-Arsenal 2-3 West Ham Utd
-20:00
-Arsenal 0-2 Chelsea
-16:00
-Southampton 0-1 Arsenal
-20:00
-Arsenal 1-1 Manchester City
-19:45
-Tottenham 2-2 Arsenal
-15:05
-Leicester City 1-1 Arsenal
-15:00
-Arsenal 4-1 Middlesbrough
-15:00
-Tottenham Hotspur 4-5 Arsenal
-12:00
-Arsenal 1-0 Tottenham Hotspur
-19:00
-Newcastle Utd 1-0 Arsenal
-17:15
-Arsenal 1(3)-1(4) ManUtd
-13:00
-Inter Milan 1-5 Arsenal
-19:45
-West Bromwich Albion 2-1 Arsenal
-14:00
-Blackburn Rovers 0-1 Arsenal
-12:45
-Manchester Utd 2-0 Arsenal
-15:00
-Austria Vienna 0-2 Arsenal
-18:00
-Arsenal 2-1 Everton
-14:00
-Arsenal 3-0 Wolverhampton W
-12:00
-AFC Ajax 1-2  Arsenal
-18:45
-Arsenal - Sheffield Utd
-14:00
-Manchester City 1-2 Arsenal
-18:45
-Arsenal 7-0 Everton
-19:00
-Crystal Palace 1-1 Arsenal
-17:15
-Arsenal 1-0 Besiktas
-17:00
-Arsenal - FC Porto
-18:45
-Rangers 0-3 Arsenal
-18:45
-Liverpool 2-1 Arsenal
-16:05
-Arsenal 1-0 PSV Eindhoven
-18:45
-Liverpool 1-2 Arsenal
-11:30
-Arsenal - Manchester Utd
-15:00
-Charlton Athletic 0-1 Arsenal
-12:45
-Arsenal 1-0 Bayern München
-19:45
-Arsenal 5-1 Rosenborg
-19:45
-Chelsea 2-1 Arsenal
-14:00
-Champions League Final
-18:45
-Arsenal 0-3 Inter Milan
-18:45
-Fulham 0-1 Arsenal
-15:05
-Arsenal 0-1 Middlesbrough
-19:45
-Arsenal - CSKA Moscow
-19:45
-Arsenal 1-1 Panathinaikos
-19:45
-Chelsea - Arsenal
-16:00
-Aston Villa 1-3 Arsenal
-17:15
-Arsenal 2-0 Celta de Vigo
-19:45
-Arsenal 5-0 Leeds
-19:00
-Arsenal 5-1 Crystal Palace
-20:00
-Fulham 0-4 Arsenal
-15:00
-Arsenal 4-0 Portsmouth
-19:45
-Arsenal - Manchester City
-19:45
-Ritzing 2-2 Arsenal
-18:00
-Arsenal 2-4 Manchester Utd
-20:00
-Arsenal - Bolton Wanderers
-14:00
-Arsenal 1-0 Villarreal CF
-18:45
-Arsenal 5-1 Wolverhampton W.
-19:45
-Celtic 1-1 Arsenal
-14:00
-F.A. Cup Final
-14:00
-Arsenal 2-0 Wolverhampton Wanderers
-15:00
-Peterborough 1-0 Arsenal XI
-18:30
-Arsenal 2-0 Everton
-19:00
-Arsenal 4-0 Charlton Athletic
-14:00
-Arsenal 4-1 Fulham
-18:45
-Chelsea 0-0 Arsenal
-19:00
-Doncaster Rovers 2-2P Arsenal
-19:45
-Sturm Graz 0-2 Arsenal
-16:30
-Rosenborg 1-1 Arsenal
-18:45
-Arsenal 6-0 England XI
-18:45
-Arsenal 4-1 Norwich City
-14:00
-Arsenal 0-0 Birmingham City
-11:30
-Middlesbrough 2-1 Arsenal
-20:00
-Ajax 0-1 Arsenal
-19:15
-Chelsea 1-2 Arsenal
-12:30
-Boreham Wood 1-1 Arsenal XI
-18:45
-Carling Cup 5th round
-20:00
-KSK Beveren 3-3 Arsenal XI
-18:30
-Wigan Athletic 2-3 Arsenal
-12:45
-F.A. Cup 3rd round
-15:00
-SV Mattersburg 1-2 Arsenal
-17:00
-
-events.ics
-test cet 2
-13:00
-
-exchange.ics
-internal final review of mmc site changes
-19:00
-
-exdate.ics
-
-iscw.ics
-Ontoweb Day http://nextwebgeneration.com/meetings/ontoweb5/
-13:30
-Ontoweb SIG day http://nextwebgeneration.com/meetings/ontoweb5/
-13:30
-Beach Barbeque
-00:00
-
-meeting.ics
-Updated: Webex Training - Encryption Push
-17:00
-
-privacy_events.ics
-Australian Smart Card Summit
-04:00
-SOCAP Australia 2006 Symposium
-03:30
-
-rfc2445.ics
-Bastille Day Party
-17:00
-Annual Employee Review
-16:30
-Laurel is in sensitivity awareness class.
-16:30
-Our Blissful Anniversary
-00:00
-XYZ Project Review
-13:30
-Calendaring Interoperability Planning Meeting
-12:30
-
-test.vcs
-2007 Astronaut Glove Challenge: APRIL DATE TBD
-05:00
-
-test4.vcs
-Chiefs vs. Buffalo @ Arrowhead Stadium
-19:00
-
-test_recurring.vcs
-XXXStriked out XXX
-09:00
-
-wicca.ics
-Wolf Moon
-10:32
-Snow Moon
-04:54
-Worm Moon
-20:58
-Pink Moon
-10:06
-Flower Moon
-20:18
-Strawberry Moon
-04:14
-Buck Moon
-11:00
-Sturgeon Moon
-17:53
-Harvest Moon
-02:01
-Hunter's Moon
-12:14
-Beaver Moon
-00:57
-Cold Moon
-16:15
diff --git a/framework/iCalendar/tests/vcal20.phpt b/framework/iCalendar/tests/vcal20.phpt
deleted file mode 100644 (file)
index 2930143..0000000
+++ /dev/null
@@ -1,321 +0,0 @@
---TEST--
-vCalendar 2.0 (iCalendar) test
---FILE--
-<?php
-
-$data = <<<VCARD
-BEGIN:VCALENDAR
-PRODID:-//Google Inc//Google Calendar 70.9054//EN
-VERSION:2.0
-CALSCALE:GREGORIAN
-METHOD:PUBLISH
-X-WR-CALNAME:PEAR - PHP Extension and Application Repository
-X-WR-TIMEZONE:Atlantic/Reykjavik
-X-WR-CALDESC:pear.php.net activity calendar\, bug triage\, group meetings\,
-  qa\, conferences or similar
-BEGIN:VEVENT
-DTSTART:20081025T160000Z
-DTEND:20081025T210000Z
-DTSTAMP:20080819T092753Z
-UID:ntnrt4go4482q2trk18bt62c0o@google.com
-RECURRENCE-ID:20081025T160000Z
-CLASS:PUBLIC
-CREATED:20080306T002605Z
-DESCRIPTION:Bug Triage session\\n\\nNot been invited ? Want to attend ? Let u
- s know and we'll add you!
-LAST-MODIFIED:20080718T204006Z
-LOCATION:#pear-bugs Efnet
-SEQUENCE:2
-STATUS:CONFIRMED
-SUMMARY:Bug Triage
-TRANSP:OPAQUE
-CATEGORIES:foo,bar,fuz buz,blah\, blah
-END:VEVENT
-END:VCALENDAR
-VCARD;
-
-require_once 'Horde/iCalendar.php';
-$ical = new Horde_iCalendar();
-$ical->parsevCalendar($data);
-var_export($ical->getAllAttributes());
-echo "\n";
-$vevent = $ical->getComponent(0);
-var_export($vevent->getAllAttributes());
-
-?>
---EXPECT--
-array (
-  0 => 
-  array (
-    'name' => 'PRODID',
-    'params' => 
-    array (
-    ),
-    'value' => '-//Google Inc//Google Calendar 70.9054//EN',
-    'values' => 
-    array (
-      0 => '-//Google Inc//Google Calendar 70.9054//EN',
-    ),
-  ),
-  1 => 
-  array (
-    'name' => 'VERSION',
-    'params' => 
-    array (
-    ),
-    'value' => '2.0',
-    'values' => 
-    array (
-      0 => '2.0',
-    ),
-  ),
-  2 => 
-  array (
-    'name' => 'CALSCALE',
-    'params' => 
-    array (
-    ),
-    'value' => 'GREGORIAN',
-    'values' => 
-    array (
-      0 => 'GREGORIAN',
-    ),
-  ),
-  3 => 
-  array (
-    'name' => 'METHOD',
-    'params' => 
-    array (
-    ),
-    'value' => 'PUBLISH',
-    'values' => 
-    array (
-      0 => 'PUBLISH',
-    ),
-  ),
-  4 => 
-  array (
-    'name' => 'X-WR-CALNAME',
-    'params' => 
-    array (
-    ),
-    'value' => 'PEAR - PHP Extension and Application Repository',
-    'values' => 
-    array (
-      0 => 'PEAR - PHP Extension and Application Repository',
-    ),
-  ),
-  5 => 
-  array (
-    'name' => 'X-WR-TIMEZONE',
-    'params' => 
-    array (
-    ),
-    'value' => 'Atlantic/Reykjavik',
-    'values' => 
-    array (
-      0 => 'Atlantic/Reykjavik',
-    ),
-  ),
-  6 => 
-  array (
-    'name' => 'X-WR-CALDESC',
-    'params' => 
-    array (
-    ),
-    'value' => 'pear.php.net activity calendar, bug triage, group meetings, qa, conferences or similar',
-    'values' => 
-    array (
-      0 => 'pear.php.net activity calendar, bug triage, group meetings, qa, conferences or similar',
-    ),
-  ),
-)
-array (
-  0 => 
-  array (
-    'name' => 'DTSTART',
-    'params' => 
-    array (
-    ),
-    'value' => 1224950400,
-    'values' => 
-    array (
-      0 => 1224950400,
-    ),
-  ),
-  1 => 
-  array (
-    'name' => 'DTEND',
-    'params' => 
-    array (
-    ),
-    'value' => 1224968400,
-    'values' => 
-    array (
-      0 => 1224968400,
-    ),
-  ),
-  2 => 
-  array (
-    'name' => 'DTSTAMP',
-    'params' => 
-    array (
-    ),
-    'value' => 1219138073,
-    'values' => 
-    array (
-      0 => 1219138073,
-    ),
-  ),
-  3 => 
-  array (
-    'name' => 'UID',
-    'params' => 
-    array (
-    ),
-    'value' => 'ntnrt4go4482q2trk18bt62c0o@google.com',
-    'values' => 
-    array (
-      0 => 'ntnrt4go4482q2trk18bt62c0o@google.com',
-    ),
-  ),
-  4 => 
-  array (
-    'name' => 'RECURRENCE-ID',
-    'params' => 
-    array (
-    ),
-    'value' => 1224950400,
-    'values' => 
-    array (
-      0 => 1224950400,
-    ),
-  ),
-  5 => 
-  array (
-    'name' => 'CLASS',
-    'params' => 
-    array (
-    ),
-    'value' => 'PUBLIC',
-    'values' => 
-    array (
-      0 => 'PUBLIC',
-    ),
-  ),
-  6 => 
-  array (
-    'name' => 'CREATED',
-    'params' => 
-    array (
-    ),
-    'value' => 1204763165,
-    'values' => 
-    array (
-      0 => 1204763165,
-    ),
-  ),
-  7 => 
-  array (
-    'name' => 'DESCRIPTION',
-    'params' => 
-    array (
-    ),
-    'value' => 'Bug Triage session
-
-Not been invited ? Want to attend ? Let us know and we\'ll add you!',
-    'values' => 
-    array (
-      0 => 'Bug Triage session
-
-Not been invited ? Want to attend ? Let us know and we\'ll add you!',
-    ),
-  ),
-  8 => 
-  array (
-    'name' => 'LAST-MODIFIED',
-    'params' => 
-    array (
-    ),
-    'value' => 1216413606,
-    'values' => 
-    array (
-      0 => 1216413606,
-    ),
-  ),
-  9 => 
-  array (
-    'name' => 'LOCATION',
-    'params' => 
-    array (
-    ),
-    'value' => '#pear-bugs Efnet',
-    'values' => 
-    array (
-      0 => '#pear-bugs Efnet',
-    ),
-  ),
-  10 => 
-  array (
-    'name' => 'SEQUENCE',
-    'params' => 
-    array (
-    ),
-    'value' => 2,
-    'values' => 
-    array (
-      0 => 2,
-    ),
-  ),
-  11 => 
-  array (
-    'name' => 'STATUS',
-    'params' => 
-    array (
-    ),
-    'value' => 'CONFIRMED',
-    'values' => 
-    array (
-      0 => 'CONFIRMED',
-    ),
-  ),
-  12 => 
-  array (
-    'name' => 'SUMMARY',
-    'params' => 
-    array (
-    ),
-    'value' => 'Bug Triage',
-    'values' => 
-    array (
-      0 => 'Bug Triage',
-    ),
-  ),
-  13 => 
-  array (
-    'name' => 'TRANSP',
-    'params' => 
-    array (
-    ),
-    'value' => 'OPAQUE',
-    'values' => 
-    array (
-      0 => 'OPAQUE',
-    ),
-  ),
-  14 => 
-  array (
-    'name' => 'CATEGORIES',
-    'params' => 
-    array (
-    ),
-    'value' => 'foo,bar,fuz buz,blah, blah',
-    'values' => 
-    array (
-      0 => 'foo',
-      1 => 'bar',
-      2 => 'fuz buz',
-      3 => 'blah, blah',
-    ),
-  ),
-)
diff --git a/framework/iCalendar/tests/vfreebusy.phpt b/framework/iCalendar/tests/vfreebusy.phpt
deleted file mode 100644 (file)
index a2ac773..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
---TEST--
-Test parsing of vFreeBusy information.
---FILE--
-<?php
-
-// Define BUSY periods 23.11.2006 from 5:00  to 6:00 
-// and 8:00 with a duration of 2 hours
-
-$data = 'BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//proko2//freebusy 1.0//EN
-METHOD:PUBLISH
-BEGIN:VFREEBUSY
-ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
-DTSTAMP:20061122T230929Z
-DTSTART:20061122T230000Z
-DTEND:20070121T230000Z
-FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;
- X-SUMMARY=dGVzdHRlcm1pbg==:20061123T050000Z/20061123T060000Z
-FREEBUSY:20061123T080000Z/PT2H
-END:VFREEBUSY
-END:VCALENDAR';
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-// Parse the data
-$ical->parseVCalendar($data);
-
-// Get the vFreeBusy component
-$vfb = $ical->getComponent(0);
-
-// Dump the type ("vFreebusy")
-var_dump($vfb->getType());
-
-// Dump the vfreebusy component again (the duration should be
-// converted to start/end
-var_dump($vfb->exportvCalendar());
-
-// Dump organizer name ("GunnarWrobel")
-var_dump($vfb->getName());
-
-// Dump organizer mail ("wrobel@demo2.pardus.de")
-var_dump($vfb->getEmail());
-
-// Dump busy periods (array with two entries)
-var_dump($vfb->getBusyPeriods());
-
-// Decode the summary information ("testtermin")
-$extra = $vfb->getExtraParams();
-var_dump(base64_decode($extra[1164258000]['X-SUMMARY']));
-
-// Dump the free periods in between the two given time stamps
-var_dump($vfb->getFreePeriods(1164261500, 1164268900));
-
-// Dump start of the free/busy information (1164236400)
-var_dump($vfb->getStart());
-
-// Dump end of the free/busy information (1164236400)
-var_dump($vfb->getEnd());
-
-// Free periods don't get added
-$vfb->addBusyPeriod('FREE',1164261600,1164268800);
-var_dump($vfb->getBusyPeriods());
-
-// Add a busy period with start/end (11:00 / 12:00)
-$vfb->addBusyPeriod('BUSY',1164279600,1164283200);
-
-// Add a busy period with start/duration (14:00 / 2h)
-$vfb->addBusyPeriod('BUSY',1164290400,null,7200, array('X-SUMMARY' => 'dGVzdA=='));
-
-// Dump busy periods (array with four entries)
-var_dump($vfb->getBusyPeriods());
-
-// Dump the extra parameters (array with four entries)
-var_dump($vfb->getExtraParams());
-
-// Create new freebusy object for merging
-$mfb = new Horde_iCalendar_vfreebusy();
-// 1. 3:55 / 10 minutes; summary "test4"
-$mfb->addBusyPeriod('BUSY',1164254100,null,600, array('X-SUMMARY' => 'dGVzdDQ='));
-// 2. 4:00 / 1 hours 5 Minutes; summary "test3"
-$mfb->addBusyPeriod('BUSY',1164254400,null,3900, array('X-SUMMARY' => 'dGVzdDM='));
-// 3. 5:55 / 10 minutes hours; summary "test5"
-$mfb->addBusyPeriod('BUSY',1164261300,null,600, array('X-SUMMARY' => 'dGVzdDU=='));
-// 4. 7:55 / 10 min
-$mfb->addBusyPeriod('BUSY',1164268500,null,600);
-// 5. 9:55 / 10 min
-$mfb->addBusyPeriod('BUSY',1164275700,null,600);
-// 6. 11:00 / 4 hours; summary "test2"
-$mfb->addBusyPeriod('BUSY',1164279600,null,14400, array('X-SUMMARY' => 'dGVzdDI='));
-// 7. 14:00 / 2 min
-$mfb->addBusyPeriod('BUSY',1164290400,null,120);
-// 8. 14:30 / 5 min; summary "test3"
-$mfb->addBusyPeriod('BUSY',1164292200,null,300, array('X-SUMMARY' => 'dGVzdDM='));
-// 9. 15:55 / 5 min
-$mfb->addBusyPeriod('BUSY',1164297300,1164297600);
-
-// Dump busy periods (array with seven entries)
-var_dump($mfb->getBusyPeriods());
-
-$mfb->setAttribute('DTSTART', 1004297300);
-$mfb->setAttribute('DTEND', 1014297300);
-
-// Merge freebusy components without simplification
-$vfb->merge($mfb, false);
-
-var_dump($vfb->getAttribute('DTSTART'));
-var_dump($vfb->getAttribute('DTEND'));
-
-// Dump merged periods (array with eleven entries since there
-// are some entries having the same start time -> merged to
-// longer of the two)
-$busy = $vfb->getBusyPeriods();
-$extra = $vfb->getExtraParams();
-var_dump($busy);
-
-// Check merging process (should have selected longer period)
-// and dump extra information alongside
-//   4 hours (instead of 2 hours); summary "test"
-var_dump($busy[1164279600] - 1164279600);
-var_dump(base64_decode($extra[1164279600]['X-SUMMARY']));
-//   2 hours (instead of 2 minutes); summary "test2"
-var_dump($busy[1164290400] - 1164290400);
-var_dump(base64_decode($extra[1164290400]['X-SUMMARY']));
-
-// Merge freebusy components again, simplify this time
-$vfb->merge($mfb);
-
-// Dump merged periods (array with five entries)
-$busy =  $vfb->getBusyPeriods();
-$extra = $vfb->getExtraParams();
-
-// 1. 3:55 / 10 Minutes / test4
-print "Start:" . $vfb->_exportDateTime(1164254100) . " End:" . $vfb->_exportDateTime($busy[1164254100]) . " Summary:" . base64_decode($extra[1164254100]['X-SUMMARY']) . "\n";
-// 2. 4:05 / 1 hour / test3
-print "Start:" . $vfb->_exportDateTime(1164254700) . " End:" . $vfb->_exportDateTime($busy[1164254700]) . " Summary:" . base64_decode($extra[1164254700]['X-SUMMARY']) . "\n";
-// 3. 5:05 / 55 Minutes / testtermin
-print "Start:" . $vfb->_exportDateTime(1164258300) . " End:" . $vfb->_exportDateTime($busy[1164258300]) . " Summary:" . base64_decode($extra[1164258300]['X-SUMMARY']) . "\n";
-// 4. 6:00 / 5 Minutes / test5
-print "Start:" . $vfb->_exportDateTime(1164261600) . " End:" . $vfb->_exportDateTime($busy[1164261600]) . " Summary:" . base64_decode($extra[1164261600]['X-SUMMARY']) . "\n";
-// 5. 7:55 / 2 hours 10 Minutes 
-print "Start:" . $vfb->_exportDateTime(1164268500) . " End:" . $vfb->_exportDateTime($busy[1164268500]) . " Summary:\n";
-// 6. 11:00 / 4 hours / test2
-print "Start:" . $vfb->_exportDateTime(1164279600) . " End:" . $vfb->_exportDateTime($busy[1164279600]) . " Summary:" . base64_decode($extra[1164279600]['X-SUMMARY']) . "\n";
-// 7. 15:00 / 1 hour / test
-print "Start:" . $vfb->_exportDateTime(1164294000) . " End:" . $vfb->_exportDateTime($busy[1164294000]) . " Summary:" . base64_decode($extra[1164294000]['X-SUMMARY']) . "\n";
-
-?>
---EXPECT--
-string(9) "vFreebusy"
-string(334) "BEGIN:VFREEBUSY
-ORGANIZER;CN=GunnarWrobel:MAILTO:wrobel@demo2.pardus.de
-DTSTAMP:20061122T230929Z
-DTSTART:20061122T230000Z
-DTEND:20070121T230000Z
-FREEBUSY;X-UID=MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ=;X-SUMMARY=dGVzd
- HRlcm1pbg==:20061123T050000Z/20061123T060000Z
-FREEBUSY:20061123T080000Z/20061123T100000Z
-END:VFREEBUSY
-"
-string(12) "GunnarWrobel"
-string(22) "wrobel@demo2.pardus.de"
-array(2) {
-  [1164258000]=>
-  int(1164261600)
-  [1164268800]=>
-  int(1164276000)
-}
-string(10) "testtermin"
-array(1) {
-  [1164261600]=>
-  int(1164268800)
-}
-int(1164236400)
-int(1169420400)
-array(2) {
-  [1164258000]=>
-  int(1164261600)
-  [1164268800]=>
-  int(1164276000)
-}
-array(4) {
-  [1164258000]=>
-  int(1164261600)
-  [1164268800]=>
-  int(1164276000)
-  [1164279600]=>
-  int(1164283200)
-  [1164290400]=>
-  int(1164297600)
-}
-array(4) {
-  [1164258000]=>
-  array(2) {
-    ["X-UID"]=>
-    string(44) "MmZlNWU3NDRmMGFjNjZkNjRjZjFkZmFmYTE4NGFiZTQ="
-    ["X-SUMMARY"]=>
-    string(16) "dGVzdHRlcm1pbg=="
-  }
-  [1164268800]=>
-  array(0) {
-  }
-  [1164279600]=>
-  array(0) {
-  }
-  [1164290400]=>
-  array(1) {
-    ["X-SUMMARY"]=>
-    string(8) "dGVzdA=="
-  }
-}
-array(9) {
-  [1164254100]=>
-  int(1164254700)
-  [1164254400]=>
-  int(1164258300)
-  [1164261300]=>
-  int(1164261900)
-  [1164268500]=>
-  int(1164269100)
-  [1164275700]=>
-  int(1164276300)
-  [1164279600]=>
-  int(1164294000)
-  [1164290400]=>
-  int(1164290520)
-  [1164292200]=>
-  int(1164292500)
-  [1164297300]=>
-  int(1164297600)
-}
-int(1004297300)
-int(1169420400)
-array(11) {
-  [1164258000]=>
-  int(1164261600)
-  [1164268800]=>
-  int(1164276000)
-  [1164279600]=>
-  int(1164294000)
-  [1164290400]=>
-  int(1164297600)
-  [1164254100]=>
-  int(1164254700)
-  [1164254400]=>
-  int(1164258300)
-  [1164261300]=>
-  int(1164261900)
-  [1164268500]=>
-  int(1164269100)
-  [1164275700]=>
-  int(1164276300)
-  [1164292200]=>
-  int(1164292500)
-  [1164297300]=>
-  int(1164297600)
-}
-int(14400)
-string(5) "test2"
-int(7200)
-string(4) "test"
-Start:20061123T035500Z End:20061123T040500Z Summary:test4
-Start:20061123T040500Z End:20061123T050500Z Summary:test3
-Start:20061123T050500Z End:20061123T060000Z Summary:testtermin
-Start:20061123T060000Z End:20061123T060500Z Summary:test5
-Start:20061123T075500Z End:20061123T100500Z Summary:
-Start:20061123T110000Z End:20061123T150000Z Summary:test2
-Start:20061123T150000Z End:20061123T160000Z Summary:test
diff --git a/framework/iCalendar/tests/write-escapes.phpt b/framework/iCalendar/tests/write-escapes.phpt
deleted file mode 100644 (file)
index b56accf..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
---TEST--
-Write values with proper escaping test
---FILE--
-<?php
-
-require_once dirname(__FILE__) . '/../iCalendar.php';
-$ical = new Horde_iCalendar();
-
-$event1 = Horde_iCalendar::newComponent('vevent', $ical);
-$event2 = Horde_iCalendar::newComponent('vevent', $ical);
-
-$event1->setAttribute('UID', '20041120-8550-innerjoin-org');
-$event1->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 3), array('VALUE' => 'DATE'));
-$event1->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
-$event1->setAttribute('SUMMARY', 'Escaped Comma in Description Field');
-$event1->setAttribute('DESCRIPTION', 'There is a comma (escaped with a baskslash) in this sentence and some important words after it, see anything here?');
-
-$event2->setAttribute('UID', '20041120-8549-innerjoin-org');
-$event2->setAttribute('DTSTART', array('year' => 2005, 'month' => 5, 'mday' => 4), array('VALUE' => 'DATE'));
-$event2->setAttribute('DTSTAMP', array('year' => 2004, 'month' => 11, 'mday' => 20), array('VALUE' => 'DATE'));
-$event2->setAttribute('SUMMARY', 'Dash (rather than Comma) in the Description Field');
-$event2->setAttribute('DESCRIPTION', 'There are important words after this dash - see anything here or have the words gone?');
-
-$ical->addComponent($event1);
-$ical->addComponent($event2);
-
-echo $ical->exportVCalendar();
-
-?>
---EXPECT--
-BEGIN:VCALENDAR
-VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
-METHOD:PUBLISH
-BEGIN:VEVENT
-UID:20041120-8550-innerjoin-org
-DTSTART;VALUE=DATE:20050503
-DTSTAMP;VALUE=DATE:20041120
-SUMMARY:Escaped Comma in Description Field
-DESCRIPTION:There is a comma (escaped with a baskslash) in this sentence
-  and some important words after it\, see anything here?
-END:VEVENT
-BEGIN:VEVENT
-UID:20041120-8549-innerjoin-org
-DTSTART;VALUE=DATE:20050504
-DTSTAMP;VALUE=DATE:20041120
-SUMMARY:Dash (rather than Comma) in the Description Field
-DESCRIPTION:There are important words after this dash - see anything here
-  or have the words gone?
-END:VEVENT
-END:VCALENDAR
index 5f63be0..260be4b 100644 (file)
@@ -80,7 +80,7 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
         $mime_id = $this->_mimepart->getMimeId();
 
         // Parse the iCal file.
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
         if (!$vCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
             return array(
                 $mime_id => array(
@@ -98,8 +98,9 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
         }
 
         // Get the method type.
-        $method = $vCal->getAttribute('METHOD');
-        if ($method instanceof PEAR_Error) {
+        try {
+            $method = $vCal->getAttribute('METHOD');
+        } catch (Horde_Icalendar_Exception $e) {
             $method = '';
         }
 
@@ -116,8 +117,9 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
                 if ($registry->hasMethod('calendar/delete')) {
                     $guid = $components[$key]->getAttribute('UID');
                     $deleteParams = array('guid' => $guid);
-                    $instance = $components[$key]->getAttribute('RECURRENCE-ID');
-                    if (!($instance instanceof PEAR_Error)) {
+                    try {
+                        $instance = $components[$key]->getAttribute('RECURRENCE-ID');
+                    } catch (Horde_Icalendar_Exception $e) {
                         // This is a cancellation of a recurring event instance.
                         $deleteParams['recurrenceId'] = $instance;
                     }
@@ -244,8 +246,9 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
                     $vEvent = $components[$key];
 
                     // Get the organizer details.
-                    $organizer = $vEvent->getAttribute('ORGANIZER');
-                    if ($organizer instanceof PEAR_Error) {
+                    try {
+                        $organizer = $vEvent->getAttribute('ORGANIZER');
+                    } catch (Horde_Icalendar_Exception $e) {
                         break;
                     }
                     $organizer = parse_url($organizer);
@@ -255,30 +258,34 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
 
                     // Build the reply.
                     $msg_headers = new Horde_Mime_Headers();
-                    $vCal = new Horde_iCalendar();
+                    $vCal = new Horde_Icalendar();
                     $vCal->setAttribute('PRODID', '-//The Horde Project//' . $msg_headers->getUserAgent() . '//EN');
                     $vCal->setAttribute('METHOD', 'REPLY');
 
-                    $vEvent_reply = Horde_iCalendar::newComponent('vevent', $vCal);
+                    $vEvent_reply = Horde_Icalendar::newComponent('vevent', $vCal);
                     $vEvent_reply->setAttribute('UID', $vEvent->getAttribute('UID'));
-                    if (!($vEvent->getAttribute('SUMMARY') instanceof PEAR_Error)) {
+                    try {
+                        $vEvent->getAttribute('SUMMARY');
                         $vEvent_reply->setAttribute('SUMMARY', $vEvent->getAttribute('SUMMARY'));
-                    }
-                    if (!($vEvent->getAttribute('DESCRIPTION') instanceof PEAR_Error)) {
+                    } catch (Horde_Icalendar_Exception $e) {}
+                    try {
+                        $vEvent->getAttribute('DESCRIPTION');
                         $vEvent_reply->setAttribute('DESCRIPTION', $vEvent->getAttribute('DESCRIPTION'));
-                    }
+                    } catch (Horde_Icalendar_Exception $e) {}
                     $dtstart = $vEvent->getAttribute('DTSTART', true);
                     $vEvent_reply->setAttribute('DTSTART', $vEvent->getAttribute('DTSTART'), array_pop($dtstart));
-                    if (!($vEvent->getAttribute('DTEND') instanceof PEAR_Error)) {
+                    try {
+                        $vEvent->getAttribute('DTEND');
                         $dtend = $vEvent->getAttribute('DTEND', true);
                         $vEvent_reply->setAttribute('DTEND', $vEvent->getAttribute('DTEND'), array_pop($dtend));
-                    } else {
+                    } catch (Horde_Icalendar_Exception $e) {
                         $duration = $vEvent->getAttribute('DURATION', true);
                         $vEvent_reply->setAttribute('DURATION', $vEvent->getAttribute('DURATION'), array_pop($duration));
                     }
-                    if (!($vEvent->getAttribute('SEQUENCE') instanceof PEAR_Error)) {
+                    try {
+                        $vEvent->getAttribute('SEQUENCE');
                         $vEvent_reply->setAttribute('SEQUENCE', $vEvent->getAttribute('SEQUENCE'));
-                    }
+                    } catch (Horde_Icalendar_Exception $e) {}
                     $vEvent_reply->setAttribute('ORGANIZER', $vEvent->getAttribute('ORGANIZER'), array_pop($organizer));
 
                     // Find out who we are and update status.
@@ -388,8 +395,9 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
                     $vFb = $components[$key];
 
                     // Get the organizer details.
-                    $organizer = $vFb->getAttribute('ORGANIZER');
-                    if ($organizer instanceof PEAR_Error) {
+                    try {
+                        $organizer = $vFb->getAttribute('ORGANIZER');
+                    } catch (Horde_Icalendar_Exception $e) {
                         break;
                     }
                     $organizer = parse_url($organizer);
@@ -401,17 +409,22 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
                         $startStamp = time();
                         $endStamp = $startStamp + (60 * 24 * 3600);
                     } else {
-                        $startStamp = $vFb->getAttribute('DTSTART');
-                        if ($startStamp instanceof PEAR_Error) {
+                        try {
+                            $startStamp = $vFb->getAttribute('DTSTART');
+                        } catch (Horde_Icalendar_Exception $e) {
                             $startStamp = time();
                         }
-                        $endStamp = $vFb->getAttribute('DTEND');
-                        if ($endStamp instanceof PEAR_Error) {
-                            $duration = $vFb->getAttribute('DURATION');
-                            if ($duration instanceof PEAR_Error) {
-                                $endStamp = $startStamp + (60 * 24 * 3600);
-                            } else {
+
+                        try {
+                            $endStamp = $vFb->getAttribute('DTEND');
+                        } catch (Horde_Icalendar_Exception $e) {}
+
+                        if (!$endStamp) {
+                            try {
+                                $duration = $vFb->getAttribute('DURATION');
                                 $endStamp = $startStamp + $duration;
+                            } catch (Horde_Icalendar_Exception $e) {
+                                $endStamp = $startStamp + (60 * 24 * 3600);
                             }
                         }
                     }
@@ -424,7 +437,7 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
 
                     // Build the reply.
                     $msg_headers = new Horde_Mime_Headers();
-                    $vCal = new Horde_iCalendar();
+                    $vCal = new Horde_Icalendar();
                     $vCal->setAttribute('PRODID', '-//The Horde Project//' . $msg_headers->getUserAgent() . '//EN');
                     $vCal->setAttribute('METHOD', 'REPLY');
                     $vCal->addComponent($vfb_reply);
@@ -570,23 +583,23 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
             $html .= '<p class="notice">' . Horde::img('alerts/' . $msg[0] . '.png') . $msg[1] . '</p>';
         }
 
-        $start = $vfb->getAttribute('DTSTART');
-        if (!($start instanceof PEAR_Error)) {
+        try {
+            $start = $vfb->getAttribute('DTSTART');
             if (is_array($start)) {
                 $html .= '<p><strong>' . _("Start:") . '</strong> ' . strftime($prefs->getValue('date_format'), mktime(0, 0, 0, $start['month'], $start['mday'], $start['year'])) . '</p>';
             } else {
                 $html .= '<p><strong>' . _("Start:") . '</strong> ' . strftime($prefs->getValue('date_format'), $start) . ' ' . date($prefs->getValue('twentyFour') ? ' G:i' : ' g:i a', $start) . '</p>';
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $end = $vfb->getAttribute('DTEND');
-        if (!($end instanceof PEAR_Error)) {
+        try {
+            $end = $vfb->getAttribute('DTEND');
             if (is_array($end)) {
                 $html .= '<p><strong>' . _("End:") . '</strong> ' . strftime($prefs->getValue('date_format'), mktime(0, 0, 0, $end['month'], $end['mday'], $end['year'])) . '</p>';
             } else {
                 $html .= '<p><strong>' . _("End:") . '</strong> ' . strftime($prefs->getValue('date_format'), $end) . ' ' . date($prefs->getValue('twentyFour') ? ' G:i' : ' g:i a', $end) . '</p>';
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         $html .= '<h2 class="smallheader">' . _("Actions") . '</h2>' .
             '<select name="itip_action[' . $id . ']">';
@@ -630,16 +643,17 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
     {
         global $registry, $prefs;
 
+        $attendees = null;
         $desc = $html = '';
         $sender = $vevent->organizerName();
         $options = array();
 
-        $attendees = $vevent->getAttribute('ATTENDEE');
-        if (!($attendees instanceof PEAR_Error) &&
-            !empty($attendees) &&
-            !is_array($attendees)) {
-            $attendees = array($attendees);
-        }
+        try {
+            $attendees = $vevent->getAttribute('ATTENDEE');
+            if (!empty($attendees) && !is_array($attendees)) {
+                $attendees = array($attendees);
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
         $attendee_params = $vevent->getAttribute('ATTENDEE', true);
 
         switch ($method) {
@@ -661,7 +675,7 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
 
                 // Check that you are one of the attendees here.
                 $is_attendee = false;
-                if (!($attendees instanceof PEAR_Error) && !empty($attendees)) {
+                if (!empty($attendees)) {
                     $identity = $GLOBALS['injector']->getInstance('IMP_Identity');
                     for ($i = 0, $c = count($attendees); $i < $c; ++$i) {
                         $attendee = parse_url($attendees[$i]);
@@ -712,26 +726,26 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
             break;
 
         case 'CANCEL':
-            $instance = $vevent->getAttribute('RECURRENCE-ID');
-            if ($instance instanceof PEAR_Error) {
-                $desc = _("%s has cancelled \"%s\".");
-                if ($registry->hasMethod('calendar/delete')) {
-                    $options[] = '<option value="delete">' . _("Delete from my calendar") . '</option>';
-                }
-            } else {
+            try {
+                $vevent->getAttribute('RECURRENCE-ID');
                 $desc = _("%s has cancelled an instance of the recurring \"%s\".");
                 if ($registry->hasMethod('calendar/replace')) {
                     $options[] = '<option value="delete">' . _("Update in my calendar") . '</option>';
                 }
+            } catch (Horde_Icalendar_Exception $e) {
+                $desc = _("%s has cancelled \"%s\".");
+                if ($registry->hasMethod('calendar/delete')) {
+                    $options[] = '<option value="delete">' . _("Delete from my calendar") . '</option>';
+                }
             }
             break;
         }
 
-        $summary = $vevent->getAttribute('SUMMARY');
-        if ($summary instanceof PEAR_Error) {
-            $desc = sprintf($desc, htmlspecialchars($sender), _("Unknown Meeting"));
-        } else {
+        try {
+            $summary = $vevent->getAttribute('SUMMARY');
             $desc = sprintf($desc, htmlspecialchars($sender), htmlspecialchars($summary));
+        } catch (Horde_Icalendar_Exception $e) {
+            $desc = sprintf($desc, htmlspecialchars($sender), _("Unknown Meeting"));
         }
 
         $html .= '<h2 class="header">' . $desc . '</h2>';
@@ -740,42 +754,42 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
             $html .= '<p class="notice">' . Horde::img('alerts/' . $msg[0] . '.png') . $msg[1] . '</p>';
         }
 
-        $start = $vevent->getAttribute('DTSTART');
-        if (!($start instanceof PEAR_Error)) {
+        try {
+            $start = $vevent->getAttribute('DTSTART');
             if (is_array($start)) {
                 $html .= '<p><strong>' . _("Start:") . '</strong> ' . strftime($prefs->getValue('date_format'), mktime(0, 0, 0, $start['month'], $start['mday'], $start['year'])) . '</p>';
             } else {
                 $html .= '<p><strong>' . _("Start:") . '</strong> ' . strftime($prefs->getValue('date_format'), $start) . ' ' . date($prefs->getValue('twentyFour') ? ' G:i' : ' g:i a', $start) . '</p>';
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $end = $vevent->getAttribute('DTEND');
-        if (!($end instanceof PEAR_Error)) {
+        try {
+            $end = $vevent->getAttribute('DTEND');
             if (is_array($end)) {
                 $html .= '<p><strong>' . _("End:") . '</strong> ' . strftime($prefs->getValue('date_format'), mktime(0, 0, 0, $end['month'], $end['mday'], $end['year'])) . '</p>';
             } else {
                 $html .= '<p><strong>' . _("End:") . '</strong> ' . strftime($prefs->getValue('date_format'), $end) . ' ' . date($prefs->getValue('twentyFour') ? ' G:i' : ' g:i a', $end) . '</p>';
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $sum = $vevent->getAttribute('SUMMARY');
-        if (!($sum instanceof PEAR_Error)) {
+        try {
+            $sum = $vevent->getAttribute('SUMMARY');
             $html .= '<p><strong>' . _("Summary") . ':</strong> ' . htmlspecialchars($sum) . '</p>';
         } else {
             $html .= '<p><strong>' . _("Summary") . ':</strong> <em>' . _("None") . '</em></p>';
         }
 
-        $desc = $vevent->getAttribute('DESCRIPTION');
-        if (!($desc instanceof PEAR_Error)) {
+        try {
+            $desc = $vevent->getAttribute('DESCRIPTION');
             $html .= '<p><strong>' . _("Description") . ':</strong> ' . nl2br(htmlspecialchars($desc)) . '</p>';
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $loc = $vevent->getAttribute('LOCATION');
-        if (!($loc instanceof PEAR_Error)) {
+        try {
+            $loc = $vevent->getAttribute('LOCATION');
             $html .= '<p><strong>' . _("Location") . ':</strong> ' . htmlspecialchars($loc) . '</p>';
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        if (!($attendees instanceof PEAR_Error) && !empty($attendees)) {
+        if (!empty($attendees)) {
             $html .= '<h2 class="smallheader">' . _("Attendees") . '</h2>';
 
             $html .= '<table><thead class="leftAlign"><tr><th>' . _("Name") . '</th><th>' . _("Role") . '</th><th>' . _("Status") . '</th></tr></thead><tbody>';
@@ -893,16 +907,16 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
         $desc = $html = '';
         $options = array();
 
-        $organizer = $vtodo->getAttribute('ORGANIZER', true);
-        if ($organizer instanceof PEAR_Error) {
-            $sender = _("An unknown person");
-        } else {
+        try {
+            $organizer = $vtodo->getAttribute('ORGANIZER', true);
             if (isset($organizer[0]['CN'])) {
                 $sender = $organizer[0]['CN'];
             } else {
                 $organizer = parse_url($vtodo->getAttribute('ORGANIZER'));
                 $sender = $organizer['path'];
             }
+        } catch (Horde_Icalendar_Exception $e) {
+            $sender = _("An unknown person");
         }
 
         switch ($method) {
@@ -914,11 +928,11 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
             break;
         }
 
-        $summary = $vtodo->getAttribute('SUMMARY');
-        if ($summary instanceof PEAR_Error) {
-            $desc = sprintf($desc, htmlspecialchars($sender), _("Unknown Task"));
-        } else {
+        try {
+            $summary = $vtodo->getAttribute('SUMMARY');
             $desc = sprintf($desc, htmlspecialchars($sender), htmlspecialchars($summary));
+        } catch (Horde_Icalendar_Exception $e) {
+            $desc = sprintf($desc, htmlspecialchars($sender), _("Unknown Task"));
         }
 
         $html .= '<h2 class="header">' . $desc . '</h2>';
@@ -927,27 +941,31 @@ class IMP_Horde_Mime_Viewer_Itip extends Horde_Mime_Viewer_Base
             $html .= '<p class="notice">' . Horde::img('alerts/' . $msg[0] . '.png') . $msg[1] . '</p>';
         }
 
-        $priority = $vtodo->getAttribute('PRIORITY');
-        if (!($priority instanceof PEAR_Error)) {
+        try {
+            $priority = $vtodo->getAttribute('PRIORITY');
             $html .= '<p><strong>' . _("Priority") . ':</strong> ' . (int)$priority . '</p>';
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $sum = $vtodo->getAttribute('SUMMARY');
-        if (!($sum instanceof PEAR_Error)) {
+        try {
+            $sum = $vtodo->getAttribute('SUMMARY');
             $html .= '<p><strong>' . _("Summary") . ':</strong> ' . htmlspecialchars($sum) . '</p>';
-        } else {
+        } catch (Horde_Icalendar_Exception $e) {
             $html .= '<p><strong>' . _("Summary") . ':</strong> <em>' . _("None") . '</em></p>';
         }
 
-        $desc = $vtodo->getAttribute('DESCRIPTION');
-        if (!($desc instanceof PEAR_Error)) {
+        try {
+            $desc = $vtodo->getAttribute('DESCRIPTION');
             $html .= '<p><strong>' . _("Description") . ':</strong> ' . nl2br(htmlspecialchars($desc)) . '</p>';
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
-        $attendees = $vtodo->getAttribute('ATTENDEE');
-        $params = $vtodo->getAttribute('ATTENDEE', true);
+        try {
+            $attendees = $vtodo->getAttribute('ATTENDEE');
+            $params = $vtodo->getAttribute('ATTENDEE', true);
+        } catch (Horde_Icalendar_Exception $e) {
+            $attendees = null;
+        }
 
-        if (!($attendees instanceof PEAR_Error) && !empty($attendees)) {
+        if (!empty($attendees)) {
             $html .= '<h2 class="smallheader">' . _("Attendees") . '</h2>';
             if (!is_array($attendees)) {
                 $attendees = array($attendees);
index 1d3f977..e13ec74 100644 (file)
@@ -155,7 +155,7 @@ case 'export':
         exit;
 
     case Horde_Data::EXPORT_ICALENDAR:
-        $iCal = new Horde_iCalendar();
+        $iCal = new Horde_Icalendar();
 
         $calIds = array();
         foreach ($events as $cal => $calevents) {
@@ -269,17 +269,17 @@ if (is_array($next_step)) {
             $error = true;
             break;
         }
-        if ($row instanceof Horde_iCalendar_vevent) {
+        if ($row instanceof Horde_Icalendar_Vevent) {
             // RECURRENCE-ID entries must be imported after the original
             // recurring event is imported.
-            $recurrence = $row->getAttribute('RECURRENCE-ID');
-            if (!($recurrence instanceof PEAR_Error)) {
+            try {
+                $row->getAttribute('RECURRENCE-ID');
                 $recurrences[] = $row;
                 continue;
-            } else {
+            } catch (Horde_Icalendar_Exception $e) {
                 $event->fromiCalendar($row);
             }
-        } elseif ($row instanceof Horde_iCalendar) {
+        } elseif ($row instanceof Horde_Icalendar) {
             // Skip other iCalendar components for now.
             continue;
         } else {
index 955d41f..9e945a7 100644 (file)
@@ -302,8 +302,8 @@ class Kronolith_Api extends Horde_Registry_Api
         switch ($content_type) {
         case 'text/calendar':
         case 'text/x-vcalendar':
-            $iCal = new Horde_iCalendar();
-            if (!($content instanceof Horde_iCalendar_vevent)) {
+            $iCal = new Horde_Icalendar();
+            if (!($content instanceof Horde_Icalendar_Vevent)) {
                 if (!$iCal->parsevCalendar($content)) {
                     throw new Kronolith_Exception(_("There was an error importing the iCalendar data."));
                 }
@@ -313,7 +313,7 @@ class Kronolith_Api extends Horde_Registry_Api
 
             $kronolith_driver = Kronolith::getDriver();
             foreach ($iCal->getComponents() as $content) {
-                if ($content instanceof Horde_iCalendar_vevent) {
+                if ($content instanceof Horde_Icalendar_Vevent) {
                     $event = $kronolith_driver->getEvent();
                     $event->fromiCalendar($content);
                     $uid = $event->uid;
@@ -627,8 +627,8 @@ class Kronolith_Api extends Horde_Registry_Api
         switch ($contentType) {
         case 'text/calendar':
         case 'text/x-vcalendar':
-            $iCal = new Horde_iCalendar();
-            if (!($content instanceof Horde_iCalendar_vevent)) {
+            $iCal = new Horde_Icalendar();
+            if (!($content instanceof Horde_Icalendar_Vevent)) {
                 if (!$iCal->parsevCalendar($content)) {
                     throw new Kronolith_Exception(_("There was an error importing the iCalendar data."));
                 }
@@ -644,7 +644,7 @@ class Kronolith_Api extends Horde_Registry_Api
             $ids = array();
             $recurrences = array();
             foreach ($components as $content) {
-                if ($content instanceof Horde_iCalendar_vevent) {
+                if ($content instanceof Horde_Icalendar_Vevent) {
                     // Need to ensure that the original recurring event is
                     // added before any of the instance exceptions. Easiest way
                     // to do that is just add all the recurrence-id entries last
@@ -683,7 +683,7 @@ class Kronolith_Api extends Horde_Registry_Api
     /**
      * Imports a single vEvent part to storage.
      *
-     * @param Horde_iCalendar_vEvent $content  The vEvent part
+     * @param Horde_Icalendar_Vevent $content  The vEvent part
      * @param Kronolith_Driver $driver         The kronolith driver
      *
      * @return string  The new event's uid
@@ -774,7 +774,7 @@ class Kronolith_Api extends Horde_Registry_Api
         case 'text/calendar':
             $share = $kronolith_shares->getShare($event->calendar);
 
-            $iCal = new Horde_iCalendar($version);
+            $iCal = new Horde_Icalendar($version);
             $iCal->setAttribute('X-WR-CALNAME', Horde_String::convertCharset($share->get('name'), $GLOBALS['registry']->getCharset(), 'utf-8'));
 
             // Create a new vEvent.
@@ -824,7 +824,7 @@ class Kronolith_Api extends Horde_Registry_Api
         case 'text/calendar':
             $share = $kronolith_shares->getShare($calendar);
 
-            $iCal = new Horde_iCalendar($version);
+            $iCal = new Horde_Icalendar($version);
             $iCal->setAttribute('X-WR-CALNAME', Horde_String::convertCharset($share->get('name'), $GLOBALS['registry']->getCharset(), 'UTF-8'));
             if (strlen($share->get('desc'))) {
                 $iCal->setAttribute('X-WR-CALDESC', Horde_String::convertCharset($share->get('desc'), $GLOBALS['registry']->getCharset(), 'UTF-8'));
@@ -917,11 +917,11 @@ class Kronolith_Api extends Horde_Registry_Api
      *
      * @param string $uid          Idenfity the event to replace.
      * @param mixed  $content      The content of the event. String or
-     *                             Horde_iCalendar_vevent
+     *                             Horde_Icalendar_Vevent
      * @param string $contentType  What format is the data in? Currently supports:
      *                             text/calendar
      *                             text/x-vcalendar
-     *                             (Ignored if content is Horde_iCalendar_vevent)
+     *                             (Ignored if content is Horde_Icalendar_Vevent)
      *
      * @throws Kronolith_Exception
      */
@@ -934,7 +934,7 @@ class Kronolith_Api extends Horde_Registry_Api
             throw new Horde_Exception_PermissionDenied();
         }
 
-        if ($content instanceof Horde_iCalendar_vevent) {
+        if ($content instanceof Horde_Icalendar_Vevent) {
             $component = $content;
         } elseif ($content instanceof Horde_ActiveSync_Message_Appointment) {
             $event->fromASAppointment($content);
@@ -945,8 +945,8 @@ class Kronolith_Api extends Horde_Registry_Api
             switch ($contentType) {
             case 'text/calendar':
             case 'text/x-vcalendar':
-                if (!($content instanceof Horde_iCalendar_vevent)) {
-                    $iCal = new Horde_iCalendar();
+                if (!($content instanceof Horde_Icalendar_Vevent)) {
+                    $iCal = new Horde_Icalendar();
                     if (!$iCal->parsevCalendar($content)) {
                         throw new Kronolith_Exception(_("There was an error importing the iCalendar data."));
                     }
@@ -954,7 +954,7 @@ class Kronolith_Api extends Horde_Registry_Api
                     $components = $iCal->getComponents();
                     $component = null;
                     foreach ($components as $content) {
-                        if ($content instanceof Horde_iCalendar_vevent) {
+                        if ($content instanceof Horde_Icalendar_Vevent) {
                             if ($component !== null) {
                                 throw new Kronolith_Exception(_("Multiple iCalendar components found; only one vEvent is supported."));
                             }
@@ -988,7 +988,7 @@ class Kronolith_Api extends Horde_Registry_Api
      * @param string $calendar     The calendar to view free/busy slots for.
      *                             Defaults to the user's default calendar.
      *
-     * @return Horde_iCalendar_vfreebusy  A freebusy object that covers the
+     * @return Horde_Icalendar_Vfreebusy  A freebusy object that covers the
      *                                    specified time period.
      * @throws Kronolith_Exception
      */
@@ -1024,7 +1024,7 @@ class Kronolith_Api extends Horde_Registry_Api
     /**
      * Updates an attendee's response status for a specified event.
      *
-     * @param Horde_iCalender_vevent $response  A Horde_iCalender_vevent
+     * @param Horde_Icalender_Vevent $response  A Horde_Icalender_Vevent
      *                                          object, with a valid UID
      *                                          attribute that points to an
      *                                          existing event.  This is
@@ -1043,9 +1043,10 @@ class Kronolith_Api extends Horde_Registry_Api
      */
     public function updateAttendee($response, $sender = null)
     {
-        $uid = $response->getAttribute('UID');
-        if ($uid instanceof PEAR_Error) {
-            throw new Kronolith_Exception($uid);
+        try {
+            $uid = $response->getAttribute('UID');
+        } catch (Horde_Icalendar_Exception $e) {
+            throw new Kronolith_Exception($e);
         }
 
         $events = Kronolith::getDriver()->getByUID($uid, null, true);
index eaec871..28a4372 100644 (file)
@@ -199,7 +199,7 @@ class Kronolith_Driver_Ical extends Kronolith_Driver
      *
      * @param boolean $cache  Whether to return data from the session cache.
      *
-     * @return Horde_iCalendar  The calendar data, or an error on failure.
+     * @return Horde_Icalendar  The calendar data, or an error on failure.
      * @throws Kronolith_Exception
      */
     public function getRemoteCalendar($cache = true)
@@ -252,7 +252,7 @@ class Kronolith_Driver_Ical extends Kronolith_Driver
                                   $GLOBALS['registry']->getAuth(), $url), 'DEBUG');
 
         $data = $response->getBody();
-        $ical = new Horde_iCalendar();
+        $ical = new Horde_Icalendar();
         $result = $ical->parsevCalendar($data);
         if ($cache) {
             $cacheOb->set($signature, serialize($ical));
index 74b17ab..a509e29 100644 (file)
@@ -520,14 +520,14 @@ abstract class Kronolith_Event
     /**
      * Exports this event in iCalendar format.
      *
-     * @param Horde_iCalendar &$calendar  A Horde_iCalendar object that acts as
-     *                                    a container.
+     * @param Horde_Icalendar $calendar  A Horde_iCalendar object that acts as
+     *                                   a container.
      *
-     * @return array  An array of Horde_iCalendar_vevent objects for this event.
+     * @return array  An array of Horde_Icalendar_Vevent objects for this event.
      */
-    public function toiCalendar(&$calendar)
+    public function toiCalendar($calendar)
     {
-        $vEvent = &Horde_iCalendar::newComponent('vevent', $calendar);
+        $vEvent = Horde_Icalendar::newComponent('vevent', $calendar);
         $v1 = $calendar->getAttribute('VERSION') == '1.0';
         $vEvents = array();
         if ($this->isAllDay()) {
@@ -726,7 +726,7 @@ abstract class Kronolith_Event
                 $alarm->min -= $this->alarm;
                 $vEvent->setAttribute('AALARM', $alarm);
             } else {
-                $vAlarm = &Horde_iCalendar::newComponent('valarm', $vEvent);
+                $vAlarm = Horde_Icalendar::newComponent('valarm', $vEvent);
                 $vAlarm->setAttribute('ACTION', 'DISPLAY');
                 $vAlarm->setAttribute('TRIGGER;VALUE=DURATION', '-PT' . $this->alarm . 'M');
                 $vEvent->addComponent($vAlarm);
@@ -800,84 +800,101 @@ abstract class Kronolith_Event
     }
 
     /**
-     * Updates the properties of this event from a Horde_iCalendar_vevent
+     * Updates the properties of this event from a Horde_Icalendar_Vevent
      * object.
      *
-     * @param Horde_iCalendar_vevent $vEvent  The iCalendar data to update
+     * @param Horde_Icalendar_Vevent $vEvent  The iCalendar data to update
      *                                        from.
      */
     public function fromiCalendar($vEvent)
     {
         // Unique ID.
-        $uid = $vEvent->getAttribute('UID');
-        if (!empty($uid) && !($uid instanceof PEAR_Error)) {
-            $this->uid = $uid;
-        }
+        try {
+            $uid = $vEvent->getAttribute('UID');
+            if (!empty($uid)) {
+                $this->uid = $uid;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Sequence.
-        $seq = $vEvent->getAttribute('SEQUENCE');
-        if (is_int($seq)) {
-            $this->sequence = $seq;
-        }
+        try {
+            $seq = $vEvent->getAttribute('SEQUENCE');
+            if (is_int($seq)) {
+                $this->sequence = $seq;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Title, tags and description.
-        $title = $vEvent->getAttribute('SUMMARY');
-        if (!is_array($title) && !($title instanceof PEAR_Error)) {
-            $this->title = $title;
-        }
+        try {
+            $title = $vEvent->getAttribute('SUMMARY');
+            if (!is_array($title)) {
+                $this->title = $title;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Tags
-        $categories = $vEvent->getAttributeValues('CATEGORIES');
-        if (!($categories instanceof PEAR_Error)) {
-            $this->_tags = $categories;
-        }
+        try {
+            $this->_tags = $vEvent->getAttributeValues('CATEGORIES');
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Description
-        $desc = $vEvent->getAttribute('DESCRIPTION');
-        if (!is_array($desc) && !($desc instanceof PEAR_Error)) {
-            $this->description = $desc;
-        }
+        try {
+            $desc = $vEvent->getAttribute('DESCRIPTION');
+            if (!is_array($desc)) {
+                $this->description = $desc;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Remote Url
-        $url = $vEvent->getAttribute('URL');
-        if (!is_array($url) && !($url instanceof PEAR_Error)) {
-            $this->url = $url;
-        }
+        try {
+            $url = $vEvent->getAttribute('URL');
+            if (!is_array($url)) {
+                $this->url = $url;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Location
-        $location = $vEvent->getAttribute('LOCATION');
-        if (!is_array($location) && !($location instanceof PEAR_Error)) {
-            $this->location = $location;
-        }
-        $geolocation = $vEvent->getAttribute('GEO');
-        if (!($geolocation instanceof PEAR_Error)) {
+        try {
+            $location = $vEvent->getAttribute('LOCATION');
+            if (!is_array($location)) {
+                $this->location = $location;
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $geolocation = $vEvent->getAttribute('GEO');
             $this->geolocation = array(
                 'lat' => $geolocation['latitude'],
-                'lon' => $geolocation['longitude']);
-        }
+                'lon' => $geolocation['longitude']
+            );
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Class
-        $class = $vEvent->getAttribute('CLASS');
-        if (!is_array($class) && !($class instanceof PEAR_Error)) {
-            $class = Horde_String::upper($class);
-            $this->private = $class == 'PRIVATE' || $class == 'CONFIDENTIAL';
-        }
+        try {
+            $class = $vEvent->getAttribute('CLASS');
+            if (!is_array($class)) {
+                $class = Horde_String::upper($class);
+                $this->private = $class == 'PRIVATE' || $class == 'CONFIDENTIAL';
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Status.
-        $status = $vEvent->getAttribute('STATUS');
-        if (!is_array($status) && !($status instanceof PEAR_Error)) {
-            $status = Horde_String::upper($status);
-            if ($status == 'DECLINED') {
-                $status = 'CANCELLED';
-            }
-            if (defined('Kronolith::STATUS_' . $status)) {
-                $this->status = constant('Kronolith::STATUS_' . $status);
+        try {
+            $status = $vEvent->getAttribute('STATUS');
+            if (!is_array($status)) {
+                $status = Horde_String::upper($status);
+                if ($status == 'DECLINED') {
+                    $status = 'CANCELLED';
+                }
+                if (defined('Kronolith::STATUS_' . $status)) {
+                    $this->status = constant('Kronolith::STATUS_' . $status);
+                }
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // Start and end date.
-        $start = $vEvent->getAttribute('DTSTART');
-        if (!($start instanceof PEAR_Error)) {
+        try {
+            $start = $vEvent->getAttribute('DTSTART');
             if (!is_array($start)) {
                 // Date-Time field
                 $this->start = new Horde_Date($start);
@@ -888,9 +905,10 @@ abstract class Kronolith_Event
                           'month' => (int)$start['month'],
                           'mday'  => (int)$start['mday']));
             }
-        }
-        $end = $vEvent->getAttribute('DTEND');
-        if (!($end instanceof PEAR_Error)) {
+        } catch (Horde_Icalendar_Exception $e) {}
+
+        try {
+            $end = $vEvent->getAttribute('DTEND');
             if (!is_array($end)) {
                 // Date-Time field
                 $this->end = new Horde_Date($end);
@@ -905,19 +923,28 @@ abstract class Kronolith_Event
                               'month' => (int)$this->end->month,
                               'mday'  => (int)$this->end->mday + 1));
                 }
-            } elseif (is_array($end) && !($end instanceof PEAR_Error)) {
+            } else {
                 // Date field
                 $this->end = new Horde_Date(
                     array('year'  => (int)$end['year'],
                           'month' => (int)$end['month'],
                           'mday'  => (int)$end['mday']));
             }
-        } else {
-            $duration = $vEvent->getAttribute('DURATION');
-            if (!is_array($duration) && !($duration instanceof PEAR_Error)) {
-                $this->end = new Horde_Date($this->start);
-                $this->end->sec += $duration;
-            } else {
+        } catch (Horde_Icalendar_Exception $e) {
+            $end = null;
+        }
+
+        if (is_null($end)) {
+            try {
+                $duration = $vEvent->getAttribute('DURATION');
+                if (!is_array($duration)) {
+                    $this->end = new Horde_Date($this->start);
+                    $this->end->sec += $duration;
+                    $end = 1;
+                }
+            } catch (Horde_Icalendar_Exception $e) {}
+
+            if (is_null($end)) {
                 // End date equal to start date as per RFC 2445.
                 $this->end = new Horde_Date($this->start);
                 if (is_array($start)) {
@@ -928,12 +955,12 @@ abstract class Kronolith_Event
         }
 
         // vCalendar 1.0 alarms
-        $alarm = $vEvent->getAttribute('AALARM');
-        if (!is_array($alarm) &&
-            !($alarm instanceof PEAR_Error) &&
-            intval($alarm)) {
-            $this->alarm = intval(($this->start->timestamp() - $alarm) / 60);
-        }
+        try {
+            $alarm = $vEvent->getAttribute('AALARM');
+            if (!is_array($alarm) && intval($alarm)) {
+                $this->alarm = intval(($this->start->timestamp() - $alarm) / 60);
+            }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // @TODO: vCalendar 2.0 alarms
 
@@ -944,9 +971,8 @@ abstract class Kronolith_Event
         // default. However to allow updates by SyncML replication, the custom
         // X-ATTENDEE attribute is used which has the same syntax as
         // ATTENDEE.
-        $attendee = $vEvent->getAttribute('X-ATTENDEE');
-        if (!($attendee instanceof PEAR_Error)) {
-
+        try {
+            $attendee = $vEvent->getAttribute('X-ATTENDEE');
             if (!is_array($attendee)) {
                 $attendee = array($attendee);
             }
@@ -1009,7 +1035,7 @@ abstract class Kronolith_Event
 
                 $this->addAttendee($email, $attendance, $response, $name);
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         $this->_handlevEventRecurrence($vEvent);
 
@@ -1019,52 +1045,54 @@ abstract class Kronolith_Event
     /**
      * Handle parsing recurrence related fields.
      *
-     * @param Horde_iCalendar $vEvent
+     * @param Horde_Icalendar $vEvent
      */
     protected function _handlevEventRecurrence($vEvent)
     {
         // Recurrence.
-        $rrule = $vEvent->getAttribute('RRULE');
-        if (!is_array($rrule) && !($rrule instanceof PEAR_Error)) {
-            $this->recurrence = new Horde_Date_Recurrence($this->start);
-            if (strpos($rrule, '=') !== false) {
-                $this->recurrence->fromRRule20($rrule);
-            } else {
-                $this->recurrence->fromRRule10($rrule);
-            }
+        try {
+            $rrule = $vEvent->getAttribute('RRULE');
+            if (!is_array($rrule)) {
+                $this->recurrence = new Horde_Date_Recurrence($this->start);
+                if (strpos($rrule, '=') !== false) {
+                    $this->recurrence->fromRRule20($rrule);
+                } else {
+                    $this->recurrence->fromRRule10($rrule);
+                }
 
-            /* Delete all existing exceptions to this event if it already exists */
-            if (!empty($this->uid)) {
-                $kronolith_driver = Kronolith::getDriver(null, $this->calendar);
-                $search = new StdClass();
-                $search->start = $this->recurrence->getRecurStart();
-                $search->end = $this->recurrence->getRecurEnd();
-                $search->baseid = $this->uid;
-                $results = $kronolith_driver->search($search);
-                foreach ($results as $days) {
-                    foreach ($days as $exception) {
-                        $kronolith_driver->deleteEvent($exception->id);
+                /* Delete all existing exceptions to this event if it already exists */
+                if (!empty($this->uid)) {
+                    $kronolith_driver = Kronolith::getDriver(null, $this->calendar);
+                    $search = new StdClass();
+                    $search->start = $this->recurrence->getRecurStart();
+                    $search->end = $this->recurrence->getRecurEnd();
+                    $search->baseid = $this->uid;
+                    $results = $kronolith_driver->search($search);
+                    foreach ($results as $days) {
+                        foreach ($days as $exception) {
+                            $kronolith_driver->deleteEvent($exception->id);
+                        }
                     }
                 }
-            }
 
-            // Exceptions. EXDATE represents deleted events, just add the
-            // exception, no new event is needed.
-            $exdates = $vEvent->getAttributeValues('EXDATE');
-            if (is_array($exdates)) {
-                foreach ($exdates as $exdate) {
-                    if (is_array($exdate)) {
-                        $this->recurrence->addException((int)$exdate['year'],
-                                                        (int)$exdate['month'],
-                                                        (int)$exdate['mday']);
+                // Exceptions. EXDATE represents deleted events, just add the
+                // exception, no new event is needed.
+                $exdates = $vEvent->getAttributeValues('EXDATE');
+                if (is_array($exdates)) {
+                    foreach ($exdates as $exdate) {
+                        if (is_array($exdate)) {
+                            $this->recurrence->addException((int)$exdate['year'],
+                                (int)$exdate['month'],
+                                (int)$exdate['mday']);
+                        }
                     }
                 }
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
 
         // RECURRENCE-ID indicates that this event represents an exception
-        $recurrenceid = $vEvent->getAttribute('RECURRENCE-ID');
-        if (!($recurrenceid instanceof PEAR_Error)) {
+        try {
+            $recurrenceid = $vEvent->getAttribute('RECURRENCE-ID');
             $kronolith_driver = Kronolith::getDriver(null, $this->calendar);
             $originaldt = new Horde_Date($recurrenceid);
             $this->exceptionoriginaldate = $originaldt;
@@ -1072,10 +1100,10 @@ abstract class Kronolith_Event
             $this->uid = null;
             $originalEvent = $kronolith_driver->getByUID($this->baseid);
             $originalEvent->recurrence->addException($originaldt->format('Y'),
-                                                     $originaldt->format('m'),
-                                                     $originaldt->format('d'));
+                $originaldt->format('m'),
+                $originaldt->format('d'));
             $originalEvent->save();
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
     }
 
     /**
index c41028d..4cca9b6 100644 (file)
@@ -21,7 +21,7 @@ class Kronolith_Event_Ical extends Kronolith_Event
     /**
      * Imports a backend specific event object.
      *
-     * @param Horde_iCalendar_vEvent  Backend specific event object that this
+     * @param Horde_Icalendar_Vevent  Backend specific event object that this
      *                                object will represent.
      */
     public function fromDriver($vEvent)
@@ -88,33 +88,35 @@ class Kronolith_Event_Ical extends Kronolith_Event
      * Parses the various exception related fields. Only deal with the EXDATE
      * field here.
      *
-     * @param Horde_iCalendar $vEvent  The vEvent part.
+     * @param Horde_Icalendar $vEvent  The vEvent part.
      */
     protected function _handlevEventRecurrence($vEvent)
     {
         // Recurrence.
-        $rrule = $vEvent->getAttribute('RRULE');
-        if (!is_array($rrule) && !($rrule instanceof PEAR_Error)) {
-            $this->recurrence = new Horde_Date_Recurrence($this->start);
-            if (strpos($rrule, '=') !== false) {
-                $this->recurrence->fromRRule20($rrule);
-            } else {
-                $this->recurrence->fromRRule10($rrule);
-            }
+        try {
+            $rrule = $vEvent->getAttribute('RRULE');
+            if (!is_array($rrule)) {
+                $this->recurrence = new Horde_Date_Recurrence($this->start);
+                if (strpos($rrule, '=') !== false) {
+                    $this->recurrence->fromRRule20($rrule);
+                } else {
+                    $this->recurrence->fromRRule10($rrule);
+                }
 
-            // Exceptions. EXDATE represents deleted events, just add the
-            // exception, no new event is needed.
-            $exdates = $vEvent->getAttributeValues('EXDATE');
-            if (is_array($exdates)) {
-                foreach ($exdates as $exdate) {
-                    if (is_array($exdate)) {
-                        $this->recurrence->addException((int)$exdate['year'],
-                                                        (int)$exdate['month'],
-                                                        (int)$exdate['mday']);
+                // Exceptions. EXDATE represents deleted events, just add the
+                // exception, no new event is needed.
+                $exdates = $vEvent->getAttributeValues('EXDATE');
+                if (is_array($exdates)) {
+                    foreach ($exdates as $exdate) {
+                        if (is_array($exdate)) {
+                            $this->recurrence->addException((int)$exdate['year'],
+                                                            (int)$exdate['month'],
+                                                            (int)$exdate['mday']);
+                        }
                     }
                 }
             }
-        }
+        } catch (Horde_Icalendar_Exception $e) {}
     }
 
 }
index 7e4dc65..42be1b2 100644 (file)
@@ -89,12 +89,12 @@ class Kronolith_FreeBusy
         }
 
         /* Create the new iCalendar. */
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
         $vCal->setAttribute('PRODID', '-//The Horde Project//Kronolith ' . $GLOBALS['registry']->getVersion() . '//EN');
         $vCal->setAttribute('METHOD', 'PUBLISH');
 
         /* Create new vFreebusy. */
-        $vFb = Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $params = array();
         if (!empty($cn)) {
             $params['CN'] = $cn;
@@ -120,7 +120,7 @@ class Kronolith_FreeBusy
                     continue;
                 }
 
-                /* Horde_iCalendar_vfreebusy only supports timestamps at the
+                /* Horde_Icalendar_Vfreebusy only supports timestamps at the
                  * moment. */
                 $vFb->addBusyPeriod('BUSY', $event->start->timestamp(), null,
                                     $event->end->timestamp() - $event->start->timestamp());
@@ -148,7 +148,7 @@ class Kronolith_FreeBusy
      * @param boolean $json  Whether to return the free/busy data as a simple
      *                       object suitable to be transferred as json.
      *
-     * @return Horde_iCalendar_vfreebusy  Free/busy component.
+     * @return Horde_Icalendar_Vfreebusy  Free/busy component.
      * @throws Kronolith_Exception
      */
     public static function get($email, $json = false)
@@ -199,16 +199,16 @@ class Kronolith_FreeBusy
                     $charset = 'UTF-8';
                 }
 
-                $vCal = new Horde_iCalendar();
+                $vCal = new Horde_Icalendar();
                 $vCal->parsevCalendar($data, 'VCALENDAR', $charset);
                 $components = $vCal->getComponents();
 
-                $vCal = new Horde_iCalendar();
-                $vFb = Horde_iCalendar::newComponent('vfreebusy', $vCal);
+                $vCal = new Horde_Icalendar();
+                $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
                 $vFb->setAttribute('ORGANIZER', $email);
                 $found = false;
                 foreach ($components as $component) {
-                    if ($component instanceof Horde_iCalendar_vfreebusy) {
+                    if ($component instanceof Horde_Icalendar_Vfreebusy) {
                         $found = true;
                         $vFb->merge($component);
                     }
@@ -238,8 +238,8 @@ class Kronolith_FreeBusy
         }
 
         /* Or else return an empty VFB object. */
-        $vCal = new Horde_iCalendar();
-        $vFb = Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $vCal = new Horde_Icalendar();
+        $vFb = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $vFb->setAttribute('ORGANIZER', $email);
 
         return $json ? self::toJson($vFb) : $vFb;
@@ -274,11 +274,11 @@ class Kronolith_FreeBusy
      * Converts free/busy data to a simple object suitable to be transferred
      * as json.
      *
-     * @param Horde_iCalendar_vfreebusy $fb  A Free/busy component.
+     * @param Horde_Icalendar_Vfreebusy $fb  A Free/busy component.
      *
      * @return object  A simple object representation.
      */
-    function toJson($fb)
+    function toJson(Horde_Icalendar_Vfreebusy $fb)
     {
         $json = new stdClass;
         $start = $fb->getStart();
index dbd5ad6..fc5f0da 100644 (file)
@@ -53,10 +53,10 @@ class Kronolith_FreeBusy_View {
 
         $this->_render($day);
 
-        $vCal = new Horde_iCalendar();
+        $vCal = new Horde_Icalendar();
 
         /* Required members */
-        $required = &Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $required = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         foreach ($this->_requiredMembers as $member) {
             $required->merge($member, false);
         }
@@ -66,7 +66,7 @@ class Kronolith_FreeBusy_View {
         $required->simplify();
 
         /* Optional members */
-        $optional = &Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $optional = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         foreach ($this->_optionalMembers as $member) {
             $optional->merge($member, false);
         }
@@ -76,7 +76,7 @@ class Kronolith_FreeBusy_View {
         $optional->simplify();
 
         /* Optimal time calculation */
-        $optimal = &Horde_iCalendar::newComponent('vfreebusy', $vCal);
+        $optimal = Horde_Icalendar::newComponent('vfreebusy', $vCal);
         $optimal->merge($required, false);
         $optimal->merge($optional);
 
@@ -300,7 +300,7 @@ class Kronolith_FreeBusy_View {
 
         $blocks = '';
         foreach ($this->_timeBlocks as $span) {
-            /* Horde_iCalendar_vfreebusy only supports timestamps at the
+            /* Horde_Icalendar_Vfreebusy only supports timestamps at the
              * moment. */
             $start = $span[0]->timestamp();
             $end = $span[1]->timestamp();
index 94efe4a..a5c3fc9 100644 (file)
@@ -2256,7 +2256,7 @@ class Kronolith
             }
 
             /* Build the iCalendar data */
-            $iCal = new Horde_iCalendar();
+            $iCal = new Horde_Icalendar();
             $iCal->setAttribute('METHOD', $method);
             $iCal->setAttribute('X-WR-CALNAME', Horde_String::convertCharset($share->get('name'), $registry->getCharset(), 'utf-8'));
             $vevent = $event->toiCalendar($iCal);
index 249efce..1c35c9a 100644 (file)
@@ -54,10 +54,10 @@ class Kronolith_Storage_kolab extends Kronolith_Storage
         }
         $vfb_text = $http->getResponseBody();
 
-        $iCal = new Horde_iCalendar;
+        $iCal = new Horde_Icalendar;
         $iCal->parsevCalendar($vfb_text);
 
-        $vfb = &$iCal->findComponent('VFREEBUSY');
+        $vfb = $iCal->findComponent('VFREEBUSY');
         if ($vfb === false) {
             throw new Horde_Exception_NotFound();
         }
index f05cd72..5344b40 100644 (file)
@@ -107,7 +107,7 @@ class Kronolith_Storage_sql extends Kronolith_Storage
      * @param boolean $private_only (optional) Only return free/busy
      *                              information owned by this used.
      *
-     * @return Horde_iCalendar_vFreebusy
+     * @return Horde_Icalendar_Vfreebusy
      * @throws Kronolith_Exception
      */
     public function search($email, $private_only = false)
@@ -146,7 +146,7 @@ class Kronolith_Storage_sql extends Kronolith_Storage
      * Store the freebusy information for a given email address.
      *
      * @param string                     $email        The email address to store fb info for.
-     * @param Horde_iCalendar_vFreebusy  $vfb          TODO
+     * @param Horde_Icalendar_Vfreebusy  $vfb          TODO
      * @param boolean                    $private_only (optional) TODO
      *
      * @throws Kronolith_Exception
index ac54434..1e62fad 100644 (file)
@@ -22,7 +22,7 @@ class Kronolith_View_ExportEvent {
             exit;
         }
 
-        $iCal = new Horde_iCalendar('2.0');
+        $iCal = new Horde_Icalendar('2.0');
 
         if ($event->calendarType == 'internal') {
             try {
index b10eeb2..fffe9ed 100644 (file)
@@ -17,9 +17,9 @@ $prefs = new Prefs;
 require 'Date/Calc.php';
 require 'Horde/Date.php';
 require 'Horde/String.php';
-require 'Horde/iCalendar.php';
+require 'Horde/Icalendar.php';
 
-$iCal = new Horde_iCalendar();
+$iCal = new Horde_Icalendar();
 $iCal->parsevCalendar(file_get_contents(dirname(__FILE__) . '/allday.ics'));
 $components = $iCal->getComponents();
 
@@ -29,7 +29,7 @@ require KRONOLITH_BASE . '/lib/Driver.php';
 require KRONOLITH_BASE . '/lib/Event.php';
 require KRONOLITH_BASE . '/lib/Event/Sql.php';
 foreach ($components as $content) {
-    if ($content instanceof Horde_iCalendar_vevent) {
+    if ($content instanceof Horde_Icalendar_Vevent) {
         $event = new Kronolith_Event_Sql(new Driver);
         $event->fromiCalendar($content);
         echo (string)$event->start . "\n";
index cbc169c..8e4e821 100644 (file)
@@ -11,9 +11,9 @@ require 'Date/Calc.php';
 require 'Horde/Date.php';
 require 'Horde/Date/Recurrence.php';
 require 'Horde/String.php';
-require 'Horde/iCalendar.php';
+require 'Horde/Icalendar.php';
 
-$iCal = new Horde_iCalendar();
+$iCal = new Horde_Icalendar();
 $iCal->parsevCalendar(file_get_contents(dirname(__FILE__) . '/bug7068.ics'));
 $components = $iCal->getComponents();
 
@@ -24,7 +24,7 @@ require KRONOLITH_BASE . '/lib/Event.php';
 require KRONOLITH_BASE . '/lib/Event/Sql.php';
 $event = new Kronolith_Event_Sql(new Driver);
 foreach ($components as $content) {
-    if ($content instanceof Horde_iCalendar_vevent) {
+    if ($content instanceof Horde_Icalendar_vevent) {
         $event->fromiCalendar($content);
         var_export($event->recurrence->exceptions);
         echo "\n";
index d8049be..4948939 100644 (file)
@@ -24,12 +24,12 @@ $object->recurrence->setRecurInterval(2);
 $object->recurrence->addException(2007, 3, 19);
 $object->initialized = true;
 
-$ical = new Horde_iCalendar('1.0');
+$ical = new Horde_Icalendar('1.0');
 $cal = $object->toiCalendar($ical);
 $ical->addComponent($cal);
 echo $ical->exportvCalendar() . "\n";
 
-$ical = new Horde_iCalendar('2.0');
+$ical = new Horde_Icalendar('2.0');
 $cal = $object->toiCalendar($ical);
 $ical->addComponent($cal);
 echo $ical->exportvCalendar() . "\n";
@@ -57,12 +57,12 @@ $object->attendees =
           array('attendance' => Kronolith::PART_NONE,
                 'response' => Kronolith::RESPONSE_TENTATIVE));
 
-$ical = new Horde_iCalendar('1.0');
+$ical = new Horde_Icalendar('1.0');
 $cal = $object->toiCalendar($ical);
 $ical->addComponent($cal);
 echo $ical->exportvCalendar() . "\n";
 
-$ical = new Horde_iCalendar('2.0');
+$ical = new Horde_Icalendar('2.0');
 $cal = $object->toiCalendar($ical);
 $ical->addComponent($cal);
 echo $ical->exportvCalendar() . "\n";
@@ -71,7 +71,7 @@ echo $ical->exportvCalendar() . "\n";
 --EXPECTF--
 BEGIN:VCALENDAR
 VERSION:1.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
 METHOD:PUBLISH
 BEGIN:VEVENT
 DTSTART:20070315T121020Z
@@ -95,7 +95,7 @@ END:VCALENDAR
 
 BEGIN:VCALENDAR
 VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
 METHOD:PUBLISH
 BEGIN:VEVENT
 DTSTART:20070315T121020Z
@@ -121,7 +121,7 @@ END:VCALENDAR
 
 BEGIN:VCALENDAR
 VERSION:1.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
 METHOD:PUBLISH
 BEGIN:VEVENT
 DTSTART:20070315T121020Z
@@ -145,7 +145,7 @@ END:VCALENDAR
 
 BEGIN:VCALENDAR
 VERSION:2.0
-PRODID:-//The Horde Project//Horde_iCalendar Library//EN
+PRODID:-//The Horde Project//Horde iCalendar Library//EN
 METHOD:PUBLISH
 BEGIN:VEVENT
 DTSTART:20070315T121020Z
index 316c472..2aedb49 100755 (executable)
@@ -83,7 +83,7 @@ $handle = $db->query('SELECT event_id, calendar_id, ical_raw, owner_name, prefva
 if ($handle instanceof PEAR_Error) {
     $cli->fatal($handle->toString());
 }
-$ical = new Horde_iCalendar();
+$ical = new Horde_Icalendar();
 $tz = $calendar = $user = $count = null;
 while ($row = $handle->fetchRow(DB_FETCHMODE_ASSOC)) {
     // Open calendar.
@@ -107,9 +107,10 @@ while ($row = $handle->fetchRow(DB_FETCHMODE_ASSOC)) {
         Horde_Auth::setAuth($user, array());
     }
     // Parse event.
-    $parsed = $ical->parsevCalendar($row['ical_raw']);
-    if ($parsed instanceof PEAR_Error) {
-        $cli->message('  ' . $parsed->getMessage(), 'cli.warning');
+    try {
+        $ical->parsevCalendar($row['ical_raw']);
+    } catch (Horde_Icalendar_Exception $e) {
+        $cli->message('  ' . $e->getMessage(), 'cli.warning');
         continue;
     }
     $components = $ical->getComponents();
index 7a3e8a9..04a8f3c 100644 (file)
@@ -438,7 +438,7 @@ if (is_array($next_step)) {
 
         $error = false;
         foreach ($next_step as $row) {
-            if ($row instanceof Horde_iCalendar_vcard) {
+            if ($row instanceof Horde_Icalendar_Vcard) {
                 $row = $driver->toHash($row);
             }
 
index ae5ddf7..46a877c 100644 (file)
@@ -651,7 +651,7 @@ class Turba_Api extends Horde_Registry_Api
         $cManager = new Horde_Prefs_CategoryManager();
         $categories = $cManager->get();
 
-        if (!($content instanceof Horde_iCalendar_vcard)) {
+        if (!($content instanceof Horde_Icalendar_Vcard)) {
             switch ($contentType) {
             case 'array':
                 break;
@@ -659,7 +659,7 @@ class Turba_Api extends Horde_Registry_Api
             case 'text/x-vcard':
             case 'text/vcard':
             case 'text/directory':
-                $iCal = new Horde_iCalendar();
+                $iCal = new Horde_Icalendar();
                 if (!$iCal->parsevCalendar($content)) {
                     throw new Horde_Exception(_("There was an error importing the iCalendar data."));
                 }
@@ -674,7 +674,7 @@ class Turba_Api extends Horde_Registry_Api
                 default:
                     $ids = array();
                     foreach ($iCal->getComponents() as $c) {
-                        if ($c instanceof Horde_iCalendar_vcard) {
+                        if ($c instanceof Horde_Icalendar_Vcard) {
                             $content = $driver->toHash($c);
                             $result = $driver->search($content);
                             if ($result instanceof PEAR_Error) {
@@ -707,7 +707,7 @@ class Turba_Api extends Horde_Registry_Api
             }
         }
 
-        if ($content instanceof Horde_iCalendar_vcard) {
+        if ($content instanceof Horde_Icalendar_Vcard) {
             $content = $driver->toHash($content);
         }
 
@@ -1064,7 +1064,7 @@ class Turba_Api extends Horde_Registry_Api
             case 'text/x-vcard':
             case 'text/vcard':
             case 'text/directory':
-                $iCal = new Horde_iCalendar();
+                $iCal = new Horde_Icalendar();
                 if (!$iCal->parsevCalendar($content)) {
                     throw new Horde_Exception(_("There was an error importing the iCalendar data."));
                 }
index b6c1981..153e09f 100644 (file)
@@ -967,12 +967,12 @@ class Turba_Driver
      *                              properties with the requested fields.
      * @param boolean $skipEmpty    Whether to skip empty fields.
      *
-     * @return Horde_iCalendar_vcard  A Horde_iCalendar_vcard object.
+     * @return Horde_Icalendar_vcard  A Horde_Icalendar_vcard object.
      */
     function tovCard($object, $version = '2.1', $fields = null, $skipEmpty = false)
     {
         $hash = $object->getAttributes();
-        $vcard = new Horde_iCalendar_vcard($version);
+        $vcard = new Horde_Icalendar_Vcard($version);
         $formattedname = false;
         $charset = $version == '2.1' ? array('CHARSET' => $GLOBALS['registry']->getCharset()) : array();
 
@@ -1398,7 +1398,7 @@ class Turba_Driver
                     break;
                 }
                 $vcard->setAttribute('EMAIL',
-                                     Horde_iCalendar_vcard::getBareEmail($val));
+                                     Horde_Icalendar_Vcard::getBareEmail($val));
                 break;
             case 'homeEmail':
                 if ($fields &&
@@ -1409,11 +1409,11 @@ class Turba_Driver
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('EMAIL',
-                                         Horde_iCalendar_vcard::getBareEmail($val),
+                                         Horde_Icalendar_Vcard::getBareEmail($val),
                                          array('HOME' => null));
                 } else {
                     $vcard->setAttribute('EMAIL',
-                                         Horde_iCalendar_vcard::getBareEmail($val),
+                                         Horde_Icalendar_Vcard::getBareEmail($val),
                                          array('TYPE' => 'HOME'));
                 }
                 break;
@@ -1426,11 +1426,11 @@ class Turba_Driver
                 }
                 if ($version == '2.1') {
                     $vcard->setAttribute('EMAIL',
-                                         Horde_iCalendar_vcard::getBareEmail($val),
+                                         Horde_Icalendar_Vcard::getBareEmail($val),
                                          array('WORK' => null));
                 } else {
                     $vcard->setAttribute('EMAIL',
-                                         Horde_iCalendar_vcard::getBareEmail($val),
+                                         Horde_Icalendar_Vcard::getBareEmail($val),
                                          array('TYPE' => 'WORK'));
                 }
                 break;
@@ -1441,7 +1441,7 @@ class Turba_Driver
                 $emails = explode(',', $val);
                 foreach ($emails as $email) {
                     $vcard->setAttribute('EMAIL',
-                                         Horde_iCalendar_vcard::getBareEmail($email));
+                                         Horde_Icalendar_Vcard::getBareEmail($email));
                 }
                 break;
 
@@ -1634,11 +1634,11 @@ class Turba_Driver
         }
 
         $a = array(
-            VCARD_N_FAMILY => isset($hash['lastname']) ? $hash['lastname'] : '',
-            VCARD_N_GIVEN  => isset($hash['firstname']) ? $hash['firstname'] : '',
-            VCARD_N_ADDL   => isset($hash['middlenames']) ? $hash['middlenames'] : '',
-            VCARD_N_PREFIX => isset($hash['namePrefix']) ? $hash['namePrefix'] : '',
-            VCARD_N_SUFFIX => isset($hash['nameSuffix']) ? $hash['nameSuffix'] : '',
+            Horde_Icalendar_Vcard::N_FAMILY => isset($hash['lastname']) ? $hash['lastname'] : '',
+            Horde_Icalendar_Vcard::N_GIVEN  => isset($hash['firstname']) ? $hash['firstname'] : '',
+            Horde_Icalendar_Vcard::N_ADDL   => isset($hash['middlenames']) ? $hash['middlenames'] : '',
+            Horde_Icalendar_Vcard::N_PREFIX => isset($hash['namePrefix']) ? $hash['namePrefix'] : '',
+            Horde_Icalendar_Vcard::N_SUFFIX => isset($hash['nameSuffix']) ? $hash['nameSuffix'] : '',
         );
         $val = implode(';', $a);
         if ($version != '2.1') {
@@ -1706,19 +1706,19 @@ class Turba_Driver
                 $hash['commonStreet'] = $hash['commonAddress'];
             }
             $a = array(
-                VCARD_ADR_POB      => isset($hash['commonPOBox'])
+                Horde_Icalendar_Vcard::ADR_POB      => isset($hash['commonPOBox'])
                     ? $hash['commonPOBox'] : '',
-                VCARD_ADR_EXTEND   => isset($hash['commonExtended'])
+                Horde_Icalendar_Vcard::ADR_EXTEND   => isset($hash['commonExtended'])
                     ? $hash['commonExtended'] : '',
-                VCARD_ADR_STREET   => isset($hash['commonStreet'])
+                Horde_Icalendar_Vcard::ADR_STREET   => isset($hash['commonStreet'])
                     ? $hash['commonStreet'] : '',
-                VCARD_ADR_LOCALITY => isset($hash['commonCity'])
+                Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['commonCity'])
                     ? $hash['commonCity'] : '',
-                VCARD_ADR_REGION   => isset($hash['commonProvince'])
+                Horde_Icalendar_Vcard::ADR_REGION   => isset($hash['commonProvince'])
                     ? $hash['commonProvince'] : '',
-                VCARD_ADR_POSTCODE => isset($hash['commonPostalCode'])
+                Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['commonPostalCode'])
                     ? $hash['commonPostalCode'] : '',
-                VCARD_ADR_COUNTRY  => isset($hash['commonCountry'])
+                Horde_Icalendar_Vcard::ADR_COUNTRY  => isset($hash['commonCountry'])
                     ? Turba_Driver::getCountry($hash['commonCountry']) : '',
             );
 
@@ -1761,19 +1761,19 @@ class Turba_Driver
                 $hash['homeStreet'] = $hash['homeAddress'];
             }
             $a = array(
-                VCARD_ADR_POB      => isset($hash['homePOBox'])
+                Horde_Icalendar_Vcard::ADR_POB      => isset($hash['homePOBox'])
                     ? $hash['homePOBox'] : '',
-                VCARD_ADR_EXTEND   => isset($hash['homeExtended'])
+                Horde_Icalendar_Vcard::ADR_EXTEND   => isset($hash['homeExtended'])
                     ? $hash['homeExtended'] : '',
-                VCARD_ADR_STREET   => isset($hash['homeStreet'])
+                Horde_Icalendar_Vcard::ADR_STREET   => isset($hash['homeStreet'])
                     ? $hash['homeStreet'] : '',
-                VCARD_ADR_LOCALITY => isset($hash['homeCity'])
+                Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['homeCity'])
                     ? $hash['homeCity'] : '',
-                VCARD_ADR_REGION   => isset($hash['homeProvince'])
+                Horde_Icalendar_Vcard::ADR_REGION   => isset($hash['homeProvince'])
                     ? $hash['homeProvince'] : '',
-                VCARD_ADR_POSTCODE => isset($hash['homePostalCode'])
+                Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['homePostalCode'])
                     ? $hash['homePostalCode'] : '',
-                VCARD_ADR_COUNTRY  => isset($hash['homeCountry'])
+                Horde_Icalendar_Vcard::ADR_COUNTRY  => isset($hash['homeCountry'])
                     ? Turba_Driver::getCountry($hash['homeCountry']) : '',
             );
 
@@ -1816,19 +1816,19 @@ class Turba_Driver
                 $hash['workStreet'] = $hash['workAddress'];
             }
             $a = array(
-                VCARD_ADR_POB      => isset($hash['workPOBox'])
+                Horde_Icalendar_Vcard::ADR_POB      => isset($hash['workPOBox'])
                     ? $hash['workPOBox'] : '',
-                VCARD_ADR_EXTEND   => isset($hash['workExtended'])
+                Horde_Icalendar_Vcard::ADR_EXTEND   => isset($hash['workExtended'])
                     ? $hash['workExtended'] : '',
-                VCARD_ADR_STREET   => isset($hash['workStreet'])
+                Horde_Icalendar_Vcard::ADR_STREET   => isset($hash['workStreet'])
                     ? $hash['workStreet'] : '',
-                VCARD_ADR_LOCALITY => isset($hash['workCity'])
+                Horde_Icalendar_Vcard::ADR_LOCALITY => isset($hash['workCity'])
                     ? $hash['workCity'] : '',
-                VCARD_ADR_REGION   => isset($hash['workProvince'])
+                Horde_Icalendar_Vcard::ADR_REGION   => isset($hash['workProvince'])
                     ? $hash['workProvince'] : '',
-                VCARD_ADR_POSTCODE => isset($hash['workPostalCode'])
+                Horde_Icalendar_Vcard::ADR_POSTCODE => isset($hash['workPostalCode'])
                     ? $hash['workPostalCode'] : '',
-                VCARD_ADR_COUNTRY  => isset($hash['workCountry'])
+                Horde_Icalendar_Vcard::ADR_COUNTRY  => isset($hash['workCountry'])
                     ? Turba_Driver::getCountry($hash['workCountry']) : '',
             );
 
@@ -1868,22 +1868,18 @@ class Turba_Driver
     }
 
     /**
-     * Function to convert a Horde_iCalendar_vcard object into a Turba
+     * Function to convert a Horde_Icalendar_Vcard object into a Turba
      * Object Hash with Turba attributes suitable as a parameter for add().
      *
      * @see add()
      *
-     * @param Horde_iCalendar_vcard $vcard  The Horde_iCalendar_vcard object
+     * @param Horde_Icalendar_Vcard $vcard  The Horde_Icalendar_Vcard object
      *                                      to parse.
      *
      * @return array  A Turba attribute hash.
      */
-    function toHash(&$vcard)
+    function toHash(Horde_Icalendar_Vcard $vcard)
     {
-        if (!is_a($vcard, 'Horde_iCalendar_vcard')) {
-            return PEAR::raiseError('Invalid parameter for Turba_Driver::toHash(), expected Horde_iCalendar_vcard object.');
-        }
-
         $hash = array();
         $attr = $vcard->getAllAttributes();
         foreach ($attr as $item) {
@@ -1894,20 +1890,20 @@ class Turba_Driver
 
             case 'N':
                 $name = $item['values'];
-                if (!empty($name[VCARD_N_FAMILY])) {
-                    $hash['lastname'] = $name[VCARD_N_FAMILY];
+                if (!empty($name[Horde_Icalendar_Vcard::N_FAMILY])) {
+                    $hash['lastname'] = $name[Horde_Icalendar_Vcard::N_FAMILY];
                 }
-                if (!empty($name[VCARD_N_GIVEN])) {
-                    $hash['firstname'] = $name[VCARD_N_GIVEN];
+                if (!empty($name[Horde_Icalendar_Vcard::N_GIVEN])) {
+                    $hash['firstname'] = $name[Horde_Icalendar_Vcard::N_GIVEN];
                 }
-                if (!empty($name[VCARD_N_ADDL])) {
-                    $hash['middlenames'] = $name[VCARD_N_ADDL];
+                if (!empty($name[Horde_Icalendar_Vcard::N_ADDL])) {
+                    $hash['middlenames'] = $name[Horde_Icalendar_Vcard::N_ADDL];
                 }
-                if (!empty($name[VCARD_N_PREFIX])) {
-                    $hash['namePrefix'] = $name[VCARD_N_PREFIX];
+                if (!empty($name[Horde_Icalendar_Vcard::N_PREFIX])) {
+                    $hash['namePrefix'] = $name[Horde_Icalendar_Vcard::N_PREFIX];
                 }
-                if (!empty($name[VCARD_N_SUFFIX])) {
-                    $hash['nameSuffix'] = $name[VCARD_N_SUFFIX];
+                if (!empty($name[Horde_Icalendar_Vcard::N_SUFFIX])) {
+                    $hash['nameSuffix'] = $name[Horde_Icalendar_Vcard::N_SUFFIX];
                 }
                 break;
 
@@ -1966,38 +1962,38 @@ class Turba_Driver
 
                     $hash[$prefix . 'Address'] = '';
 
-                    if (!empty($address[VCARD_ADR_STREET])) {
-                        $hash[$prefix . 'Street'] = $address[VCARD_ADR_STREET];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_STREET])) {
+                        $hash[$prefix . 'Street'] = $address[Horde_Icalendar_Vcard::ADR_STREET];
                         $hash[$prefix . 'Address'] .= $hash[$prefix . 'Street'] . "\n";
                     }
-                    if (!empty($address[VCARD_ADR_EXTEND])) {
-                        $hash[$prefix . 'Extended'] = $address[VCARD_ADR_EXTEND];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_EXTEND])) {
+                        $hash[$prefix . 'Extended'] = $address[Horde_Icalendar_Vcard::ADR_EXTEND];
                         $hash[$prefix . 'Address'] .= $hash[$prefix . 'Extended'] . "\n";
                     }
-                    if (!empty($address[VCARD_ADR_POB])) {
-                        $hash[$prefix . 'POBox'] = $address[VCARD_ADR_POB];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_POB])) {
+                        $hash[$prefix . 'POBox'] = $address[Horde_Icalendar_Vcard::ADR_POB];
                         $hash[$prefix . 'Address'] .= $hash[$prefix . 'POBox'] . "\n";
                     }
-                    if (!empty($address[VCARD_ADR_LOCALITY])) {
-                        $hash[$prefix . 'City'] = $address[VCARD_ADR_LOCALITY];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_LOCALITY])) {
+                        $hash[$prefix . 'City'] = $address[Horde_Icalendar_Vcard::ADR_LOCALITY];
                         $hash[$prefix . 'Address'] .= $hash[$prefix . 'City'];
                     }
-                    if (!empty($address[VCARD_ADR_REGION])) {
-                        $hash[$prefix . 'Province'] = $address[VCARD_ADR_REGION];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_REGION])) {
+                        $hash[$prefix . 'Province'] = $address[Horde_Icalendar_Vcard::ADR_REGION];
                         $hash[$prefix . 'Address'] .= ', ' . $hash[$prefix . 'Province'];
                     }
-                    if (!empty($address[VCARD_ADR_POSTCODE])) {
-                        $hash[$prefix . 'PostalCode'] = $address[VCARD_ADR_POSTCODE];
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_POSTCODE])) {
+                        $hash[$prefix . 'PostalCode'] = $address[Horde_Icalendar_Vcard::ADR_POSTCODE];
                         $hash[$prefix . 'Address'] .= ' ' . $hash[$prefix . 'PostalCode'];
                     }
-                    if (!empty($address[VCARD_ADR_COUNTRY])) {
+                    if (!empty($address[Horde_Icalendar_Vcard::ADR_COUNTRY])) {
                         include 'Horde/Nls/Countries.php';
-                        $country = array_search($address[VCARD_ADR_COUNTRY], $countries);
+                        $country = array_search($address[Horde_Icalendar_Vcard::ADR_COUNTRY], $countries);
                         if ($country === false) {
-                            $country = $address[VCARD_ADR_COUNTRY];
+                            $country = $address[Horde_Icalendar_Vcard::ADR_COUNTRY];
                         }
                         $hash[$prefix . 'Country'] = $country;
-                        $hash[$prefix . 'Address'] .= "\n" . $address[VCARD_ADR_COUNTRY];
+                        $hash[$prefix . 'Address'] .= "\n" . $address[Horde_Icalendar_Vcard::ADR_COUNTRY];
                     }
 
                     $hash[$prefix . 'Address'] = trim($hash[$prefix . 'Address']);
@@ -2137,12 +2133,12 @@ class Turba_Driver
                 if (isset($item['params']['HOME']) &&
                     (!isset($hash['homeEmail']) ||
                      isset($item['params']['PREF']))) {
-                    $hash['homeEmail'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                    $hash['homeEmail'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                     $email_set = true;
                 } elseif (isset($item['params']['WORK']) &&
                           (!isset($hash['workEmail']) ||
                            isset($item['params']['PREF']))) {
-                    $hash['workEmail'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                    $hash['workEmail'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                     $email_set = true;
                 } elseif (isset($item['params']['TYPE'])) {
                     if (!is_array($item['params']['TYPE'])) {
@@ -2151,25 +2147,25 @@ class Turba_Driver
                     if (in_array('HOME', $item['params']['TYPE']) &&
                         (!isset($hash['homeEmail']) ||
                          in_array('PREF', $item['params']['TYPE']))) {
-                        $hash['homeEmail'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                        $hash['homeEmail'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                         $email_set = true;
                     } elseif (in_array('WORK', $item['params']['TYPE']) &&
                               (!isset($hash['workEmail']) ||
                          in_array('PREF', $item['params']['TYPE']))) {
-                        $hash['workEmail'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                        $hash['workEmail'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                         $email_set = true;
                     }
                 }
                 if (!$email_set &&
                     (!isset($hash['email']) ||
                      isset($item['params']['PREF']))) {
-                    $hash['email'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                    $hash['email'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                 }
 
                 if (!isset($hash['emails'])) {
-                    $hash['emails'] = Horde_iCalendar_vcard::getBareEmail($item['value']);
+                    $hash['emails'] = Horde_Icalendar_Vcard::getBareEmail($item['value']);
                 } else {
-                    $hash['emails'] .= ', ' . Horde_iCalendar_vcard::getBareEmail($item['value']);
+                    $hash['emails'] .= ', ' . Horde_Icalendar_Vcard::getBareEmail($item['value']);
                 }
                 break;
 
@@ -2380,7 +2376,7 @@ class Turba_Driver
                 break;
 
             case 'email':
-                $message->email1address = Horde_iCalendar_vcard::getBareEmail($value);
+                $message->email1address = Horde_Icalendar_Vcard::getBareEmail($value);
                 break;
 
             case 'title':
@@ -2496,7 +2492,7 @@ class Turba_Driver
 
         /* Email addresses */
         if (!$message->isGhosted('email1address')) {
-            $hash['email'] = Horde_iCalendar_vcard::getBareEmail($message->email1address);
+            $hash['email'] = Horde_Icalendar_Vcard::getBareEmail($message->email1address);
         }
 
         /* Categories */
index 9b790aa..dff1fcf 100644 (file)
@@ -4,7 +4,7 @@ Turba_Driver::toHash() test.
 <?php
 
 require_once 'PEAR.php';
-require_once 'Horde/iCalendar.php';
+require_once 'Horde/Icalendar.php';
 require dirname(__FILE__) . '/../Object.php';
 require dirname(__FILE__) . '/../Driver.php';
 
@@ -193,7 +193,7 @@ END:VCARD
 ';
 
 $driver = new Turba_Driver(array());
-$iCal = new Horde_iCalendar();
+$iCal = new Horde_Icalendar();
 
 $iCal->parsevCalendar($vcard1);
 var_export($driver->toHash($iCal->getComponent(0)));