Tech-invite3GPPspaceIETFspace
959493929190898887868584838281807978777675747372717069686766656463626160595857565554535251504948474645444342414039383736353433323130292827262524232221201918171615141312111009080706050403020100
in Index   Prev   Next

RFC 2445

Internet Calendaring and Scheduling Core Object Specification (iCalendar)

Pages: 148
Obsoleted by:  5545
Part 2 of 4 – Pages 32 to 73
First   Prev   Next

ToP   noToC   RFC2445 - Page 32   prevText
4.3 Property Value Data Types

   The properties in an iCalendar object are strongly typed. The
   definition of each property restricts the value to be one of the
   value data types, or simply value types, defined in this section. The
   value type for a property will either be specified implicitly as the
   default value type or will be explicitly specified with the "VALUE"
ToP   noToC   RFC2445 - Page 33
   parameter. If the value type of a property is one of the alternate
   valid types, then it MUST be explicitly specified with the "VALUE"
   parameter.

4.3.1   Binary

   Value Name: BINARY

   Purpose: This value type is used to identify properties that contain
   a character encoding of inline binary data. For example, an inline
   attachment of an object code might be included in an iCalendar
   object.

   Formal Definition: The value type is defined by the following
   notation:

     binary     = *(4b-char) [b-end]
     ; A "BASE64" encoded character string, as defined by [RFC 2045].

     b-end      = (2b-char "==") / (3b-char "=")

     b-char = ALPHA / DIGIT / "+" / "/"

   Description: Property values with this value type MUST also include
   the inline encoding parameter sequence of ";ENCODING=BASE64". That
   is, all inline binary data MUST first be character encoded using the
   "BASE64" encoding method defined in [RFC 2045]. No additional content
   value encoding (i.e., BACKSLASH character encoding) is defined for
   this value type.

   Example: The following is an abridged example of a "BASE64" encoded
   binary value data.

     ATTACH;VALUE=BINARY;ENCODING=BASE64:MIICajCCAdOgAwIBAgICBEUwDQY
      JKoZIhvcNAQEEBQAwdzELMAkGA1UEBhMCVVMxLDAqBgNVBAoTI05ldHNjYXBlI
      ENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uMRwwGgYDVQQLExNJbmZv
        <...remainder of "BASE64" encoded binary data...>

4.3.2   Boolean

   Value Name: BOOLEAN

   Purpose: This value type is used to identify properties that contain
   either a "TRUE" or "FALSE" Boolean value.

   Formal Definition: The value type is defined by the following
   notation:
ToP   noToC   RFC2445 - Page 34
     boolean    = "TRUE" / "FALSE"

   Description: These values are case insensitive text. No additional
   content value encoding (i.e., BACKSLASH character encoding) is
   defined for this value type.

   Example: The following is an example of a hypothetical property that
   has a BOOLEAN value type:

   GIBBERISH:TRUE

4.3.3   Calendar User Address

   Value Name: CAL-ADDRESS

   Purpose: This value type is used to identify properties that contain
   a calendar user address.

   Formal Definition: The value type is as defined by the following
   notation:

     cal-address        = uri

   Description: The value is a URI as defined by [RFC 1738] or any other
   IANA registered form for a URI. When used to address an Internet
   email transport address for a calendar user, the value MUST be a
   MAILTO URI, as defined by [RFC 1738]. No additional content value
   encoding (i.e., BACKSLASH character encoding) is defined for this
   value type.

   Example:

     ATTENDEE:MAILTO:jane_doe@host.com

4.3.4 Date

   Value Name: DATE

   Purpose: This value type is used to identify values that contain a
   calendar date.

   Formal Definition: The value type is defined by the following
   notation:

     date               = date-value

     date-value         = date-fullyear date-month date-mday
     date-fullyear      = 4DIGIT
ToP   noToC   RFC2445 - Page 35
     date-month         = 2DIGIT        ;01-12
     date-mday          = 2DIGIT        ;01-28, 01-29, 01-30, 01-31
                                        ;based on month/year

   Description: If the property permits, multiple "date" values are
   specified as a COMMA character (US-ASCII decimal 44) separated list
   of values. The format for the value type is expressed as the [ISO
   8601] complete representation, basic format for a calendar date. The
   textual format specifies a four-digit year, two-digit month, and
   two-digit day of the month. There are no separator characters between
   the year, month and day component text.

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

   Example: The following represents July 14, 1997:

     19970714

4.3.5   Date-Time

   Value Name: DATE-TIME

   Purpose: This value type is used to identify values that specify a
   precise calendar date and time of day.

   Formal Definition: The value type is defined by the following
   notation:

     date-time  = date "T" time ;As specified in the date and time
                                ;value definitions

   Description: If the property permits, multiple "date-time" values are
   specified as a COMMA character (US-ASCII decimal 44) separated list
   of values. No additional content value encoding (i.e., BACKSLASH
   character encoding) is defined for this value type.

   The "DATE-TIME" data type is used to identify values that contain a
   precise calendar date and time of day. The format is based on the
   [ISO 8601] complete representation, basic format for a calendar date
   and time of day. The text format is a concatenation of the "date",
   followed by the LATIN CAPITAL LETTER T character (US-ASCII decimal
   84) time designator, followed by the "time" format.

   The "DATE-TIME" data type expresses time values in three forms:

   The form of date and time with UTC offset MUST NOT be used. For
   example, the following is not valid for a date-time value:
ToP   noToC   RFC2445 - Page 36
     DTSTART:19980119T230000-0800       ;Invalid time format

   FORM #1: DATE WITH LOCAL TIME

   The date with local time form is simply a date-time value that does
   not contain the UTC designator nor does it reference a time zone. For
   example, the following represents Janurary 18, 1998, at 11 PM:

     DTSTART:19980118T230000

   Date-time values of this type are said to be "floating" and are not
   bound to any time zone in particular. They are used to represent the
   same hour, minute, and second value regardless of which time zone is
   currently being observed. For example, an event can be defined that
   indicates that an individual will be busy from 11:00 AM to 1:00 PM
   every day, no matter which time zone the person is in. In these
   cases, a local time can be specified. The recipient of an iCalendar
   object with a property value consisting of a local time, without any
   relative time zone information, SHOULD interpret the value as being
   fixed to whatever time zone the ATTENDEE is in at any given moment.
   This means that two ATTENDEEs, in different time zones, receiving the
   same event definition as a floating time, may be participating in the
   event at different actual times. Floating time SHOULD only be used
   where that is the reasonable behavior.

   In most cases, a fixed time is desired. To properly communicate a
   fixed time in a property value, either UTC time or local time with
   time zone reference MUST be specified.

   The use of local time in a DATE-TIME value without the TZID property
   parameter is to be interpreted as floating time, regardless of the
   existence of "VTIMEZONE" calendar components in the iCalendar object.

   FORM #2: DATE WITH UTC TIME

   The date with UTC time, or absolute time, is identified by a LATIN
   CAPITAL LETTER Z suffix character (US-ASCII decimal 90), the UTC
   designator, appended to the time value. For example, the following
   represents January 19, 1998, at 0700 UTC:

     DTSTART:19980119T070000Z

   The TZID property parameter MUST NOT be applied to DATE-TIME
   properties whose time values are specified in UTC.

   FORM #3: DATE WITH LOCAL TIME AND TIME ZONE REFERENCE
ToP   noToC   RFC2445 - Page 37
   The date and local time with reference to time zone information is
   identified by the use the TZID property parameter to reference the
   appropriate time zone definition. TZID is discussed in detail in the
   section on Time Zone. For example, the following represents 2 AM in
   New York on Janurary 19, 1998:

          DTSTART;TZID=US-Eastern:19980119T020000

   Example: The following represents July 14, 1997, at 1:30 PM in New
   York City in each of the three time formats, using the "DTSTART"
   property.

     DTSTART:19970714T133000            ;Local time
     DTSTART:19970714T173000Z           ;UTC time
     DTSTART;TZID=US-Eastern:19970714T133000    ;Local time and time
                        ; zone reference

   A time value MUST ONLY specify 60 seconds when specifying the
   periodic "leap second" in the time value. For example:

     COMPLETED:19970630T235960Z

