diff --git a/calendar/ical_test.php b/calendar/ical_test.php
index 92a9dfd4f3..8e560e94f8 100755
--- a/calendar/ical_test.php
+++ b/calendar/ical_test.php
@@ -16,9 +16,11 @@
$phpgw_info['flags']['currentapp'] = 'calendar';
include('../header.inc.php');
- $icsfile=PHPGW_APP_INC.'/vcal1.ics';
+ @set_time_limit(0);
+
+ $icsfile=PHPGW_APP_INC.'/small_test.ics';
$fp=fopen($icsfile,'r');
- $contents = explode("\n",fread ($fp, filesize($icsfile)));
+ $contents = explode("\n",fread($fp, filesize($icsfile)));
fclose($fp);
$vcal = CreateObject('calendar.vCalendar');
@@ -29,6 +31,18 @@
echo "Method = ".$vcalendar->method->value."
\n";
echo "Version = ".$vcalendar->version->value."
\n";
+ for($i=0;$itimezone);$i++)
+ {
+ echo "
\nTIMEZONE
\n";
+ if($vcalendar->timezone[$i]->tzdata)
+ {
+ for($j=0;$jtimezone[$i]->tzdata);$j++)
+ {
+ echo "TZDATA #$j
\n";
+ }
+ }
+ }
+
for($i=0;$ievent);$i++)
{
echo "
\nEVENT
\n";
@@ -44,6 +58,13 @@
{
echo "Description (Alt Rep) = ".$vcalendar->event[$i]->description->altrep."
\n";
}
+ if($vcalendar->event[$i]->description->x_type)
+ {
+ for($j=0;$jevent[$i]->description->x_type);$j++)
+ {
+ echo "Description (X-".$vcalendar->event[$i]->description->x_type[$j]->name.") = ".$vcalendar->event[$i]->description->x_type[$j]->value."
\n";
+ }
+ }
if($vcalendar->event[$i]->summary->value)
{
echo "Summary = ".$vcalendar->event[$i]->summary->value."
\n";
@@ -61,15 +82,25 @@
}
echo "Sequence = ".$vcalendar->event[$i]->sequence."
\n";
echo "Date Start : ".$phpgw->common->show_date(mktime($vcalendar->event[$i]->dtstart->hour,$vcalendar->event[$i]->dtstart->min,$vcalendar->event[$i]->dtstart->sec,$vcalendar->event[$i]->dtstart->month,$vcalendar->event[$i]->dtstart->mday,$vcalendar->event[$i]->dtstart->year) - $phpgw->calendar->datatime->tz_offset)."
\n";
+ if($vcalendar->event[$i]->dtstart->tzid)
+ {
+ echo "Date Start TZID : ".$vcalendar->event[$i]->dtstart->tzid."
\n";
+ }
if($vcalendar->event[$i]->rrule)
{
- echo "Recurrence : Frequency = ".$vcalendar->event[$i]->rrule->freq." Count = ".$vcalendar->event[$i]->rrule->count."
\n";
+ for($j=0;$jevent[$i]->rrule);$j++)
+ {
+ echo "Recurrence : Frequency = ".$vcalendar->event[$i]->rrule[$j]->freq." Count = ".$vcalendar->event[$i]->rrule[$j]->count."
\n";
+ }
}
echo "Class = ".$vcalendar->event[$i]->class->value."
\n";
- echo "Organizer = ".$vcalendar->event[$i]->organizer->mailto->user.'@'.$vcalendar->event[$i]->organizer->mailto->host."
\n";
- if($vcalendar->event[$i]->organizer->dir)
+ if($vcalendar->event[$i]->organizer)
{
- echo "Organizer Dir = ".$vcalendar->event[$i]->organizer->dir."
\n";
+ echo "Organizer = ".$vcalendar->event[$i]->organizer->mailto->user.'@'.$vcalendar->event[$i]->organizer->mailto->host."
\n";
+ if($vcalendar->event[$i]->organizer->dir)
+ {
+ echo "Organizer Dir = ".$vcalendar->event[$i]->organizer->dir."
\n";
+ }
}
for($j=0;$jevent[$i]->attendee);$j++)
{
@@ -78,7 +109,7 @@
{
echo "Attendee[$j] Dir = ".$vcalendar->event[$i]->attendee[$j]->dir."
\n";
}
- echo "Attendee[$j] Address = ".$vcalendar->event[$i]->attendee[$j]->mailto->user.'@'.$vcalendar->event[0]->attendee[$j]->mailto->host."
\n";
+ echo "Attendee[$j] Address = ".$vcalendar->event[$i]->attendee[$j]->mailto->user.'@'.$vcalendar->event[$i]->attendee[$j]->mailto->host."
\n";
echo "Attendee[$j] Role = ".$vcal->switch_role($vcalendar->event[$i]->attendee[$j]->role)."
\n";
echo "Attendee[$j] RSVP = ".$vcal->switch_rsvp($vcalendar->event[$i]->attendee[$j]->rsvp)."
\n";
// echo "Attendee[$j] RSVP = ".$vcalendar->event[$i]->attendee[$j]->rsvp."
\n";
diff --git a/calendar/inc/class.vCalendar.inc.php b/calendar/inc/class.vCalendar.inc.php
index d226b66dbe..1b660f0590 100755
--- a/calendar/inc/class.vCalendar.inc.php
+++ b/calendar/inc/class.vCalendar.inc.php
@@ -37,13 +37,41 @@ define('DELEGATED',4);
define('COMPLETED',5);
define('IN_PROCESS',6);
+ /*
+ * Class
+ */
define('PRIVATE',0);
define('PUBLIC',1);
define('CONFIDENTIAL',3);
+ /*
+ * Transparency
+ */
define('TRANSPARENT',0);
define('OPAQUE',1);
+ /*
+ * Frequency
+ */
+define('SECONDLY',1);
+define('MINUTELY',2);
+define('HOURLY',3);
+define('DAILY',4);
+define('WEEKLY',5);
+define('MONTHLY',6);
+define('YEARLY',7);
+
+define('FREE',0);
+define('BUSY',1);
+define('BUSY_UNAVAILABLE',2);
+define('BUSY_TENTATIVE',3);
+
+define('THISANDPRIOR',0);
+define('THISANDFUTURE',1);
+
+define('START',0);
+define('END',1);
+
define('_8BIT',0);
define('_BASE64',1);
@@ -70,6 +98,102 @@ class class_address
var $partstat = NEEDS_ACTION;
}
+class class_tzprop
+{
+ var $type;
+ var $comment;
+ var $dtstart;
+ var $rdate;
+ var $rrule;
+ var $tzname;
+ var $tzoffsetfrom;
+ var $tzoffsetto;
+ var $x_type = Array();
+}
+
+class class_timezone
+{
+ var $type;
+ var $tzdata;
+ var $last_modified;
+ var $tzid;
+ var $tzurl;
+}
+
+class class_event
+{
+ var $type;
+ var $alarm;
+ var $attach;
+ var $attendee;
+ var $categories;
+ var $class;
+ var $comment;
+ var $contact;
+ var $created;
+ var $description;
+ var $dtend;
+ var $dtstamp;
+ var $dtstart;
+ var $duration;
+ var $exdate;
+ var $exrule;
+ var $geo;
+ var $last_modified;
+ var $location;
+ var $organizer;
+ var $priority;
+ var $rdate;
+ var $recurrence_id;
+ var $request_status;
+ var $resources;
+ var $rrule;
+ var $sequence;
+ var $status;
+ var $summary;
+ var $transp;
+ var $uid;
+ var $url;
+ var $x_type = Array();
+}
+
+class class_todo
+{
+ var $type;
+ var $alarm;
+ var $attach;
+ var $attendee;
+ var $calscale;
+ var $class;
+ var $comment;
+ var $completed;
+ var $created;
+ var $description;
+ var $dtstamp;
+ var $dtstart;
+ var $due;
+ var $duration;
+ var $exdate;
+ var $exrule;
+ var $geo;
+ var $last_modified;
+ var $location;
+ var $organizer;
+ var $percent_coplete;
+ var $priority;
+ var $rdate;
+ var $recurrence_id;
+ var $related_to;
+ var $request_status;
+ var $resources;
+ var $rrule;
+ var $sequence;
+ var $summary;
+ var $uid;
+ var $url;
+ var $x_type = Array();
+}
+
class class_datetime
{
var $year;
@@ -93,12 +217,21 @@ class class_geo
class class_recur
{
- var $freq;
- var $enddate;
- var $interval;
- var $count;
- var $wkst;
var $byday;
+ var $byhour;
+ var $byminute;
+ var $bymonth;
+ var $bymonthday;
+ var $bysecond;
+ var $bysetpos;
+ var $byweekno;
+ var $byyearday;
+ var $count;
+ var $freq;
+ var $interval;
+ var $until;
+ var $wkst;
+ var $x_type = Array();
}
class class_text
@@ -109,13 +242,25 @@ class class_text
var $altrep;
var $language;
var $value;
+ var $x_type = Array();
}
+
class class_x_type
{
var $name;
var $value;
}
+class class_alarm
+{
+ var $action;
+ var $trigger;
+ var $duration;
+ var $repeat;
+ var $attach;
+ var $x_type = Array();
+}
+
class vCalendar_item
{
var $alarm = Array();
@@ -128,9 +273,9 @@ class vCalendar_item
var $class;
var $created;
var $description;
- var $dtstart;
var $dtend;
var $dtstamp;
+ var $dtstart;
var $due;
var $duration;
var $freebusy;
@@ -140,18 +285,20 @@ class vCalendar_item
var $organizer;
var $percent_complete;
var $priority;
- var $rrule;
+ var $rdate;
var $resources;
var $request_status;
+ var $rrule;
var $sequence;
var $status;
var $summary;
var $transp;
var $type;
+ var $tzdata = Array();
+ var $tzid;
var $tzname;
var $tzoffsetto;
var $tzoffsetfrom;
- var $tzid;
var $uid;
var $x_type = Array();
}
@@ -161,6 +308,7 @@ class vCal
var $prodid;
var $version;
var $method;
+ var $calscale;
var $event = Array();
var $todo = Array();
var $journal = Array();
@@ -176,7 +324,8 @@ class vCalendar
var $journal = Array();
var $freebusy = Array();
var $timezone = Array();
- var $property;
+ var $property = Array();
+ var $parameter= Array();
/*
* Base Functions
@@ -185,6 +334,14 @@ class vCalendar
function vCalendar()
{
$this->property = Array(
+ 'action' => Array(
+ 'type' => 'text',
+ 'to_text' => True,
+ 'valarm' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ )
+ ),
'attach' => Array(
'type' => 'uri',
'to_text' => True,
@@ -229,36 +386,12 @@ class vCalendar
'multiples' => True
)
),
- 'calscale' => Array(
- 'type' => 'text',
- 'to_text' => True,
- 'vevent' => Array(
- 'state' => 'optional',
- 'multiples' => False
- ),
- 'vtodo' => Array(
- 'state' => 'optional',
- 'multiples' => False
- ),
- 'vjournal' => Array(
- 'state' => 'optional',
- 'multiples' => False
- ),
- 'valarm' => Array(
- 'state' => 'optional',
- 'multiples' => False
- ),
- 'vfreebusy' => Array(
- 'state' => 'optional',
- 'multiples' => False
- )
- ),
'categories' => Array(
'type' => 'text',
'to_text' => True,
'vevent' => Array(
'state' => 'optional',
- 'multiples' => False
+ 'multiples' => True
),
'vtodo' => Array(
'state' => 'optional',
@@ -288,15 +421,11 @@ class vCalendar
'comment' => Array(
'type' => 'text',
'to_text' => True,
- 'vevent' => Array(
+ 'daylight' => Array(
'state' => 'optional',
'multiples' => True
),
- 'vtodo' => Array(
- 'state' => 'optional',
- 'multiples' => True
- ),
- 'vjournal' => Array(
+ 'standard' => Array(
'state' => 'optional',
'multiples' => True
),
@@ -304,9 +433,21 @@ class vCalendar
'state' => 'optional',
'multiples' => True
),
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
'vfreebusy' => Array(
'state' => 'optional',
'multiples' => True
+ ),
+ 'vjournal' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
)
),
'completed' => Array(
@@ -317,6 +458,14 @@ class vCalendar
'multiples' => False
)
),
+ 'contact' => Array(
+ 'type' => 'text',
+ 'to_text' => True,
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ )
+ ),
'created' => Array(
'type' => 'date-time',
'to_text' => False,
@@ -388,11 +537,15 @@ class vCalendar
'dtstart' => Array(
'type' => 'date-time',
'to_text' => False,
- 'vevent' => Array(
+ 'daylight' => Array(
'state' => 'required',
'multiples' => False
),
- 'vtodo' => Array(
+ 'standard' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ ),
+ 'vevent' => Array(
'state' => 'optional',
'multiples' => False
),
@@ -400,9 +553,9 @@ class vCalendar
'state' => 'optional',
'multiples' => False
),
- 'vtimezone' => Array(
- 'state' => 'required',
- 'multiples' => True
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
)
),
'due' => Array(
@@ -433,6 +586,30 @@ class vCalendar
'multiples' => False
)
),
+ 'exdate' => Array(
+ 'type' => 'date-time',
+ 'to_text' => False,
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ )
+ ),
+ 'exrule' => Array(
+ 'type' => 'recur',
+ 'to_text' => False,
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ )
+ ),
'freebusy' => Array(
'type' => 'freebusy',
'to_text' => False,
@@ -469,7 +646,7 @@ class vCalendar
'multiples' => False
),
'vtimezone' => Array(
- 'state' => 'required',
+ 'state' => 'optional',
'multiples' => False
)
),
@@ -487,7 +664,7 @@ class vCalendar
),
'organizer' => Array(
'type' => 'cal-address',
- 'to_text' => True,
+ 'to_text' => False,
'vevent' => Array(
'state' => 'optional',
'multiples' => False
@@ -525,7 +702,43 @@ class vCalendar
'multiples' => False
)
),
- 'resources' => Array(
+ 'rdate' => Array(
+ 'type' => 'date-time',
+ 'to_text' => False,
+ 'daylight' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'standard' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'vjournal' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ )
+ ),
+ 'recurrence_id' => Array(
+ 'type' => 'date-time',
+ 'to_text' => False,
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
+ )
+ ),
+ 'related_to' => Array(
'type' => 'text',
'to_text' => False,
'vevent' => Array(
@@ -534,7 +747,7 @@ class vCalendar
),
'vtodo' => Array(
'state' => 'optional',
- 'multiples' => False
+ 'multiples' => True
)
),
'request_status' => Array(
@@ -557,9 +770,29 @@ class vCalendar
'multiples' => False
)
),
+ 'resources' => Array(
+ 'type' => 'text',
+ 'to_text' => False,
+ 'vevent' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
+ ),
+ 'vtodo' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
+ )
+ ),
'rrule' => Array(
'type' => 'recur',
'to_text' => False,
+ 'daylight' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
+ 'standard' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
+ ),
'vevent' => Array(
'state' => 'optional',
'multiples' => True
@@ -571,10 +804,6 @@ class vCalendar
'vjournal' => Array(
'state' => 'optional',
'multiples' => True
- ),
- 'vtimezone' => Array(
- 'state' => 'optional',
- 'multiples' => False
)
),
'sequence' => Array(
@@ -637,6 +866,14 @@ class vCalendar
'multiples' => False
)
),
+ 'trigger' => Array(
+ 'type' => 'trigger',
+ 'to_text' => True,
+ 'valarm' => Array(
+ 'state' => 'optional',
+ 'multiples' => False
+ )
+ ),
'tzid' => Array(
'type' => 'text',
'to_text' => True,
@@ -648,15 +885,23 @@ class vCalendar
'tzname' => Array(
'type' => 'text',
'to_text' => True,
- 'vtimezone' => Array(
+ 'daylight' => Array(
'state' => 'optional',
- 'multiples' => False
+ 'multiples' => True
+ ),
+ 'standard' => Array(
+ 'state' => 'optional',
+ 'multiples' => True
)
),
'tzoffsetfrom' => Array(
'type' => 'utc-offset',
'to_text' => True,
- 'vtimezone' => Array(
+ 'daylight' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ ),
+ 'standard' => Array(
'state' => 'required',
'multiples' => False
)
@@ -664,7 +909,11 @@ class vCalendar
'tzoffsetto' => Array(
'type' => 'utc-offset',
'to_text' => True,
- 'vtimezone' => Array(
+ 'daylight' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ ),
+ 'standard' => Array(
'state' => 'required',
'multiples' => False
)
@@ -696,8 +945,433 @@ class vCalendar
'state' => 'required',
'multiples' => False
)
+ ),
+ 'url' => Array(
+ 'type' => 'text',
+ 'to_text' => True,
+ 'vevent' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ ),
+ 'vtodo' => Array(
+ 'state' => 'required',
+ 'multiples' => False
+ )
)
);
+ $this->parameter = Array(
+ 'altrep' => Array(
+ 'type' => 'uri',
+ 'quoted' => True,
+ 'to_text' => True,
+ 'properties' => Array(
+ 'comment' => True,
+ 'description' => True,
+ 'location' => True,
+ 'resources' => True,
+ 'summary' => True,
+ 'contact' => True
+ )
+ ),
+ 'byday' => Array(
+ 'type' => 'text',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'byhour' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'byminute' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'bymonth' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'bymonthday' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'bysecond' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'bysetpos' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'byweekno' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'byyearday' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'cn' => Array(
+ 'type' => 'text',
+ 'quoted' => True,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True,
+ 'organizer' => True
+ )
+ ),
+ 'count' => Array(
+ 'type' => 'integer',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'cu' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_cu',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'delegated_from' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_mailto',
+ 'quoted' => True,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'delegated_to' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_mailto',
+ 'quoted' => True,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'dir' => Array(
+ 'type' => 'dir',
+ 'quoted' => True,
+ 'to_text' => True,
+ 'properties' => Array(
+ 'attendee' => True,
+ 'organizer' => True
+ )
+ ),
+ 'enocding' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_encoding',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attach' => True
+ )
+ ),
+ 'fmttype' => Array(
+ 'type' => 'text',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attach' => True
+ )
+ ),
+ 'fbtype' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_fbtype',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attach' => True
+ )
+ ),
+ 'freq' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_freq',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'interval' => Array(
+ 'type' => 'integer',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'language' => Array(
+ 'type' => 'text',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'categories' => True,
+ 'comment' => True,
+ 'description' => True,
+ 'location' => True,
+ 'resources' => True,
+ 'summary' => True,
+ 'tzname' => True,
+ 'attendee' => True,
+ 'contact' => True,
+ 'organizer' => True,
+ 'x-type' => True
+ )
+ ),
+ 'mailto' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_mailto',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True,
+ 'organizer' => True
+ )
+ ),
+ 'member' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_mailto',
+ 'quoted' => True,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'partstat' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_partstat',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'range' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_range',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'recurrence_id' => True
+ )
+ ),
+ 'related' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_related',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'related_to' => True
+ )
+ ),
+ 'role' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_role',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'rsvp' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_rsvp',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True
+ )
+ ),
+ 'sent_by' => Array(
+ 'type' => 'function',
+ 'function' => 'parse_user_host',
+ 'quoted' => True,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'attendee' => True,
+ 'organizer' => True
+ )
+ ),
+ 'tzid' => Array(
+ 'type' => 'text',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'dtend' => True,
+ 'due' => True,
+ 'dtstart' => True,
+ 'recurrence_id' => True,
+ 'exdate' => True,
+ 'rdate' => True
+ )
+ ),
+ 'until' => Array(
+ 'type' => 'function',
+ 'function' => 'switch_date',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'value' => Array(
+ 'type' => 'value',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'calscale' => True,
+ 'method' => True,
+ 'prodid' => True,
+ 'version' => True,
+ 'attach' => True,
+ 'categories' => True,
+ 'class' => True,
+ 'comment' => True,
+ 'description' => True,
+ 'geo' => True,
+ 'location' => True,
+ 'percent' => True,
+ 'priority' => True,
+ 'resources' => True,
+ 'status' => True,
+ 'summary' => True,
+ 'completed' => True,
+ 'dtend' => True,
+ 'due' => True,
+ 'dtstart' => True,
+ 'duration' => True,
+ 'freebusy' => True,
+ 'transp' => True,
+ 'tzid' => True,
+ 'tzname' => True,
+ 'tzoffsetfrom' => True,
+ 'tzoffsetto' => True,
+ 'tzurl' => True,
+ 'attendee' => True,
+ 'contact' => True,
+ 'organizer' => True,
+ 'recurrence_id' => True,
+ 'url' => True,
+ 'uid' => True,
+ 'exdate' => True,
+ 'exrule' => True,
+ 'rdate' => True,
+ 'rrule' => True,
+ 'action' => True,
+ 'repeat' => True,
+ 'trigger' => True,
+ 'created' => True,
+ 'dtstamp' => True,
+ 'last_modified' => True,
+ 'sequence' => True,
+ 'x_type' => True,
+ 'request_status' => True
+ )
+ ),
+ 'wkst' => Array(
+ 'type' => 'string',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'rrule' => True
+ )
+ ),
+ 'x_type' => Array(
+ 'type' => 'x_type',
+ 'quoted' => False,
+ 'to_text' => False,
+ 'properties' => Array(
+ 'calscale' => True,
+ 'method' => True,
+ 'prodid' => True,
+ 'version' => True,
+ 'attach' => True,
+ 'categories' => True,
+ 'class' => True,
+ 'comment' => True,
+ 'description' => True,
+ 'geo' => True,
+ 'location' => True,
+ 'percent' => True,
+ 'priority' => True,
+ 'resources' => True,
+ 'status' => True,
+ 'summary' => True,
+ 'completed' => True,
+ 'dtend' => True,
+ 'due' => True,
+ 'dtstart' => True,
+ 'duration' => True,
+ 'freebusy' => True,
+ 'transp' => True,
+ 'tzid' => True,
+ 'tzname' => True,
+ 'tzoffsetfrom' => True,
+ 'tzoffsetto' => True,
+ 'tzurl' => True,
+ 'attendee' => True,
+ 'contact' => True,
+ 'organizer' => True,
+ 'recurrence_id' => True,
+ 'url' => True,
+ 'uid' => True,
+ 'exdate' => True,
+ 'exrule' => True,
+ 'rdate' => True,
+ 'rrule' => True,
+ 'action' => True,
+ 'repeat' => True,
+ 'trigger' => True,
+ 'created' => True,
+ 'dtstamp' => True,
+ 'last_modified' => True,
+ 'sequence' => True,
+ 'x_type' => True,
+ 'request_status' => True
+ )
+ )
+ );
}
function set_var(&$event,$type,$value)
@@ -747,12 +1421,12 @@ class vCalendar
if(ereg("^[\=\:]",$char))
{
$found = True;
- $ret_str = str_replace('=3D','=',str_replace('%20',' ',substr($str,0,$i)));
+ $ret_str = substr($str,0,$i);
$return_value[] = $ret_str;
$ret_array = $this->explode_param(substr($str,$i + 1),'"',False);
while(list($key,$value) = each($ret_array))
{
- $return_value[] = str_replace('=3D','=',str_replace('%20',' ',$value));
+ $return_value[] = $value;
}
$i = $str_len;
}
@@ -760,7 +1434,7 @@ class vCalendar
}
if(!$found)
{
- $return_value[] = str_replace('=3D','=',str_replace('%20',' ',$str));
+ $return_value[] = $str;
}
}
else
@@ -817,6 +1491,44 @@ class vCalendar
return $str;
}
+ function from_dir($str)
+ {
+ return str_replace('=3D','=',str_replace('%20',' ',$str));
+ }
+
+ function to_dir($str)
+ {
+ return str_replace('=','=3D',str_replace(' ','%20',$str));
+ }
+
+ function find_parameters($property)
+ {
+ reset($this->parameter);
+ while(list($key,$param_array) = each($this->parameter))
+ {
+ if($param_array['properties'][$property])
+ {
+ $param[] = $key;
+ }
+ }
+ reset($param);
+ return $param;
+ }
+
+ function find_properties($ical_type)
+ {
+ reset($this->property);
+ while(list($key,$param_array) = each($this->property))
+ {
+ if($param_array[$ical_type])
+ {
+ $prop[] = $key;
+ }
+ }
+ reset($prop);
+ return $prop;
+ }
+
function new_vcal()
{
return new vCal;
@@ -842,6 +1554,21 @@ class vCalendar
$this->set_var($dtime,'hour',intval(substr($value,9,2)));
$this->set_var($dtime,'min',intval(substr($value,11,2)));
$this->set_var($dtime,'sec',intval(substr($value,13,2)));
+ if(strlen($value) > 14)
+ {
+ if(substr($value,14,1) != 'Z')
+ {
+
+ }
+ }
+ else
+ {
+ /*
+ * The time provided by the vCal is considered local time.
+ *
+ * The implementor will need to consider how to convert that time to UTC.
+ */
+ }
}
else
{
@@ -872,28 +1599,6 @@ class vCalendar
return $dtime;
}
- function parse_host_user($address)
- {
- if(strpos(' '.$address,':'))
- {
- $parts = explode(':',$address);
- $address = $parts[1];
- }
-
- $parts = explode('@',$address);
- if(count($parts) == 2)
- {
- $temp_address = new class_mailto;
- $temp_address->user = $parts[0];
- $temp_address->host = $parts[1];
- return $temp_address;
- }
- else
- {
- return False;
- }
- }
-
function parse_geo(&$event,$value)
{
$return_value = $this->explode_param($value,'"',True);
@@ -909,38 +1614,76 @@ class vCalendar
$temp_x_type = new class_x_type;
$temp_x_type->name = strtoupper(substr($majortype,2));
$temp_x_type->value = $value;
- $event[] = $temp_x_type;
+ $event->x_type[] = $temp_x_type;
unset($temp_x_type);
}
- function parse_text(&$event,$value)
+ function parse_parameters(&$event,$majortype,$value)
{
$return_value = $this->explode_param($value,'"',True);
if(count($return_value) > 0)
{
for($i=0;$istrip_quotes($return_value[$i+1]);
- switch(strtolower($type[0]))
+ $name = $return_value[$i];
+ $value = $this->strip_quotes($return_value[$i+1]);
+ if(substr($name,0,2) == 'X-')
{
- case 'altrep':
- case 'fmttype':
- case 'cid':
- case 'language':
- $this->set_var($event,strtolower($type[0]),$type[1]);
- break;
- case 'encoding':
- $this->set_var($event,strtolower($type[0]),$this->switch_encoding($type[1]));
- break;
- case 'value':
- break;
- default:
- if($type[0] <> "\\n")
+ $param = 'x_type';
+ $name = str_replace('-','_',$name);
+ }
+ else
+ {
+ $param = str_replace('-','_',strtolower($name));
+ if(!isset($this->parameter[$param]))
+ {
+ if($majortype == 'attendee' || $majortype == 'organizer')
{
- $this->set_var($event,'value',$type[0]);
+ $param = 'mailto';
+ $value = $name;
+ $name = $param;
}
- break;
+ else
+ {
+ $param = 'value';
+ }
+ }
+ }
+// echo "name : $name : Param = $param
\n";
+ if(@$this->parameter[$param]['properties'][$majortype])
+ {
+ switch(@$this->parameter[$param]['type'])
+ {
+ case 'dir':
+ $this->set_var($event,$name,$this->from_dir($value));
+ break;
+ case 'text':
+ $this->set_var($event,$name,$value);
+ break;
+ case 'x_type':
+ $this->parse_xtype($event,$name,$value);
+ break;
+ case 'function':
+ $function = $this->parameter[$param]['function'];
+ $this->set_var($event,$name,$this->$function($value));
+ break;
+ case 'uri':
+ if(@$this->parameter[$param]['to_text'])
+ {
+ $value = $this->to_text($value);
+ }
+ $this->set_var($event,$name,$value);
+ break;
+ case 'integer':
+ $this->set_var($event,$name,intval($value));
+ break;
+ case 'value':
+ if($name <> "\\n")
+ {
+ $this->set_var($event,$param,$name);
+ }
+ break;
+ }
}
}
}
@@ -950,42 +1693,6 @@ class vCalendar
}
}
- function parse_address(&$event,$value)
- {
- $param = $this->explode_param($value,'"',True);
-
- for($j=0;$jstrip_quotes($param[$j+1]);
- switch($type[0])
- {
- case 'role':
- $val = $this->switch_role($type[1]);
- break;
- case 'partstat':
- $val = $this->switch_partstat($type[1]);
- break;
- case 'rsvp':
- $val = $this->switch_rsvp($type[1]);
- break;
- case 'delegated-from':
- case 'delegated-to':
- case 'mailto':
- $type[0] = str_replace('-','_',$type[0]);
- $val = $this->parse_host_user($type[1]);
- break;
- case 'dir':
- $val = $type[1];
- break;
- default:
- $val = $type[1];
- break;
- }
- $this->set_var($event,$type[0],$val);
- }
- }
-
function parse_recurrence(&$event,$value)
{
$return_value = $this->explode_param($value,'"',True);
@@ -1004,59 +1711,128 @@ class vCalendar
* Build-Card Functions
*/
- function build_cal_address($event)
+ function build_xtype($x_type,$seperator='=')
+ {
+ $quote = '';
+ if($seperator == '=')
+ {
+ $quote = '"';
+ }
+
+ return $this->fold('X-'.$x_type->name.$seperator.$quote.$x_type->value.$quote);
+ }
+
+ function build_cal_address($event,$property)
{
$str = '';
- if(!empty($event->cn) && $event->cn <> 'Unknown')
+ $include_mailto = False;
+ $include_datetime = False;
+ $param = $this->find_parameters($property);
+ while(list($dumb_key,$key) = each($param))
{
- $str .= ';CN="'.$event->cn.'"';
+ if($key == 'mailto')
+ {
+ $include_mailto = True;
+ continue;
+ }
+ $param_array = @$this->parameter[$key];
+ $type = @$param_array['type'];
+ if($type == 'date-time')
+ {
+ $include_datetime = True;
+ continue;
+ }
+ $quote = (@$param_array['quoted']?'"':'');
+ if(!empty($event->$key) && @$param_array['properties'][$property])
+ {
+ $change_text = @$param_array['to_text'];
+ $value = $event->$key;
+ if($change_text && $type == 'text')
+ {
+ $value = $this->to_text($value);
+ }
+ switch($type)
+ {
+ case 'dir':
+ $str .= ';'.str_replace('_','-',strtoupper($key)).'='.$quote.$this->to_dir($value).$quote;
+ break;
+ case 'function':
+ $str .= ';'.str_replace('_','-',strtoupper($key)).'=';
+ $function = @$param_array['function'];
+ $str .= $quote.$this->$function($value).$quote;
+ break;
+ case 'text':
+ $str .= ';'.strtoupper($key).'='.$quote.$value.$quote;
+ break;
+ case 'date-time':
+ $str .= ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year));
+
+ }
+ unset($value);
+ }
}
- if(!empty($event->dir))
+
+ if(!empty($event->x_type))
{
- $str .= ';DIR="'.str_replace('=','=3D',str_replace(' ','%20',$event->dir)).'"';
+ for($j=0;$jx_type);$j++)
+ {
+ $str .= ';'.$this->build_xtype($event->x_type[$j],'=');
+ }
}
- if(!empty($event->role))
+ if(!empty($event->value))
{
- $str .= ';ROLE='.$this->switch_role($event->role);
+ if($to_text)
+ {
+ $event->value = $this->to_text($event->value);
+ }
+ $str .= ':'.$event->value;
}
- if(!empty($event->rsvp))
+ if($include_mailto == True)
{
- $str .= ';RSVP='.$this->switch_rsvp($event->rsvp);
+ $key = 'mailto';
+ $function = $this->parameter[$key]['function'];
+ $str .= ':'.$this->$function($event->$key);
}
- if(!empty($event->delegated_from->user) && !empty($event->delegated_from->host))
+ if($include_datetime == True || @$this->property[$property]['type'] == 'date-time')
{
- $str .= ';DELEGATED-FROM="MAILTO:'.$event->delegated_from->user.'@'.$event->delegated_from->host.'"';
- }
- if(!empty($event->delegated_to->user) && !empty($event->delegated_to->host))
- {
- $str .= ';DELEGATED-TO="MAILTO:'.$event->delegated_to->user.'@'.$event->delegated_to->host.'"';
- }
- if(!empty($event->mailto->user) && !empty($event->mailto->host))
- {
- $str .= ':MAILTO:'.$event->mailto->user.'@'.$event->mailto->host;
+ $str .= ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year));
}
return $str;
}
- function build_text($event,$to_text)
+ function build_text($event,$property)
{
$str = '';
- if(!empty($event->cid))
+ $param = $this->find_parameters($property);
+ while(list($dumb_key,$key) = each($param))
{
- $str .= ';CID="'.$event->cid.'"';
+ if(!empty($event->$key))
+ {
+ $type = @$this->parameter[$key]['type'];
+ $quote = @$this->parameter[$key]['quote'];
+ if(@$this->parameter[$key]['to_text'] == True)
+ {
+ $value = $this->to_text($event->$key);
+ }
+ else
+ {
+ $value = $event->$key;
+ }
+ switch($type)
+ {
+ case 'text':
+ $str .= ';'.strtoupper($key).'='.$quote.$value.$quote;
+ break;
+ }
+ }
}
- if(!empty($event->altrep))
+ if(!empty($event->x_type))
{
- $str .= ';ALTREP="'.$event->altrep.'"';
+ for($j=0;$jx_type);$j++)
+ {
+ $str .= ';'.$this->build_xtype($event->x_type[$j],'=');
+ }
}
- if(!empty($event->fmttype))
- {
- $str .= ';FMTTYPE='.$event->fmttype;
- }
- if(!empty($event->encoding))
- {
- $str .= ';ENCODING='.$this->switch_encoding($event->encoding);
- }
if(!empty($event->value))
{
if($to_text)
@@ -1092,135 +1868,138 @@ class vCalendar
return ':'.date('Ymd\THms\Z',mktime($event->hour,$event->min,$event->sec,$event->month,$event->mday,$event->year));
}
- function build_xtype($x_type)
- {
- return $this->fold('X-'.$x_type->name.':'.$x_type->value);
- }
-
function build_card_internals($ical_item,$event)
{
- reset($this->property);
- while(list($key,$varray) = each($this->property))
+ $prop = $this->find_properties($ical_item);
+ reset($prop);
+ while(list($dumb_key,$key) = each($prop))
{
$value = $key;
+ $varray = $this->property[$key];
$type = $varray['type'];
$to_text = $varray['to_text'];
$state = @$varray[$ical_item]['state'];
$multiples = @$varray[$ical_item]['multiples'];
- if(@$state == 'optional' || @$state == 'required')
+ switch($type)
{
- switch($type)
- {
- case 'date-time':
- switch($value)
- {
- case 'last_modified':
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.gmdate('Ymd\THms\Z'));
- break;
- default:
- if(!empty($event->$value))
- {
- if($multiples)
- {
- for($i=0;$i$value);$i++)
- {
- $str .= $this->fold(strtoupper($value).$this->build_datetime($event->{$value}[$i]));
- }
- }
- else
- {
- $str .= $this->fold(strtoupper($value).$this->build_datetime($event->$value));
- }
- }
- elseif($value == 'dtstamp' || $value == 'created')
- {
- $str .= $this->fold(strtoupper($value).':'.gmdate('Ymd\THms\Z'));
- }
- break;
- }
- break;
- case 'uri':
- if(!empty($event->$value))
+ case 'date-time':
+ if(!empty($event->$value))
+ {
+ if($multiples)
{
for($i=0;$i$value);$i++)
{
- $str .= $this->fold(strtoupper($value).$this->build_text($event->{$value}[$i],$to_text));
+// $str .= $this->fold(strtoupper($value).$this->build_datetime($event->{$value}[$i]));
+ $str .= $this->fold(strtoupper($value).$this->build_cal_address($event->{$value}[$i],$value));
}
}
- break;
- case 'recur':
- if(!empty($event->$value))
+ else
{
- if($multiples)
+// $str .= $this->fold(strtoupper($value).$this->build_datetime($event->$value));
+ $str .= $this->fold(strtoupper($value).$this->build_cal_address($event->$value,$value));
+ }
+ }
+ elseif($value == 'dtstamp' || $value == 'created')
+ {
+ $str .= $this->fold(strtoupper($value).':'.gmdate('Ymd\THms\Z'));
+ }
+ break;
+ case 'uri':
+ if(!empty($event->$value))
+ {
+ for($i=0;$i$value);$i++)
+ {
+ $str .= $this->fold(strtoupper($value).$this->build_text($event->{$value}[$i],$to_text));
+ }
+ }
+ break;
+ case 'recur':
+ if(!empty($event->$value))
+ {
+ if($multiples)
+ {
+ for($i=0;$i$value);$i++)
{
- for($i=0;$i$value);$i++)
- {
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->{$value}[$i]));
- }
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->{$value}[$i]));
}
- else
+ }
+ else
+ {
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->$value));
+ }
+ }
+ break;
+ case 'integer':
+ if(!empty($event->$value))
+ {
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value);
+ }
+ elseif($value == 'sequence' || $value == 'percent_complete')
+ {
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':0');
+ }
+ break;
+ case 'float':
+ if(!empty($event->$value))
+ {
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value->lat.';'.$event->$value->lon);
+ }
+ break;
+ case 'text':
+// if(empty($event->$value) && $state == 'required')
+// {
+// return '';
+// }
+ if(!empty($event->$value))
+ {
+ if($multiples)
+ {
+ for($i=0;$i$value);$i++)
{
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_recur($event->$value));
+// $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->{$value}[$i],$to_text));
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_cal_address($event->{$value}[$i],$value));
}
}
- break;
- case 'integer':
- if(!empty($event->$value))
+ else
{
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value);
+// $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->$value,$to_text));
+ $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_cal_address($event->$value,$value));
}
- elseif($value == 'sequence' || $value == 'percent_complete')
+ }
+ break;
+ case 'cal-address':
+ if(!empty($event->$value))
+ {
+ for($j=0;$j$value);$j++)
{
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':0');
- }
- break;
- case 'float':
- if(!empty($event->$value))
- {
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).':'.$event->$value->lat.';'.$event->$value->lon);
- }
- break;
- case 'text':
- if(empty($event->$value) && $state == 'required')
- {
- return '';
- }
- if(!empty($event->$value))
- {
- if($multiples)
+ $temp_output = $this->build_cal_address($event->{$value}[$j],$value);
+ if($temp_output)
{
- for($i=0;$i$value);$i++)
- {
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->{$value}[$i],$to_text));
- }
- }
- else
- {
- $str .= $this->fold(strtoupper(str_replace('_','-',$value)).$this->build_text($event->$value,$to_text));
+ $str .= $this->fold(strtoupper($value).$temp_output);
}
}
- break;
- case 'cal-address':
- if(!empty($event->$value))
- {
- for($j=0;$j$value);$j++)
- {
- $temp_output = $this->build_cal_address($event->{$value}[$j]);
- if($temp_output)
- {
- $str .= $this->fold(strtoupper($value).$temp_output);
- }
- }
- }
- break;
- }
+ }
+ break;
}
}
if(!empty($event->x_type))
{
for($i=0;$ix_type);$i++)
{
- $str .= $this->build_xtype($event->x_type[$i]);
+ $str .= $this->build_xtype($event->x_type[$i],':');
+ }
+ }
+
+ if($ical_item == 'vtimezone')
+ {
+ if($event->tzdata)
+ {
+ for($k=0;$ktzdata);$k++)
+ {
+ $str .= 'BEGIN:'.strtoupper($event->tzdata[$k]->type)."\r\n";
+ $str .= $this->build_card_internals(strtolower($event->tzdata[$k]->type),$event->tzdata[$k]);
+ $str .= 'END:'.strtoupper($event->tzdata[$k]->type)."\r\n";
+ }
}
}
return $str;
@@ -1230,9 +2009,154 @@ class vCalendar
* Switching Functions
*/
- function switch_encoding($var)
+ function switch_class($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'PRIVATE':
+ return PRIVATE;
+ break;
+ case 'PUBLIC':
+ return PUBLIC;
+ break;
+ case 'CONFIDENTIAL':
+ return CONFIDENTIAL;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case PRIVATE:
+ return 'PRIVATE';
+ break;
+ case PUBLIC:
+ return 'PUBLIC';
+ break;
+ case CONFIDENTIAL:
+ return 'CONFIDENTIAL';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_cu($var)
{
if(gettype($var) == 'string')
+ {
+ switch($var)
+ {
+ case 'INDIVIDUAL':
+ return INDIVIDUAL;
+ break;
+ case 'GROUP':
+ return GROUP;
+ break;
+ case 'RESOURCE':
+ return RESOURCE;
+ break;
+ case 'ROOM':
+ return ROOM;
+ break;
+ case 'UNKNOWN':
+ return UNKNOWN;
+ break;
+ default:
+ return OTHER;
+ break;
+ }
+ }
+ elseif(gettype($var) == 'integer')
+ {
+ switch($var)
+ {
+ case INDIVIDUAL:
+ return 'INDIVIDUAL';
+ break;
+ case GROUP:
+ return 'GROUP';
+ break;
+ case RESOURCE:
+ return 'RESOURCE';
+ break;
+ case ROOM:
+ return 'ROOM';
+ break;
+ case UNKNOWN:
+ return 'UNKNOWN';
+ break;
+ default:
+ return 'X-OTHER';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_date($var)
+ {
+ if(is_string($var))
+ {
+ $dtime = new class_datetime;
+ if(strpos($value,':'))
+ {
+ $pos = explode(':',$value);
+ $value = $pos[1];
+ }
+ $this->set_var($dtime,'year',intval(substr($value,0,4)));
+ $this->set_var($dtime,'month',intval(substr($value,4,2)));
+ $this->set_var($dtime,'mday',intval(substr($value,6,2)));
+ if(substr($value,8,1) == 'T')
+ {
+ $this->set_var($dtime,'hour',intval(substr($value,9,2)));
+ $this->set_var($dtime,'min',intval(substr($value,11,2)));
+ $this->set_var($dtime,'sec',intval(substr($value,13,2)));
+ if(strlen($value) > 14)
+ {
+ if(substr($value,14,1) != 'Z')
+ {
+ }
+ }
+ else
+ {
+ /*
+ * The time provided by the vCal is considered local time.
+ *
+ * The implementor will need to consider how to convert that time to UTC.
+ */
+ }
+ }
+ else
+ {
+ $this->set_var($dtime,'hour',0);
+ $this->set_var($dtime,'min',0);
+ $this->set_var($dtime,'sec',0);
+ }
+ return $dtime;
+ }
+ elseif(is_object($var))
+ {
+ return date('Ymd\THms\Z',mktime($var->hour,$var->min,$var->sec,$var->month,$var->mday,$var->year));
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_encoding($var)
+ {
+ if(is_string($var))
{
switch($var)
{
@@ -1247,7 +2171,7 @@ class vCalendar
break;
}
}
- elseif(gettype($var) == 'integer')
+ elseif(is_int($var))
{
switch($var)
{
@@ -1268,26 +2192,82 @@ class vCalendar
}
}
- function switch_role($var)
+ function switch_fbtype($var)
{
- if(gettype($var) == 'string')
+ if(is_string($var))
{
switch($var)
{
- case 'NONE':
- return NONE;
+ case 'FREE':
+ return FREE;
break;
- case 'CHAIR':
- return CHAIR;
+ case 'BUSY':
+ return BUSY;
break;
- case 'REQ-PARTICIPANT':
- return REQ_PARTICIPANT;
+ case 'BUSY-UNAVAILABLE':
+ return BUSY_UNAVAILABLE;
break;
- case 'OPT-PARTICIPANT':
- return OPT_PARTICIPANT;
+ case 'BUSY-TENTATIVE':
+ return BUSY_TENTATIVE;
break;
- case 'NON-PARTICIPANT':
- return NON_PARTICIPANT;
+ default:
+ return OTHER;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case FREE:
+ return 'FREE';
+ break;
+ case BUSY:
+ return 'BUSY';
+ break;
+ case BUSY_UNAVAILABLE:
+ return 'BUSY-UNAVAILABLE';
+ break;
+ case BUSY_TENTATIVE:
+ return 'BUSY-TENTATIVE';
+ break;
+ default:
+ return 'OTHER';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_freq($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'SECONDLY':
+ return SECONDLY;
+ break;
+ case 'MINUTELY':
+ return MINUTELY;
+ break;
+ case 'HOURLY':
+ return HOURLY;
+ break;
+ case 'DAILY':
+ return DAILY;
+ break;
+ case 'WEEKLY':
+ return WEEKLY;
+ break;
+ case 'MONTHLY':
+ return MONTHLY;
+ break;
+ case 'YEARLY':
+ return YEARLY;
break;
}
}
@@ -1295,20 +2275,26 @@ class vCalendar
{
switch($var)
{
- case NONE:
- return 'NONE';
+ case SECONDLY:
+ return 'SECONDLY';
break;
- case CHAIR:
- return 'CHAIR';
+ case MINUTELY:
+ return 'MINUTELY';
break;
- case REQ_PARTICIPANT:
- return 'REQ-PARTICIPANT';
+ case HOURLY:
+ return 'HOURLY';
break;
- case OPT_PARTICIPANT:
- return 'OPT-PARTICIPANT';
+ case DAILY:
+ return 'DAILY';
break;
- case NON_PARTICIPANT:
- return 'NON-PARTICIPANT';
+ case WEEKLY:
+ return 'WEEKLY';
+ break;
+ case MONTHLY:
+ return 'MONTHLY';
+ break;
+ case YEARLY:
+ return 'YEARLY';
break;
}
}
@@ -1318,9 +2304,39 @@ class vCalendar
}
}
+ function switch_mailto($var)
+ {
+ if(is_string($var))
+ {
+ if(strpos(' '.$var,':'))
+ {
+ $parts = explode(':',$var);
+ $var = $parts[1];
+ }
+
+ $parts = explode('@',$var);
+ if(count($parts) == 2)
+ {
+ $temp_address = new class_mailto;
+ $temp_address->user = $parts[0];
+ $temp_address->host = $parts[1];
+ return $temp_address;
+ }
+ else
+ {
+ return False;
+ }
+ }
+ elseif(is_object($var))
+ {
+ $str = 'MAILTO:'.$var->user.'@'.$var->host;
+ return $str;
+ }
+ }
+
function switch_partstat($var)
{
- if(gettype($var) == 'string')
+ if(is_string($var))
{
switch($var)
{
@@ -1350,7 +2366,7 @@ class vCalendar
break;
}
}
- elseif(gettype($var) == 'integer')
+ elseif(is_int($var))
{
switch($var)
{
@@ -1386,26 +2402,178 @@ class vCalendar
}
}
+ function switch_range($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'THISANDPRIOR':
+ return THISANDPRIOR;
+ break;
+ case 'THISANDFUTURE':
+ return THISANDFUTURE;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case THISANDPRIOR:
+ return 'THISANDPRIOR';
+ break;
+ case THISANDFUTURE:
+ return 'THISANDFUTURE';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_related($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'START':
+ return START;
+ break;
+ case 'END':
+ return END;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case START:
+ return 'START';
+ break;
+ case END:
+ return 'END';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_reltype($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'PARENT':
+ return PARENT;
+ break;
+ case 'CHILD':
+ return CHILD;
+ break;
+ case 'SIBLING':
+ return SIBLING;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case PARENT:
+ return 'PARENT';
+ break;
+ case CHILD:
+ return 'CHILD';
+ break;
+ case SIBLING:
+ return 'SIBLING';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
+ function switch_role($var)
+ {
+ if(is_string($var))
+ {
+ switch($var)
+ {
+ case 'NONE':
+ return NONE;
+ break;
+ case 'CHAIR':
+ return CHAIR;
+ break;
+ case 'REQ-PARTICIPANT':
+ return REQ_PARTICIPANT;
+ break;
+ case 'OPT-PARTICIPANT':
+ return OPT_PARTICIPANT;
+ break;
+ case 'NON-PARTICIPANT':
+ return NON_PARTICIPANT;
+ break;
+ }
+ }
+ elseif(is_int($var))
+ {
+ switch($var)
+ {
+ case NONE:
+ return 'NONE';
+ break;
+ case CHAIR:
+ return 'CHAIR';
+ break;
+ case REQ_PARTICIPANT:
+ return 'REQ-PARTICIPANT';
+ break;
+ case OPT_PARTICIPANT:
+ return 'OPT-PARTICIPANT';
+ break;
+ case NON_PARTICIPANT:
+ return 'NON-PARTICIPANT';
+ break;
+ }
+ }
+ else
+ {
+ return $var;
+ }
+ }
+
function switch_rsvp($var)
{
- if(gettype($var) == 'string')
+ if(is_string($var))
{
if($var == 'TRUE')
{
return 1;
}
- else
+ elseif($var == 'FALSE')
{
return 0;
}
}
- elseif(gettype($var) == 'integer')
+ elseif(is_int($var) || $var == False)
{
if($var == 1)
{
return 'TRUE';
}
- else
+ elseif($var == 0)
{
return 'FALSE';
}
@@ -1416,47 +2584,9 @@ class vCalendar
}
}
- function switch_class($var)
- {
- if(gettype($var) == 'string')
- {
- switch($var)
- {
- case 'PRIVATE':
- return PRIVATE;
- break;
- case 'PUBLIC':
- return PUBLIC;
- break;
- case 'CONFIDENTIAL':
- return CONFIDENTIAL;
- break;
- }
- }
- elseif(gettype($var) == 'integer')
- {
- switch($var)
- {
- case PRIVATE:
- return 'PRIVATE';
- break;
- case PUBLIC:
- return 'PUBLIC';
- break;
- case CONFIDENTIAL:
- return 'CONFIDENTIAL';
- break;
- }
- }
- else
- {
- return $var;
- }
- }
-
function switch_transp($var)
{
- if(gettype($var) == 'string')
+ if(is_string($var))
{
switch($var)
{
@@ -1468,7 +2598,7 @@ class vCalendar
break;
}
}
- elseif(gettype($var) == 'integer')
+ elseif(is_int($var))
{
switch($var)
{
@@ -1494,7 +2624,9 @@ class vCalendar
{
$i = 0;
$mode = 'none';
- while(chop($vcal_text[$i]) != '')
+ $standard = Array();
+ $max_lines = count($vcal_text);
+ while($i < $max_lines)
{
// if(strlen($vcal_text[$i]) > 75)
// {
@@ -1502,11 +2634,12 @@ class vCalendar
// }
$this->unfold($vcal_text,$i);
-
+ $max_lines = count($vcal_text);
+
$vcal_text[$i] = str_replace("\r\n",'',$vcal_text[$i]);
// echo "TEXT : ".$vcal_text[$i]."
\n";
-
+// flush();
// Example #1
//vcal_text[$i] = 'BEGIN:VCALENDAR'
@@ -1553,11 +2686,6 @@ class vCalendar
$value = $vcal_text[$i];
}
-// if($majortype == 'begin' || $majortype == 'end')
-// {
-// $mode = 'none';
-// }
-
if($mode != 'none' && ($majortype != 'begin' && $majortype != 'end'))
{
if(isset($this->property[$majortype]))
@@ -1590,12 +2718,38 @@ class vCalendar
{
switch(strtolower($value))
{
+ case 'daylight':
+ $mode = 'daylight';
+ $t_event = new class_timezone;
+ $t_event = $event;
+ unset($event);
+ $event = new class_tzprop;
+ $event->type = strtolower($value);
+ break;
+ case 'standard':
+ $mode = 'standard';
+ $t_event = new class_timezone;
+ $t_event = $event;
+ unset($event);
+ $event = new class_tzprop;
+ $event->type = strtolower($value);
+ break;
+ case 'valarm':
+ if($mode == 'vevent' || $mode == 'vtodo')
+ {
+ $mode = 'valarm';
+ $t_event = $event;
+ unset($event);
+ $event = new class_alarm;
+ $event->type = strtolower($value);
+ }
+ break;
case 'vcalendar':
$vcal = $this->new_vcal();
break;
case 'vevent':
$mode = 'vevent';
- $event = new vCalendar_item;
+ $event = new class_event;
$event->type = strtolower($value);
break;
case 'vfreebusy':
@@ -1603,7 +2757,6 @@ class vCalendar
$event = new vCalendar_item;
$event->type = strtolower($value);
break;
- break;
case 'vjournal':
$mode = 'vjournal';
$event = new vCalendar_item;
@@ -1611,23 +2764,14 @@ class vCalendar
break;
case 'vtimezone':
$mode = 'vtimezone';
- $event = new vCalendar_item;
+ $event = new class_timezone;
$event->type = strtolower($value);
break;
- break;
case 'vtodo':
$mode = 'vtodo';
- $event = new vCalendar_item;
+ $event = new class_todo;
$event->type = strtolower($value);
break;
- case 'valarm':
- if($mode == 'vevent' || $mode == 'vtodo')
- {
- $tmode = $mode;
- $mode = 'valarm';
- $alarm = new vCalendar_alarm;
- }
- break;
}
}
elseif($majortype == 'end')
@@ -1635,15 +2779,33 @@ class vCalendar
$mode = 'none';
switch(strtolower($value))
{
+ case 'daylight':
+ $tzdata[] = $event;
+ unset($event);
+ $event = $t_event;
+ unset($t_event);
+ $mode = 'vtimezone';
+ break;
+ case 'standard':
+ $tzdata[] = $event;
+ unset($event);
+ $event = $t_event;
+ unset($t_event);
+ $mode = 'vtimezone';
+ break;
case 'valarm':
- if($mode == 'valarm')
- {
- $event->alarm[] = $alarm;
- unset($alarm);
- $mode = $tmode;
- }
+ $alarm[] = $event;
+ unset($event);
+ $event = $t_event;
+ unset($t_event);
+ $mode = $tmode;
break;
case 'vevent':
+ if(!empty($alarm))
+ {
+ $event->alarm = $alarm;
+ unset($alarm);
+ }
$this->event[] = $event;
unset($event);
break;
@@ -1656,10 +2818,20 @@ class vCalendar
unset($event);
break;
case 'vtimezone':
+ if(!empty($tzdata))
+ {
+ $event->tzdata = $tzdata;
+ unset($tzdata);
+ }
$this->timezone[] = $event;
unset($event);
break;
case 'vtodo':
+ if(!empty($alarm))
+ {
+ $event->alarm = $alarm;
+ unset($alarm);
+ }
$this->todo[] = $event;
unset($event);
break;
@@ -1673,9 +2845,9 @@ class vCalendar
break 2;
}
}
- elseif($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method')
+ elseif($majortype == 'prodid' || $majortype == 'version' || $majortype == 'method' || $majortype == 'calscale')
{
- $this->parse_text($vcal->$majortype,$this->from_text($value));
+ $this->parse_parameters($vcal->$majortype,$majortype,$this->from_text($value));
}
else
@@ -1688,7 +2860,7 @@ class vCalendar
{
case 'text':
$text_class = new class_text;
- $this->parse_text($text_class,$value);
+ $this->parse_parameters($text_class,$majortype,$value);
if($multiples)
{
$event->{$majortype}[] = $text_class;
@@ -1725,9 +2897,12 @@ class vCalendar
$event->$majortype = new class_geo;
$this->parse_geo($event->$majortype,$value);
break;
+ case 'utc-offset':
+ $this->set_var($event,$majortype,intval($value));
+ break;
case 'cal-address':
$address = new class_address;
- $this->parse_address($address,$value);
+ $this->parse_parameters($address,$majortype,$value);
if($multiples)
{
$event->{$majortype}[] = $address;
@@ -1740,7 +2915,7 @@ class vCalendar
break;
case 'recur':
$recur = new class_recur;
- $this->parse_recurrence($recur,$value);
+ $this->parse_parameters($recur,$majortype,$value);
if($multiples)
{
$event->{$majortype}[] = $recur;
@@ -1753,7 +2928,7 @@ class vCalendar
break;
case 'uri':
$new_var = new class_text;
- $this->parse_text($new_var,$value);
+ $this->parse_parameters($new_var,$majortype,$value);
if($multiples)
{
switch($mode)
@@ -1773,7 +2948,7 @@ class vCalendar
unset($new_var);
break;
case 'xtype':
- $this->parse_xtype($event->x_type,$majortype,$value);
+ $this->parse_xtype($event,$majortype,$value);
break;
}
@@ -1808,6 +2983,8 @@ class vCalendar
$str .= $this->build_card_internals('v'.$vtype,$vcal->{$vtype}[$i]);
$str .= 'END:V'.strtoupper($vtype)."\r\n";
}
+// echo "STR #$i : $str
\n";
+// flush();
}
}
$str .= 'END:VCALENDAR'."\r\n";