4.3.6   Duration

   Value Name: DURATION

   Purpose: This value type is used to identify properties that contain
   a duration of time.

   Formal Definition: The value type is defined by the following
   notation:

     dur-value  = (["+"] / "-") "P" (dur-date / dur-time / dur-week)

     dur-date   = dur-day [dur-time]
     dur-time   = "T" (dur-hour / dur-minute / dur-second)
     dur-week   = 1*DIGIT "W"
     dur-hour   = 1*DIGIT "H" [dur-minute]
     dur-minute = 1*DIGIT "M" [dur-second]
     dur-second = 1*DIGIT "S"
     dur-day    = 1*DIGIT "D"

   Description: If the property permits, multiple "duration" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values. The format is expressed as the [ISO 8601] basic format for
   the duration of time. The format can represent durations in terms of
   weeks, days, hours, minutes, and seconds.
ToP   noToC   RFC2445 - Page 38
   No additional content value encoding (i.e., BACKSLASH character
   encoding) are defined for this value type.

   Example: A duration of 15 days, 5 hours and 20 seconds would be:

     P15DT5H0M20S

   A duration of 7 weeks would be:

     P7W

4.3.7   Float

   Value Name: FLOAT

   Purpose: This value type is used to identify properties that contain
   a real number value.

   Formal Definition: The value type is defined by the following
   notation:

     float      = (["+"] / "-") 1*DIGIT ["." 1*DIGIT]

   Description: If the property permits, multiple "float" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values.

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

   Example:

     1000000.0000001
     1.333
     -3.14

4.3.8 Integer

     Value Name:INTEGER

     Purpose: This value type is used to identify properties that contain
     a signed integer value.

     Formal Definition: The value type is defined by the following
     notation:

     integer    = (["+"] / "-") 1*DIGIT
ToP   noToC   RFC2445 - Page 39
     Description: If the property permits, multiple "integer" values are
     specified by a COMMA character (US-ASCII decimal 44) separated list
     of values. The valid range for "integer" is -2147483648 to
     2147483647. If the sign is not specified, then the value is assumed
     to be positive.

     No additional content value encoding (i.e., BACKSLASH character
     encoding) is defined for this value type.

     Example:

     1234567890
     -1234567890
     +1234567890
     432109876

4.3.9 Period of Time

   Value Name: PERIOD

   Purpose: This value type is used to identify values that contain a
   precise period of time.

   Formal Definition: The data type is defined by the following
   notation:

     period     = period-explicit / period-start

     period-explicit = date-time "/" date-time
     ; [ISO 8601] complete representation basic format for a period of
     ; time consisting of a start and end. The start MUST be before the
     ; end.

     period-start = date-time "/" dur-value
     ; [ISO 8601] complete representation basic format for a period of
     ; time consisting of a start and positive duration of time.

   Description: If the property permits, multiple "period" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values. There are two forms of a period of time. First, a period
   of time is identified by its start and its end. This format is
   expressed as the [ISO 8601] complete representation, basic format for
   "DATE-TIME" start of the period, followed by a SOLIDUS character
   (US-ASCII decimal 47), followed by the "DATE-TIME" of the end of the
   period. The start of the period MUST be before the end of the period.
   Second, a period of time can also be defined by a start and a
   positive duration of time. The format is expressed as the [ISO 8601]
   complete representation, basic format for the "DATE-TIME" start of
ToP   noToC   RFC2445 - Page 40
   the period, followed by a SOLIDUS character (US-ASCII decimal 47),
   followed by the [ISO 8601] basic format for "DURATION" of the period.

   Example: The period starting at 18:00:00 UTC, on January 1, 1997 and
   ending at 07:00:00 UTC on January 2, 1997 would be:

     19970101T180000Z/19970102T070000Z

   The period start at 18:00:00 on January 1, 1997 and lasting 5 hours
   and 30 minutes would be:

     19970101T180000Z/PT5H30M

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

4.3.10 Recurrence Rule

   Value Name: RECUR

   Purpose: This value type is used to identify properties that contain
   a recurrence rule specification.

   Formal Definition: The value type is defined by the following
   notation:

     recur      = "FREQ"=freq *(

                ; either UNTIL or COUNT may appear in a 'recur',
                ; but UNTIL and COUNT MUST NOT occur in the same 'recur'

                ( ";" "UNTIL" "=" enddate ) /
                ( ";" "COUNT" "=" 1*DIGIT ) /

                ; the rest of these keywords are optional,
                ; but MUST NOT occur more than once

                ( ";" "INTERVAL" "=" 1*DIGIT )          /
                ( ";" "BYSECOND" "=" byseclist )        /
                ( ";" "BYMINUTE" "=" byminlist )        /
                ( ";" "BYHOUR" "=" byhrlist )           /
                ( ";" "BYDAY" "=" bywdaylist )          /
                ( ";" "BYMONTHDAY" "=" bymodaylist )    /
                ( ";" "BYYEARDAY" "=" byyrdaylist )     /
                ( ";" "BYWEEKNO" "=" bywknolist )       /
                ( ";" "BYMONTH" "=" bymolist )          /
                ( ";" "BYSETPOS" "=" bysplist )         /
                ( ";" "WKST" "=" weekday )              /
ToP   noToC   RFC2445 - Page 41
                ( ";" x-name "=" text )
                )

     freq       = "SECONDLY" / "MINUTELY" / "HOURLY" / "DAILY"
                / "WEEKLY" / "MONTHLY" / "YEARLY"

     enddate    = date
     enddate    =/ date-time            ;An UTC value

     byseclist  = seconds / ( seconds *("," seconds) )

     seconds    = 1DIGIT / 2DIGIT       ;0 to 59

     byminlist  = minutes / ( minutes *("," minutes) )

     minutes    = 1DIGIT / 2DIGIT       ;0 to 59

     byhrlist   = hour / ( hour *("," hour) )

     hour       = 1DIGIT / 2DIGIT       ;0 to 23

     bywdaylist = weekdaynum / ( weekdaynum *("," weekdaynum) )

     weekdaynum = [([plus] ordwk / minus ordwk)] weekday

     plus       = "+"

     minus      = "-"

     ordwk      = 1DIGIT / 2DIGIT       ;1 to 53

     weekday    = "SU" / "MO" / "TU" / "WE" / "TH" / "FR" / "SA"
     ;Corresponding to SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
     ;FRIDAY, SATURDAY and SUNDAY days of the week.

     bymodaylist = monthdaynum / ( monthdaynum *("," monthdaynum) )

     monthdaynum = ([plus] ordmoday) / (minus ordmoday)

     ordmoday   = 1DIGIT / 2DIGIT       ;1 to 31

     byyrdaylist = yeardaynum / ( yeardaynum *("," yeardaynum) )

     yeardaynum = ([plus] ordyrday) / (minus ordyrday)

     ordyrday   = 1DIGIT / 2DIGIT / 3DIGIT      ;1 to 366

     bywknolist = weeknum / ( weeknum *("," weeknum) )
ToP   noToC   RFC2445 - Page 42
     weeknum    = ([plus] ordwk) / (minus ordwk)

     bymolist   = monthnum / ( monthnum *("," monthnum) )

     monthnum   = 1DIGIT / 2DIGIT       ;1 to 12

     bysplist   = setposday / ( setposday *("," setposday) )

     setposday  = yeardaynum

   Description: If the property permits, multiple "recur" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values. The value type is a structured value consisting of a list
   of one or more recurrence grammar parts. Each rule part is defined by
   a NAME=VALUE pair. The rule parts are separated from each other by
   the SEMICOLON character (US-ASCII decimal 59). The rule parts are not
   ordered in any particular sequence. Individual rule parts MUST only
   be specified once.

   The FREQ rule part identifies the type of recurrence rule. This rule
   part MUST be specified in the recurrence rule. Valid values include
   SECONDLY, to specify repeating events based on an interval of a
   second or more; MINUTELY, to specify repeating events based on an
   interval of a minute or more; HOURLY, to specify repeating events
   based on an interval of an hour or more; DAILY, to specify repeating
   events based on an interval of a day or more; WEEKLY, to specify
   repeating events based on an interval of a week or more; MONTHLY, to
   specify repeating events based on an interval of a month or more; and
   YEARLY, to specify repeating events based on an interval of a year or
   more.

   The INTERVAL rule part contains a positive integer representing how
   often the recurrence rule repeats. The default value is "1", meaning
   every second for a SECONDLY rule, or every minute for a MINUTELY
   rule, every hour for an HOURLY rule, every day for a DAILY rule,
   every week for a WEEKLY rule, every month for a MONTHLY rule and
   every year for a YEARLY rule.

   The UNTIL rule part defines a date-time value which bounds the
   recurrence rule in an inclusive manner. If the value specified by
   UNTIL is synchronized with the specified recurrence, this date or
   date-time becomes the last instance of the recurrence. If specified
   as a date-time value, then it MUST be specified in an UTC time
   format. If not present, and the COUNT rule part is also not present,
   the RRULE is considered to repeat forever.

   The COUNT rule part defines the number of occurrences at which to
   range-bound the recurrence. The "DTSTART" property value, if
ToP   noToC   RFC2445 - Page 43
   specified, counts as the first occurrence.

   The BYSECOND rule part specifies a COMMA character (US-ASCII decimal
   44) separated list of seconds within a minute. Valid values are 0 to
   59. The BYMINUTE rule part specifies a COMMA character (US-ASCII
   decimal 44) separated list of minutes within an hour. Valid values
   are 0 to 59. The BYHOUR rule part specifies a COMMA character (US-
   ASCII decimal 44) separated list of hours of the day. Valid values
   are 0 to 23.

   The BYDAY rule part specifies a COMMA character (US-ASCII decimal 44)
   separated list of days of the week; MO indicates Monday; TU indicates
   Tuesday; WE indicates Wednesday; TH indicates Thursday; FR indicates
   Friday; SA indicates Saturday; SU indicates Sunday.

   Each BYDAY value can also be preceded by a positive (+n) or negative
   (-n) integer. If present, this indicates the nth occurrence of the
   specific day within the MONTHLY or YEARLY RRULE. For example, within
   a MONTHLY rule, +1MO (or simply 1MO) represents the first Monday
   within the month, whereas -1MO represents the last Monday of the
   month. If an integer modifier is not present, it means all days of
   this type within the specified frequency. For example, within a
   MONTHLY rule, MO represents all Mondays within the month.

   The BYMONTHDAY rule part specifies a COMMA character (ASCII decimal
   44) separated list of days of the month. Valid values are 1 to 31 or
   -31 to -1. For example, -10 represents the tenth to the last day of
   the month.

   The BYYEARDAY rule part specifies a COMMA character (US-ASCII decimal
   44) separated list of days of the year. Valid values are 1 to 366 or
   -366 to -1. For example, -1 represents the last day of the year
   (December 31st) and -306 represents the 306th to the last day of the
   year (March 1st).

   The BYWEEKNO rule part specifies a COMMA character (US-ASCII decimal
   44) separated list of ordinals specifying weeks of the year. Valid
   values are 1 to 53 or -53 to -1. This corresponds to weeks according
   to week numbering as defined in [ISO 8601]. A week is defined as a
   seven day period, starting on the day of the week defined to be the
   week start (see WKST). Week number one of the calendar year is the
   first week which contains at least four (4) days in that calendar
   year. This rule part is only valid for YEARLY rules. For example, 3
   represents the third week of the year.

        Note: Assuming a Monday week start, week 53 can only occur when
        Thursday is January 1 or if it is a leap year and Wednesday is
        January 1.
ToP   noToC   RFC2445 - Page 44
   The BYMONTH rule part specifies a COMMA character (US-ASCII decimal
   44) separated list of months of the year. Valid values are 1 to 12.

   The WKST rule part specifies the day on which the workweek starts.
   Valid values are MO, TU, WE, TH, FR, SA and SU. This is significant
   when a WEEKLY RRULE has an interval greater than 1, and a BYDAY rule
   part is specified. This is also significant when in a YEARLY RRULE
   when a BYWEEKNO rule part is specified. The default value is MO.

   The BYSETPOS rule part specifies a COMMA character (US-ASCII decimal
   44) separated list of values which corresponds to the nth occurrence
   within the set of events specified by the rule. Valid values are 1 to
   366 or -366 to -1. It MUST only be used in conjunction with another
   BYxxx rule part. For example "the last work day of the month" could
   be represented as:

     RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-1

   Each BYSETPOS value can include a positive (+n) or negative (-n)
   integer. If present, this indicates the nth occurrence of the
   specific occurrence within the set of events specified by the rule.

   If BYxxx rule part values are found which are beyond the available
   scope (ie, BYMONTHDAY=30 in February), they are simply ignored.

   Information, not contained in the rule, necessary to determine the
   various recurrence instance start time and dates are derived from the
   Start Time (DTSTART) entry attribute. For example,
   "FREQ=YEARLY;BYMONTH=1" doesn't specify a specific day within the
   month or a time. This information would be the same as what is
   specified for DTSTART.

   BYxxx rule parts modify the recurrence in some manner. BYxxx rule
   parts for a period of time which is the same or greater than the
   frequency generally reduce or limit the number of occurrences of the
   recurrence generated. For example, "FREQ=DAILY;BYMONTH=1" reduces the
   number of recurrence instances from all days (if BYMONTH tag is not
   present) to all days in January. BYxxx rule parts for a period of
   time less than the frequency generally increase or expand the number
   of occurrences of the recurrence. For example,
   "FREQ=YEARLY;BYMONTH=1,2" increases the number of days within the
   yearly recurrence set from 1 (if BYMONTH tag is not present) to 2.

   If multiple BYxxx rule parts are specified, then after evaluating the
   specified FREQ and INTERVAL rule parts, the BYxxx rule parts are
   applied to the current set of evaluated occurrences in the following
   order: BYMONTH, BYWEEKNO, BYYEARDAY, BYMONTHDAY, BYDAY, BYHOUR,
   BYMINUTE, BYSECOND and BYSETPOS; then COUNT and UNTIL are evaluated.
ToP   noToC   RFC2445 - Page 45
   Here is an example of evaluating multiple BYxxx rule parts.

     DTSTART;TZID=US-Eastern:19970105T083000
     RRULE:FREQ=YEARLY;INTERVAL=2;BYMONTH=1;BYDAY=SU;BYHOUR=8,9;
      BYMINUTE=30

   First, the "INTERVAL=2" would be applied to "FREQ=YEARLY" to arrive
   at "every other year". Then, "BYMONTH=1" would be applied to arrive
   at "every January, every other year". Then, "BYDAY=SU" would be
   applied to arrive at "every Sunday in January, every other year".
   Then, "BYHOUR=8,9" would be applied to arrive at "every Sunday in
   January at 8 AM and 9 AM, every other year". Then, "BYMINUTE=30"
   would be applied to arrive at "every Sunday in January at 8:30 AM and
   9:30 AM, every other year". Then, lacking information from RRULE, the
   second is derived from DTSTART, to end up in "every Sunday in January
   at 8:30:00 AM and 9:30:00 AM, every other year". Similarly, if the
   BYMINUTE, BYHOUR, BYDAY, BYMONTHDAY or BYMONTH rule part were
   missing, the appropriate minute, hour, day or month would have been
   retrieved from the "DTSTART" property.

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

   Example: The following is a rule which specifies 10 meetings which
   occur every other day:

     FREQ=DAILY;COUNT=10;INTERVAL=2

   There are other examples specified in the "RRULE" specification.

4.3.11 Text

   Value Name: TEXT

   Purpose This value type is used to identify values that contain human
   readable text.

   Formal Definition: The character sets supported by this revision of
   iCalendar are UTF-8 and US ASCII thereof. The applicability to other
   character sets is for future work. The value type is defined by the
   following notation.

     text       = *(TSAFE-CHAR / ":" / DQUOTE / ESCAPED-CHAR)
     ; Folded according to description above

     ESCAPED-CHAR = "\\" / "\;" / "\," / "\N" / "\n")
        ; \\ encodes \, \N or \n encodes newline
        ; \; encodes ;, \, encodes ,
ToP   noToC   RFC2445 - Page 46
     TSAFE-CHAR = %x20-21 / %x23-2B / %x2D-39 / %x3C-5B
                  %x5D-7E / NON-US-ASCII
        ; Any character except CTLs not needed by the current
        ; character set, DQUOTE, ";", ":", "\", ","

     Note: Certain other character sets may require modification of the
     above definitions, but this is beyond the scope of this document.

   Description: If the property permits, multiple "text" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values.

   The language in which the text is represented can be controlled by
   the "LANGUAGE" property parameter.

   An intentional formatted text line break MUST only be included in a
   "TEXT" property value by representing the line break with the
   character sequence of BACKSLASH (US-ASCII decimal 92), followed by a
   LATIN SMALL LETTER N (US-ASCII decimal 110) or a LATIN CAPITAL LETTER
   N (US-ASCII decimal 78), that is "\n" or "\N".

   The "TEXT" property values may also contain special characters that
   are used to signify delimiters, such as a COMMA character for lists
   of values or a SEMICOLON character for structured values. In order to
   support the inclusion of these special characters in "TEXT" property
   values, they MUST be escaped with a BACKSLASH character. A BACKSLASH
   character (US-ASCII decimal 92) in a "TEXT" property value MUST be
   escaped with another BACKSLASH character. A COMMA character in a
   "TEXT" property value MUST be escaped with a BACKSLASH character
   (US-ASCII decimal 92). A SEMICOLON character in a "TEXT" property
   value MUST be escaped with a BACKSLASH character (US-ASCII decimal
   92).  However, a COLON character in a "TEXT" property value SHALL NOT
   be escaped with a BACKSLASH character.Example: A multiple line value
   of:

     Project XYZ Final Review
     Conference Room - 3B
     Come Prepared.

   would be represented as:

     Project XYZ Final Review\nConference Room - 3B\nCome Prepared.
ToP   noToC   RFC2445 - Page 47
4.3.12 Time

   Value Name: TIME

   Purpose: This value type is used to identify values that contain a
   time of day.

   Formal Definition: The data type is defined by the following
   notation:

     time               = time-hour time-minute time-second [time-utc]

     time-hour          = 2DIGIT        ;00-23
     time-minute        = 2DIGIT        ;00-59
     time-second        = 2DIGIT        ;00-60
     ;The "60" value is used to account for "leap" seconds.

     time-utc   = "Z"

   Description: If the property permits, multiple "time" values are
   specified by a COMMA character (US-ASCII decimal 44) separated list
   of values. No additional content value encoding (i.e., BACKSLASH
   character encoding) is defined for this value type.

   The "TIME" data type is used to identify values that contain a time
   of day. The format is based on the [ISO 8601] complete
   representation, basic format for a time of day. The text format
   consists of a two-digit 24-hour of the day (i.e., values 0-23), two-
   digit minute in the hour (i.e., values 0-59), and two-digit seconds
   in the minute (i.e., values 0-60). The seconds value of 60 MUST only
   to be used to account for "leap" seconds. Fractions of a second are
   not supported by this format.

   In parallel to the "DATE-TIME" definition above, the "TIME" data type
   expresses time values in three forms:

   The form of time with UTC offset MUST NOT be used. For example, the
   following is NOT VALID for a time value:

     230000-0800        ;Invalid time format

   FORM #1 LOCAL TIME

   The local time form is simply a time value that does not contain the
   UTC designator nor does it reference a time zone. For example, 11:00
   PM:

     230000
ToP   noToC   RFC2445 - Page 48
   Time values of this type are said to be "floating" and are not bound
   to any time zone in particular. They are used to represent the same
   hour, minute, and second value regardless of which time zone is
   currently being observed. For example, an event can be defined that
   indicates that an individual will be busy from 11:00 AM to 1:00 PM
   every day, no matter which time zone the person is in. In these
   cases, a local time can be specified. The recipient of an iCalendar
   object with a property value consisting of a local time, without any
   relative time zone information, SHOULD interpret the value as being
   fixed to whatever time zone the ATTENDEE is in at any given moment.
   This means that two ATTENDEEs may participate in the same event at
   different UTC times; floating time SHOULD only be used where that is
   reasonable behavior.

   In most cases, a fixed time is desired. To properly communicate a
   fixed time in a property value, either UTC time or local time with
   time zone reference MUST be specified.

   The use of local time in a TIME value without the TZID property
   parameter is to be interpreted as a local time value, regardless of
   the existence of "VTIMEZONE" calendar components in the iCalendar
   object.

   FORM #2: UTC TIME

   UTC time, or absolute time, is identified by a LATIN CAPITAL LETTER Z
   suffix character (US-ASCII decimal 90), the UTC designator, appended
   to the time value. For example, the following represents 07:00 AM
   UTC:

     070000Z

   The TZID property parameter MUST NOT be applied to TIME properties
   whose time values are specified in UTC.

   FORM #3: LOCAL TIME AND TIME ZONE REFERENCE

   The local time with reference to time zone information form is
   identified by the use the TZID property parameter to reference the
   appropriate time zone definition. TZID is discussed in detail in the
   section on Time Zone.

   Example: The following represents 8:30 AM in New York in Winter, five
   hours behind UTC, in each of the three formats using the "X-
   TIMEOFDAY" non-standard property:
ToP   noToC   RFC2445 - Page 49
     X-TIMEOFDAY:083000

     X-TIMEOFDAY:133000Z

     X-TIMEOFDAY;TZID=US-Eastern:083000

4.3.13 URI

   Value Name: URI

   Purpose: This value type is used to identify values that contain a
   uniform resource identifier (URI) type of reference to the property
   value.

   Formal Definition: The data type is defined by the following
   notation:

     uri        = <As defined by any IETF RFC>

   Description: This data type might be used to reference binary
   information, for values that are large, or otherwise undesirable to
   include directly in the iCalendar object.

   The URI value formats in RFC 1738, RFC 2111 and any other IETF
   registered value format can be specified.

   Any IANA registered URI format can be used. These include, but are
   not limited to, those defined in RFC 1738 and RFC 2111.

   When a property parameter value is a URI value type, the URI MUST be
   specified as a quoted-string value.

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

   Example: The following is a URI for a network file:

     http://host1.com/my-report.txt

4.3.14 UTC Offset

   Value Name: UTC-OFFSET

   Purpose: This value type is used to identify properties that contain
   an offset from UTC to local time.

   Formal Definition: The data type is defined by the following
   notation:
ToP   noToC   RFC2445 - Page 50
     utc-offset = time-numzone  ;As defined above in time data type

     time-numzone       = ("+" / "-") time-hour time-minute [time-
     second]

   Description: The PLUS SIGN character MUST be specified for positive
   UTC offsets (i.e., ahead of UTC). The value of "-0000" and "-000000"
   are not allowed. The time-second, if present, may not be 60; if
   absent, it defaults to zero.

   No additional content value encoding (i.e., BACKSLASH character
   encoding) is defined for this value type.

   Example: The following UTC offsets are given for standard time for
   New York (five hours behind UTC) and Geneva (one hour ahead of UTC):

     -0500

     +0100

4.4 iCalendar Object

   The Calendaring and Scheduling Core Object is a collection of
   calendaring and scheduling information. Typically, this information
   will consist of a single iCalendar object. However, multiple
   iCalendar objects can be sequentially grouped together. The first
   line and last line of the iCalendar object MUST contain a pair of
   iCalendar object delimiter strings. The syntax for an iCalendar
   object is as follows:

     icalobject = 1*("BEGIN" ":" "VCALENDAR" CRLF
                  icalbody
                  "END" ":" "VCALENDAR" CRLF)

   The following is a simple example of an iCalendar object:

     BEGIN:VCALENDAR
     VERSION:2.0
     PRODID:-//hacksw/handcal//NONSGML v1.0//EN
     BEGIN:VEVENT
     DTSTART:19970714T170000Z
     DTEND:19970715T035959Z
     SUMMARY:Bastille Day Party
     END:VEVENT
     END:VCALENDAR
ToP   noToC   RFC2445 - Page 51
4.5 Property

   A property is the definition of an individual attribute describing a
   calendar or a calendar component. A property takes the form defined
   by the "contentline" notation defined in section 4.1.1.

   The following is an example of a property:

     DTSTART:19960415T133000Z

   This memo imposes no ordering of properties within an iCalendar
   object.

   Property names, parameter names and enumerated parameter values are
   case insensitive. For example, the property name "DUE" is the same as
   "due" and "Due", DTSTART;TZID=US-Eastern:19980714T120000 is the same
   as DtStart;TzID=US-Eastern:19980714T120000.

4.6 Calendar Components

   The body of the iCalendar object consists of a sequence of calendar
   properties and one or more calendar components. The calendar
   properties are attributes that apply to the calendar as a whole. The
   calendar components are collections of properties that express a
   particular calendar semantic. For example, the calendar component can
   specify an event, a to-do, a journal entry, time zone information, or
   free/busy time information, or an alarm.

   The body of the iCalendar object is defined by the following
   notation:

     icalbody   = calprops component

     calprops   = 2*(

                ; 'prodid' and 'version' are both REQUIRED,
                ; but MUST NOT occur more than once

                prodid /version /

                ; 'calscale' and 'method' are optional,
                ; but MUST NOT occur more than once

                calscale        /
                method          /

                x-prop
ToP   noToC   RFC2445 - Page 52
                )

     component  = 1*(eventc / todoc / journalc / freebusyc /
                / timezonec / iana-comp / x-comp)

     iana-comp  = "BEGIN" ":" iana-token CRLF

                  1*contentline

                  "END" ":" iana-token CRLF

     x-comp     = "BEGIN" ":" x-name CRLF

                  1*contentline

                  "END" ":" x-name CRLF

   An iCalendar object MUST include the "PRODID" and "VERSION" calendar
   properties. In addition, it MUST include at least one calendar
   component. Special forms of iCalendar objects are possible to publish
   just busy time (i.e., only a "VFREEBUSY" calendar component) or time
   zone (i.e., only a "VTIMEZONE" calendar component) information. In
   addition, a complex iCalendar object is possible that is used to
   capture a complete snapshot of the contents of a calendar (e.g.,
   composite of many different calendar components). More commonly, an
   iCalendar object will consist of just a single "VEVENT", "VTODO" or
   "VJOURNAL" calendar component.

4.6.1 Event Component

   Component Name: "VEVENT"

   Purpose: Provide a grouping of component properties that describe an
   event.

   Format Definition: A "VEVENT" calendar component is defined by the
   following notation:

     eventc     = "BEGIN" ":" "VEVENT" CRLF
                  eventprop *alarmc
                  "END" ":" "VEVENT" CRLF

     eventprop  = *(

                ; the following are optional,
                ; but MUST NOT occur more than once

                class / created / description / dtstart / geo /
ToP   noToC   RFC2445 - Page 53
                last-mod / location / organizer / priority /
                dtstamp / seq / status / summary / transp /
                uid / url / recurid /

                ; either 'dtend' or 'duration' may appear in
                ; a 'eventprop', but 'dtend' and 'duration'
                ; MUST NOT occur in the same 'eventprop'

                dtend / duration /

                ; the following are optional,
                ; and MAY occur more than once

                attach / attendee / categories / comment /
                contact / exdate / exrule / rstatus / related /
                resources / rdate / rrule / x-prop

                )

   Description: A "VEVENT" calendar component is a grouping of component
   properties, and possibly including "VALARM" calendar components, that
   represents a scheduled amount of time on a calendar. For example, it
   can be an activity; such as a one-hour long, department meeting from
   8:00 AM to 9:00 AM, tomorrow. Generally, an event will take up time
   on an individual calendar. Hence, the event will appear as an opaque
   interval in a search for busy time. Alternately, the event can have
   its Time Transparency set to "TRANSPARENT" in order to prevent
   blocking of the event in searches for busy time.

   The "VEVENT" is also the calendar component used to specify an
   anniversary or daily reminder within a calendar. These events have a
   DATE value type for the "DTSTART" property instead of the default
   data type of DATE-TIME. If such a "VEVENT" has a "DTEND" property, it
   MUST be specified as a DATE value also. The anniversary type of
   "VEVENT" can span more than one date (i.e, "DTEND" property value is
   set to a calendar date after the "DTSTART" property value).

   The "DTSTART" property for a "VEVENT" specifies the inclusive start
   of the event. For recurring events, it also specifies the very first
   instance in the recurrence set. The "DTEND" property for a "VEVENT"
   calendar component specifies the non-inclusive end of the event. For
   cases where a "VEVENT" calendar component specifies a "DTSTART"
   property with a DATE data type but no "DTEND" property, the events
   non-inclusive end is the end of the calendar date specified by the
   "DTSTART" property. For cases where a "VEVENT" calendar component
   specifies a "DTSTART" property with a DATE-TIME data type but no
   "DTEND" property, the event ends on the same calendar date and time
   of day specified by the "DTSTART" property.
ToP   noToC   RFC2445 - Page 54
   The "VEVENT" calendar component cannot be nested within another
   calendar component. However, "VEVENT" calendar components can be
   related to each other or to a "VTODO" or to a "VJOURNAL" calendar
   component with the "RELATED-TO" property.

   Example: The following is an example of the "VEVENT" calendar
   component used to represent a meeting that will also be opaque to
   searches for busy time:

     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

   The following is an example of the "VEVENT" calendar component used
   to represent a reminder that will not be opaque, but rather
   transparent, to searches for busy time:

     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

   The following is an example of the "VEVENT" calendar component used
   to represent an anniversary that will occur annually. Since it takes
   up no time, it will not appear as opaque in a search for busy time;
   no matter what the value of the "TRANSP" property indicates:

     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
ToP   noToC   RFC2445 - Page 55
4.6.2 To-do Component

   Component Name: VTODO

   Purpose: Provide a grouping of calendar properties that describe a
   to-do.

   Formal Definition: A "VTODO" calendar component is defined by the
   following notation:

     todoc      = "BEGIN" ":" "VTODO" CRLF
                  todoprop *alarmc
                  "END" ":" "VTODO" CRLF

     todoprop   = *(

                ; the following are optional,
                ; but MUST NOT occur more than once

                class / completed / created / description / dtstamp /
                dtstart / geo / last-mod / location / organizer /
                percent / priority / recurid / seq / status /
                summary / uid / url /

                ; either 'due' or 'duration' may appear in
                ; a 'todoprop', but 'due' and 'duration'
                ; MUST NOT occur in the same 'todoprop'

                due / duration /

                ; the following are optional,
                ; and MAY occur more than once
                attach / attendee / categories / comment / contact /
                exdate / exrule / rstatus / related / resources /
                rdate / rrule / x-prop

                )

   Description: A "VTODO" calendar component is a grouping of component
   properties and possibly "VALARM" calendar components that represent
   an action-item or assignment. For example, it can be used to
   represent an item of work assigned to an individual; such as "turn in
   travel expense today".

   The "VTODO" calendar component cannot be nested within another
   calendar component. However, "VTODO" calendar components can be
   related to each other or to a "VTODO" or to a "VJOURNAL" calendar
   component with the "RELATED-TO" property.
ToP   noToC   RFC2445 - Page 56
   A "VTODO" calendar component without the "DTSTART" and "DUE" (or
   "DURATION") properties specifies a to-do that will be associated with
   each successive calendar date, until it is completed.

   Example: The following is an example of a "VTODO" calendar component:

     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

4.6.3 Journal Component

   Component Name: VJOURNAL

   Purpose: Provide a grouping of component properties that describe a
   journal entry.

   Formal Definition: A "VJOURNAL" calendar component is defined by the
   following notation:

     journalc   = "BEGIN" ":" "VJOURNAL" CRLF
                  jourprop
                  "END" ":" "VJOURNAL" CRLF

     jourprop   = *(

                ; the following are optional,
                ; but MUST NOT occur more than once

                class / created / description / dtstart / dtstamp /
                last-mod / organizer / recurid / seq / status /
                summary / uid / url /

                ; the following are optional,
                ; and MAY occur more than once

                attach / attendee / categories / comment /
                contact / exdate / exrule / related / rdate /
                rrule / rstatus / x-prop
ToP   noToC   RFC2445 - Page 57
                )

   Description: A "VJOURNAL" calendar component is a grouping of
   component properties that represent one or more descriptive text
   notes associated with a particular calendar date. The "DTSTART"
   property is used to specify the calendar date that the journal entry
   is associated with. Generally, it will have a DATE value data type,
   but it can also be used to specify a DATE-TIME value data type.
   Examples of a journal entry include a daily record of a legislative
   body or a journal entry of individual telephone contacts for the day
   or an ordered list of accomplishments for the day. The "VJOURNAL"
   calendar component can also be used to associate a document with a
   calendar date.

   The "VJOURNAL" calendar component does not take up time on a
   calendar. Hence, it does not play a role in free or busy time
   searches - - it is as though it has a time transparency value of
   TRANSPARENT. It is transparent to any such searches.

   The "VJOURNAL" calendar component cannot be nested within another
   calendar component. However, "VJOURNAL" calendar components can be
   related to each other or to a "VEVENT" or to a "VTODO" calendar
   component, with the "RELATED-TO" property.

   Example: The following is an example of the "VJOURNAL" calendar
   component:

     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
ToP   noToC   RFC2445 - Page 58
4.6.4 Free/Busy Component

   Component Name: VFREEBUSY

   Purpose: Provide a grouping of component properties that describe
   either a request for free/busy time, describe a response to a request
   for free/busy time or describe a published set of busy time.

   Formal Definition: A "VFREEBUSY" calendar component is defined by the
   following notation:

     freebusyc  = "BEGIN" ":" "VFREEBUSY" CRLF
                  fbprop
                  "END" ":" "VFREEBUSY" CRLF

     fbprop     = *(

                ; the following are optional,
                ; but MUST NOT occur more than once

                contact / dtstart / dtend / duration / dtstamp /
                organizer / uid / url /

                ; the following are optional,
                ; and MAY occur more than once

                attendee / comment / freebusy / rstatus / x-prop

                )

   Description: A "VFREEBUSY" calendar component is a grouping of
   component properties that represents either a request for, a reply to
   a request for free or busy time information or a published set of
   busy time information.

   When used to request free/busy time information, the "ATTENDEE"
   property specifies the calendar users whose free/busy time is being
   requested; the "ORGANIZER" property specifies the calendar user who
   is requesting the free/busy time; the "DTSTART" and "DTEND"
   properties specify the window of time for which the free/busy time is
   being requested; the "UID" and "DTSTAMP" properties are specified to
   assist in proper sequencing of multiple free/busy time requests.

   When used to reply to a request for free/busy time, the "ATTENDEE"
   property specifies the calendar user responding to the free/busy time
   request; the "ORGANIZER" property specifies the calendar user that
   originally requested the free/busy time; the "FREEBUSY" property
   specifies the free/busy time information (if it exists); and the
ToP   noToC   RFC2445 - Page 59
   "UID" and "DTSTAMP" properties are specified to assist in proper
   sequencing of multiple free/busy time replies.

   When used to publish busy time, the "ORGANIZER" property specifies
   the calendar user associated with the published busy time; the
   "DTSTART" and "DTEND" properties specify an inclusive time window
   that surrounds the busy time information; the "FREEBUSY" property
   specifies the published busy time information; and the "DTSTAMP"
   property specifies the date/time that iCalendar object was created.

   The "VFREEBUSY" calendar component cannot be nested within another
   calendar component. Multiple "VFREEBUSY" calendar components can be
   specified within an iCalendar object. This permits the grouping of
   Free/Busy information into logical collections, such as monthly
   groups of busy time information.

   The "VFREEBUSY" calendar component is intended for use in iCalendar
   object methods involving requests for free time, requests for busy
   time, requests for both free and busy, and the associated replies.

   Free/Busy information is represented with the "FREEBUSY" property.
   This property provides a terse representation of time periods. One or
   more "FREEBUSY" properties can be specified in the "VFREEBUSY"
   calendar component.

   When present in a "VFREEBUSY" calendar component, the "DTSTART" and
   "DTEND" properties SHOULD be specified prior to any "FREEBUSY"
   properties. In a free time request, these properties can be used in
   combination with the "DURATION" property to represent a request for a
   duration of free time within a specified window of time.

   The recurrence properties ("RRULE", "EXRULE", "RDATE", "EXDATE") are
   not permitted within a "VFREEBUSY" calendar component. Any recurring
   events are resolved into their individual busy time periods using the
   "FREEBUSY" property.

   Example: The following is an example of a "VFREEBUSY" calendar
   component used to request free or busy time information:

     BEGIN:VFREEBUSY
     ORGANIZER:MAILTO:jane_doe@host1.com
     ATTENDEE:MAILTO:john_public@host2.com
     DTSTART:19971015T050000Z
     DTEND:19971016T050000Z
     DTSTAMP:19970901T083000Z
     END:VFREEBUSY
ToP   noToC   RFC2445 - Page 60
   The following is an example of a "VFREEBUSY" calendar component used
   to reply to the request with busy time information:

     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

   The following is an example of a "VFREEBUSY" calendar component used
   to publish busy time information.

     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

4.6.5 Time Zone Component

   Component Name: VTIMEZONE

   Purpose: Provide a grouping of component properties that defines a
   time zone.

   Formal Definition: A "VTIMEZONE" calendar component is defined by the
   following notation:

     timezonec  = "BEGIN" ":" "VTIMEZONE" CRLF

                  2*(

                  ; 'tzid' is required, but MUST NOT occur more
                  ; than once

                tzid /

                  ; 'last-mod' and 'tzurl' are optional,
                but MUST NOT occur more than once
ToP   noToC   RFC2445 - Page 61
                last-mod / tzurl /

                  ; one of 'standardc' or 'daylightc' MUST occur
                ..; and each MAY occur more than once.

                standardc / daylightc /

                ; the following is optional,
                ; and MAY occur more than once

                  x-prop

                  )

                  "END" ":" "VTIMEZONE" CRLF

     standardc  = "BEGIN" ":" "STANDARD" CRLF

                  tzprop

                  "END" ":" "STANDARD" CRLF

     daylightc  = "BEGIN" ":" "DAYLIGHT" CRLF

                  tzprop

                  "END" ":" "DAYLIGHT" CRLF

     tzprop     = 3*(

                ; the following are each REQUIRED,
                ; but MUST NOT occur more than once

                dtstart / tzoffsetto / tzoffsetfrom /

                ; the following are optional,
                ; and MAY occur more than once

                comment / rdate / rrule / tzname / x-prop

                )

   Description: A time zone is unambiguously defined by the set of time
   measurement rules determined by the governing body for a given
   geographic area. These rules describe at a minimum the base  offset
   from UTC for the time zone, often referred to as the Standard Time
   offset. Many locations adjust their Standard Time forward or backward
   by one hour, in order to accommodate seasonal changes in number of
ToP   noToC   RFC2445 - Page 62
   daylight hours, often referred to as Daylight  Saving Time. Some
   locations adjust their time by a fraction of an hour. Standard Time
   is also known as Winter Time. Daylight Saving Time is also known as
   Advanced Time, Summer Time, or Legal Time in certain countries. The
   following table shows the changes in time zone rules in effect for
   New York City starting from 1967. Each line represents a description
   or rule for a particular observance.

     Effective Observance Rule

     Date       (Date/Time)             Offset  Abbreviation

     1967-*     last Sun in Oct, 02:00  -0500   EST

     1967-1973  last Sun in Apr, 02:00  -0400   EDT

     1974-1974  Jan 6,  02:00           -0400   EDT

     1975-1975  Feb 23, 02:00           -0400   EDT

     1976-1986  last Sun in Apr, 02:00  -0400   EDT

     1987-*     first Sun in Apr, 02:00 -0400   EDT

        Note: The specification of a global time zone registry is not
        addressed by this document and is left for future study.
        However, implementers may find the Olson time zone database [TZ]
        a useful reference. It is an informal, public-domain collection
        of time zone information, which is currently being maintained by
        volunteer Internet participants, and is used in several
        operating systems. This database contains current and historical
        time zone information for a wide variety of locations around the
        globe; it provides a time zone identifier for every unique time
        zone rule set in actual use since 1970, with historical data
        going back to the introduction of standard time.

   Interoperability between two calendaring and scheduling applications,
   especially for recurring events, to-dos or journal entries, is
   dependent on the ability to capture and convey date and time
   information in an unambiguous format. The specification of current
   time zone information is integral to this behavior.

   If present, the "VTIMEZONE" calendar component defines the set of
   Standard Time and Daylight Saving Time observances (or rules) for a
   particular time zone for a given interval of time. The "VTIMEZONE"
   calendar component cannot be nested within other calendar components.
   Multiple "VTIMEZONE" calendar components can exist in an iCalendar
   object. In this situation, each "VTIMEZONE" MUST represent a unique
ToP   noToC   RFC2445 - Page 63
   time zone definition. This is necessary for some classes of events,
   such as airline flights, that start in one time zone and end in
   another.

   The "VTIMEZONE" calendar component MUST be present if the iCalendar
   object contains an RRULE that generates dates on both sides of a time
   zone shift (e.g. both in Standard Time and Daylight Saving Time)
   unless the iCalendar object intends to convey a floating time (See
   the section "4.1.10.11 Time" for proper interpretation of floating
   time). It can be present if the iCalendar object does not contain
   such a RRULE. In addition, if a RRULE is present, there MUST be valid
   time zone information for all recurrence instances.

   The "VTIMEZONE" calendar component MUST include the "TZID" property
   and at least one definition of a standard or daylight component. The
   standard or daylight component MUST include the "DTSTART",
   "TZOFFSETFROM" and "TZOFFSETTO" properties.

   An individual "VTIMEZONE" calendar component MUST be specified for
   each unique "TZID" parameter value specified in the iCalendar object.

   Each "VTIMEZONE" calendar component consists of a collection of one
   or more sub-components that describe the rule for a particular
   observance (either a Standard Time or a Daylight Saving Time
   observance). The "STANDARD" sub-component consists of a collection of
   properties that describe Standard Time. The "DAYLIGHT" sub-component
   consists of a collection of properties that describe Daylight Saving
   Time. In general this collection of properties consists of:

        - the first onset date-time for the observance

        - the last onset date-time for the observance, if a last onset
          is known.

        - the offset to be applied for the observance

        - a rule that describes the day and time when the observance
          takes effect

        - an optional name for the observance

   For a given time zone, there may be multiple unique definitions of
   the observances over a period of time. Each observance is described
   using either a "STANDARD" or "DAYLIGHT" sub-component. The collection
   of these sub-components is used to describe the time zone for a given
   period of time. The offset to apply at any given time is found by
   locating the observance that has the last onset date and time before
   the time in question, and using the offset value from that
ToP   noToC   RFC2445 - Page 64
   observance.

   The top-level properties in a "VTIMEZONE" calendar component are:

   The mandatory "TZID" property is a text value that uniquely
   identifies the VTIMZONE calendar component within the scope of an
   iCalendar object.

   The optional "LAST-MODIFIED" property is a UTC value that specifies
   the date and time that this time zone definition was last updated.

   The optional "TZURL" property is url value that points to a published
   VTIMEZONE definition. TZURL SHOULD refer to a resource that is
   accessible by anyone who might need to interpret the object. This
   SHOULD NOT normally be a file: URL or other URL that is not widely-
   accessible.

   The collection of properties that are used to define the STANDARD and
   DAYLIGHT sub-components include:

   The mandatory "DTSTART" property gives the effective onset date and
   local time for the time zone sub-component definition. "DTSTART" in
   this usage MUST be specified as a local DATE-TIME value.

   The mandatory "TZOFFSETFROM" property gives the UTC offset which is
   in use when the onset of this time zone observance begins.
   "TZOFFSETFROM" is combined with "DTSTART" to define the effective
   onset for the time zone sub-component definition. For example, the
   following represents the time at which the observance of Standard
   Time took effect in Fall 1967 for New York City:

     DTSTART:19671029T020000

     TZOFFSETFROM:-0400

   The mandatory "TZOFFSETTO " property gives the UTC offset for the
   time zone sub-component (Standard Time or Daylight Saving Time) when
   this observance is in use.

   The optional "TZNAME" property is the customary name for the time
   zone. It may be specified multiple times, to allow for specifying
   multiple language variants of the time zone names. This could be used
   for displaying dates.

   If specified, the onset for the observance defined by the time zone
   sub-component is defined by either the "RRULE" or "RDATE" property.
   If neither is specified, only one sub-component can be specified in
   the "VTIMEZONE" calendar component and it is assumed that the single
ToP   noToC   RFC2445 - Page 65
   observance specified is always in effect.

   The "RRULE" property defines the recurrence rule for the onset of the
   observance defined by this time zone sub-component. Some specific
   requirements for the usage of RRULE for this purpose include:

        - If observance is known to have an effective end date, the
        "UNTIL" recurrence rule parameter MUST be used to specify the
        last valid onset of this observance (i.e., the UNTIL date-time
        will be equal to the last instance generated by the recurrence
        pattern). It MUST be specified in UTC time.

        - The "DTSTART" and the "TZOFFSETTO" properties MUST be used
        when generating the onset date-time values (instances) from the
        RRULE.

   Alternatively, the "RDATE" property can be used to define the onset
   of the observance by giving the individual onset date and times.
   "RDATE" in this usage MUST be specified as a local DATE-TIME value in
   UTC time.

   The optional "COMMENT" property is also allowed for descriptive
   explanatory text.

   Example: The following are examples of the "VTIMEZONE" calendar
   component:

   This is an example showing time zone information for the Eastern
   United States using "RDATE" property. Note that this is only suitable
   for a recurring event that starts on or later than April 6, 1997 at
   03:00:00 EDT (i.e., the earliest effective transition date and time)
   and ends no later than April 7, 1998 02:00:00 EST (i.e., latest valid
   date and time for EST in this scenario). For example, this can be
   used for a recurring event that occurs every Friday, 8am-9:00 AM,
   starting June 1, 1997, ending December 31, 1997.

     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
ToP   noToC   RFC2445 - Page 66
     RDATE:19970406T020000
     TZOFFSETFROM:-0500
     TZOFFSETTO:-0400
     TZNAME:EDT
     END:DAYLIGHT
     END:VTIMEZONE

   This is a simple example showing the current time zone rules for the
   Eastern United States using a RRULE recurrence pattern. Note that
   there is no effective end date to either of the Standard Time or
   Daylight Time rules. This information would be valid for a recurring
   event starting today and continuing indefinitely.

     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

   This is an example showing a fictitious set of rules for the Eastern
   United States, where the Daylight Time rule has an effective end date
   (i.e., after that date, Daylight Time is no longer observed).

     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
ToP   noToC   RFC2445 - Page 67
     BEGIN:DAYLIGHT
     DTSTART:19870405T020000
     RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4;UNTIL=19980404T070000Z
     TZOFFSETFROM:-0500
     TZOFFSETTO:-0400
     TZNAME:EDT
     END:DAYLIGHT
     END:VTIMEZONE

   This is an example showing a fictitious set of rules for the Eastern
   United States, where the first Daylight Time rule has an effective
   end date. There is a second Daylight Time rule that picks up where
   the other left off.

     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

4.6.6 Alarm Component

   Component Name: VALARM

   Purpose: Provide a grouping of component properties that define an
   alarm.
ToP   noToC   RFC2445 - Page 68
   Formal Definition: A "VALARM" calendar component is defined by the
   following notation:

          alarmc     = "BEGIN" ":" "VALARM" CRLF
                       (audioprop / dispprop / emailprop / procprop)
                       "END" ":" "VALARM" CRLF

     audioprop  = 2*(

                ; 'action' and 'trigger' are both REQUIRED,
                ; but MUST NOT occur more than once

                action / trigger /

                ; 'duration' and 'repeat' are both optional,
                ; and MUST NOT occur more than once each,
                ; but if one occurs, so MUST the other

                duration / repeat /

                ; the following is optional,
                ; but MUST NOT occur more than once

                attach /

                ; the following is optional,
                ; and MAY occur more than once

                x-prop

                )



     dispprop   = 3*(

                ; the following are all REQUIRED,
                ; but MUST NOT occur more than once

                action / description / trigger /

                ; 'duration' and 'repeat' are both optional,
                ; and MUST NOT occur more than once each,
                ; but if one occurs, so MUST the other

                duration / repeat /

                ; the following is optional,
ToP   noToC   RFC2445 - Page 69
                ; and MAY occur more than once

                *x-prop

                )



     emailprop  = 5*(

                ; the following are all REQUIRED,
                ; but MUST NOT occur more than once

                action / description / trigger / summary

                ; the following is REQUIRED,
                ; and MAY occur more than once

                attendee /

                ; 'duration' and 'repeat' are both optional,
                ; and MUST NOT occur more than once each,
                ; but if one occurs, so MUST the other

                duration / repeat /

                ; the following are optional,
                ; and MAY occur more than once

                attach / x-prop

                )



     procprop   = 3*(

                ; the following are all REQUIRED,
                ; but MUST NOT occur more than once

                action / attach / trigger /

                ; 'duration' and 'repeat' are both optional,
                ; and MUST NOT occur more than once each,
                ; but if one occurs, so MUST the other

                duration / repeat /
ToP   noToC   RFC2445 - Page 70
                ; 'description' is optional,
                ; and MUST NOT occur more than once

                description /

                ; the following is optional,
                ; and MAY occur more than once

                x-prop

                )

   Description: A "VALARM" calendar component is a grouping of component
   properties that is a reminder or alarm for an event or a to-do. For
   example, it may be used to define a reminder for a pending event or
   an overdue to-do.

   The "VALARM" calendar component MUST include the "ACTION" and
   "TRIGGER" properties. The "ACTION" property further constrains the
   "VALARM" calendar component in the following ways:

   When the action is "AUDIO", the alarm can also include one and only
   one "ATTACH" property, which MUST point to a sound resource, which is
   rendered when the alarm is triggered.

   When the action is "DISPLAY", the alarm MUST also include a
   "DESCRIPTION" property, which contains the text to be displayed when
   the alarm is triggered.

   When the action is "EMAIL", the alarm MUST include a "DESCRIPTION"
   property, which contains the text to be used as the message body, a
   "SUMMARY" property, which contains the text to be used as the message
   subject, and one or more "ATTENDEE" properties, which contain the
   email address of attendees to receive the message. It can also
   include one or more "ATTACH" properties, which are intended to be
   sent as message attachments. When the alarm is triggered, the email
   message is sent.

   When the action is "PROCEDURE", the alarm MUST include one and only
   one "ATTACH" property, which MUST point to a procedure resource,
   which is invoked when the alarm is triggered.

   The "VALARM" calendar component MUST only appear within either a
   "VEVENT" or "VTODO" calendar component. "VALARM" calendar components
   cannot be nested. Multiple mutually independent "VALARM" calendar
   components can be specified for a single "VEVENT" or "VTODO" calendar
   component.
ToP   noToC   RFC2445 - Page 71
   The "TRIGGER" property specifies when the alarm will be triggered.
   The "TRIGGER" property specifies a duration prior to the start of an
   event or a to-do. The "TRIGGER" edge may be explicitly set to be
   relative to the "START" or "END" of the event or to-do with the
   "RELATED" parameter of the "TRIGGER" property. The "TRIGGER" property
   value type can alternatively be set to an absolute calendar date and
   time of day value.

   In an alarm set to trigger on the "START" of an event or to-do, the
   "DTSTART" property MUST be present in the associated event or to-do.
   In an alarm in a "VEVENT" calendar component set to trigger on the
   "END" of the event, either the "DTEND" property MUST be present, or
   the "DTSTART" and "DURATION" properties MUST both be present. In an
   alarm in a "VTODO" calendar component set to trigger on the "END" of
   the to-do, either the "DUE" property MUST be present, or the
   "DTSTART" and "DURATION" properties MUST both be present.

   The alarm can be defined such that it triggers repeatedly. A
   definition of an alarm with a repeating trigger MUST include both the
   "DURATION" and "REPEAT" properties. The "DURATION" property specifies
   the delay period, after which the alarm will repeat. The "REPEAT"
   property specifies the number of additional repetitions that the
   alarm will triggered. This repitition count is in addition to the
   initial triggering of the alarm. Both of these properties MUST be
   present in order to specify a repeating alarm. If one of these two
   properties is absent, then the alarm will not repeat beyond the
   initial trigger.

   The "ACTION" property is used within the "VALARM" calendar component
   to specify the type of action invoked when the alarm is triggered.
   The "VALARM" properties provide enough information for a specific
   action to be invoked. It is typically the responsibility of a
   "Calendar User Agent" (CUA) to deliver the alarm in the specified
   fashion. An "ACTION" property value of AUDIO specifies an alarm that
   causes a sound to be played to alert the user; DISPLAY specifies an
   alarm that causes a text message to be displayed to the user; EMAIL
   specifies an alarm that causes an electronic email message to be
   delivered to one or more email addresses; and PROCEDURE specifies an
   alarm that causes a procedure to be executed. The "ACTION" property
   MUST specify one and only one of these values.

   In an AUDIO alarm, if the optional "ATTACH" property is included, it
   MUST specify an audio sound resource. The intention is that the sound
   will be played as the alarm effect. If an "ATTACH" property is
   specified that does not refer to a sound resource, or if the
   specified sound resource cannot be rendered (because its format is
   unsupported, or because it cannot be retrieved), then the CUA or
   other entity responsible for playing the sound may choose a fallback
ToP   noToC   RFC2445 - Page 72
   action, such as playing a built-in default sound, or playing no sound
   at all.

   In a DISPLAY alarm, the intended alarm effect is for the text value
   of the "DESCRIPTION" property to be displayed to the user.

   In an EMAIL alarm, the intended alarm effect is for an email message
   to be composed and delivered to all the addresses specified by the
   "ATTENDEE" properties in the "VALARM" calendar component. The
   "DESCRIPTION" property of the "VALARM" calendar component MUST be
   used as the body text of the message, and the "SUMMARY" property MUST
   be used as the subject text. Any "ATTACH" properties in the "VALARM"
   calendar component SHOULD be sent as attachments to the message.

   In a PROCEDURE alarm, the "ATTACH" property in the "VALARM" calendar
   component MUST specify a procedure or program that is intended to be
   invoked as the alarm effect. If the procedure or program is in a
   format that cannot be rendered, then no procedure alarm will be
   invoked. If the "DESCRIPTION" property is present, its value
   specifies the argument string to be passed to the procedure or
   program. "Calendar User Agents" that receive an iCalendar object with
   this category of alarm, can disable or allow the "Calendar User" to
   disable, or otherwise ignore this type of alarm. While a very useful
   alarm capability, the PROCEDURE type of alarm SHOULD be treated by
   the "Calendar User Agent" as a potential security risk.

   Example: The following example is for a "VALARM" calendar component
   that specifies an audio alarm that will sound at a precise time and
   repeat 4 more times at 15 minute intervals:

     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

   The following example is for a "VALARM" calendar component that
   specifies a display alarm that will trigger 30 minutes before the
   scheduled start of the event or the due date/time of the to-do it is
   associated with and will repeat 2 more times at 15 minute intervals:

     BEGIN:VALARM
     TRIGGER:-PT30M
     REPEAT:2
     DURATION:PT15M
     ACTION:DISPLAY
ToP   noToC   RFC2445 - Page 73
     DESCRIPTION:Breakfast meeting with executive\n
      team at 8:30 AM EST.
     END:VALARM

   The following example is for a "VALARM" calendar component that
   specifies an email alarm that will trigger 2 days before the
   scheduled due date/time of a to-do it is associated with. It does not
   repeat. The email has a subject, body and attachment link.

     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

   The following example is for a "VALARM" calendar component that
   specifies a procedural alarm that will trigger at a precise date/time
   and will repeat 23 more times at one hour intervals. The alarm will
   invoke a procedure file.

     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



(page 73 continued on part 3)

Next Section