<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt"?>
<!DOCTYPE rfc SYSTEM 'rfc2629.dtd'
[
  <!ENTITY rfc2119 PUBLIC '' 'bibxml/reference.RFC.2119.xml'>
  <!ENTITY rfc3986 PUBLIC '' 'bibxml/reference.RFC.3986.xml'>
  <!ENTITY rfc4648 PUBLIC '' 'bibxml/reference.RFC.4648.xml'>
  <!ENTITY rfc5234 PUBLIC '' 'bibxml/reference.RFC.5234.xml'>
  <!ENTITY rfc5545 PUBLIC '' 'bibxml/reference.RFC.5545.xml'>
  <!ENTITY rfc6321 PUBLIC '' 'bibxml/reference.RFC.6321.xml'>
  <!ENTITY rfc6868 PUBLIC '' 'bibxml/reference.RFC.6868.xml'>
  <!ENTITY rfc6982 PUBLIC '' 'bibxml/reference.RFC.6982.xml'>
  <!ENTITY rfc7159 PUBLIC '' 'bibxml/reference.RFC.7159.xml'>
]>
<?rfc rfcedstyle="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<!-- default = 3 -->
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes"?>
<?rfc compact="yes"?>
<?rfc subcompact="no"?>
<?rfc strict="yes"?>
<!--<?rfc comments="yes"?> -->
<!--<?rfc inline="yes"?> -->
<rfc category='std' ipr='trust200902' docName='draft-ietf-jcardcal-jcal-10'>
  <front>
    <title abbrev="jCal">jCal: The JSON format for iCalendar</title>
    <author initials="P." surname="Kewisch" fullname="Philipp Kewisch">
      <organization abbrev="Mozilla">Mozilla Corporation</organization>
      <address>
        <postal>
          <street>650 Castro Street, Suite 300</street>
          <city>Mountain View</city>
          <region>CA</region>
          <code>94041</code>
          <country>USA</country>
        </postal>
        <email>mozilla@kewis.ch</email>
        <uri>http://www.mozilla.org/</uri>
      </address>
    </author>
    <author initials="C." surname="Daboo" fullname="Cyrus Daboo">
      <organization abbrev="Apple, Inc.">Apple Inc.</organization>
      <address>
        <postal>
          <street>1 Infinite Loop</street>
          <city>Cupertino</city>
          <region>CA</region>
          <code>95014</code>
          <country>USA</country>
        </postal>
        <email>cyrus@daboo.name</email>
        <uri>http://www.apple.com/</uri>
      </address>
    </author>
    <author initials="M." surname="Douglass" fullname="Mike Douglass">
      <organization abbrev="RPI">Rensselaer Polytechnic Institute</organization>
      <address>
        <postal>
          <street>110 8th Street</street>
          <city>Troy</city>
          <region>NY</region>
          <code>12180</code>
          <country>USA</country>
        </postal>
        <email>douglm@rpi.edu</email>
        <uri>http://www.rpi.edu/</uri>
      </address>
    </author>
    <date />
    <area>Applications</area>
    <workgroup>JSON data formats for vCard and iCalendar</workgroup>
    <abstract>
      <t>
        This specification defines "jCal", a JSON format for iCalendar data.
        The iCalendar data format is a text format for capturing and exchanging
        information normally stored within a calendaring and scheduling
        application, for example tasks and events. JSON is a lightweight,
        text-based, language-independent data interchange format commonly used
        in internet applications.
      </t>
    </abstract>
  </front>
  <middle>

    <section title='Introduction'>

      <t>
        The iCalendar data format <xref target='RFC5545'/> is a widely deployed 
        interchange format for calendaring and scheduling data. While many 
        applications and services consume and generate calendar data, iCalendar
        is a specialized format that requires its own parser/generator. In contrast, 
        JSON-based formats as defined in <xref target='RFC7159'/> are the native 
        format for JavaScript widgets and libraries and it is appropriate to
        have a standard form of calendar data that is easier to work with than
        iCalendar.
      </t>

      <t>
        The purpose of this specification is to define "jCal", a JSON format 
        for iCalendar data. jCal is defined as a straightforward mapping into 
        JSON from iCalendar, so that iCalendar data can be converted to JSON, 
        and then back to iCalendar, without losing any semantic meaning in the 
        data. Anyone creating jCal calendar data according to this specification 
        will know that their data can be converted to a valid iCalendar 
        representation as well.
      </t>

      <t>
        The key design considerations are essentially the same as those for 
        <xref target='RFC6321' />, that is:
        <list>
          <t>
            Round-tripping (converting an iCalendar instance to jCal and back)
            will give the same semantic result as the starting point. For
            example, all components, properties and property parameters are
            guaranteed to be preserved.
          </t>
          <t>
            Ordering of elements and case of property and parameter names will
            not necessarily be preserved.
          </t>
          <t>
            The iCalendar data semantics are to be preserved, allowing a simple
            consumer to easily browse the data in jCal. A full understanding of
            iCalendar is still required in order to modify and/or fully
            comprehend the calendar data.
          </t>
          <t>
            Extensions to the underlying iCalendar specification must not lead
            to requiring an update to jCal.
          </t>
        </list>
      </t>

    </section>

    <section title='Conventions Used in This Document'>

      <t>
        The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", 
        "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this 
        document are to be interpreted as described in 
        <xref target='RFC2119' />.
      </t>

      <t>
        The underlying format used for jCal is JSON. Consequently, the terms
        "object" and "array" as well as the four primitive types (strings,
        numbers, booleans, and null) are to be interpreted as described in
        Section 1 of <xref target="RFC7159"/>.
      </t>

      <t>
        Some examples in this document contain "partial" JSON documents used 
        for illustrative purposes. In these examples, three periods "..." are 
        used to indicate a portion of the document that has been removed for 
        compactness.
      </t>
    </section>

    <section anchor="ical-to-jcal" title='Converting from iCalendar to jCal'>
      <t>
        This section describes how iCalendar data is converted to jCal using a 
        simple mapping between the iCalendar data model and JSON elements.
        Aside from the formal description in this section, an informative ABNF
        is specified in <xref target="schema"/>.
      </t>

      <t>
        In <xref target='RFC5545'/>, an iCalendar object comprises a set of
        "components", "properties", "parameters" and "values". The top level of
        iCalendar data typically contains a stream of iCalendar objects, each
        of which can be considered a "component". A "component" can contain
        other "components" or "properties".  A "property" has a "value" and a
        set of zero or more "parameters".  Each of these entities have a
        representation in jCal, defined in the following sections. The
        representation of a iCalendar object in JSON will be named "jCal
        object" throughout this document. 
      </t>

      <section title="Pre-processing">
        <t>
          iCalendar uses a line folding mechanism to limit lines of data to a 
          maximum line length (typically 75 octets) to ensure maximum 
          likelihood of preserving data integrity as it is transported via 
          various means (e.g., email) - see Section 3.1 of <xref target='RFC5545'/>. 
        </t>

        <t>
          iCalendar data uses an "escape" character sequence for text values and
          property parameter values. See Section 3.1 and 3.3 of
          <xref target='RFC5545'/> as well as <xref target="RFC6868"/>.
        </t>

        <t>
          There is a subtle difference in the number representations between
          JSON and iCalendar. While in iCalendar a number may have leading
          zeros, as well as a leading plus sign, this is not the case in JSON.
          Numbers should be represented in whatever way needed for the
          underlying format.
        </t>

        <t>
          When converting from iCalendar to jCal, first iCalendar lines MUST be
          unfolded. Afterwards, any iCalendar escaping MUST be unescaped.
          Finally JSON escaping, as described in <xref target='RFC7159'/>
          Section 7, MUST be applied. The reverse order applies when converting
          from jCal to iCalendar, which is further described in <xref
          target="jcal-to-ical"/>.
        </t>

        <t>
          iCalendar uses a base64 encoding for binary data. However, it does not 
          restrict the encoding from being applied to non-binary value types. 
          So the following rules are applied when processing a property with 
          the "ENCODING" property parameter set to "BASE64":
          <list style="symbols">
            <t>
              If the property value type is "BINARY", the base64 encoding MUST 
              be preserved.
            </t>
            <t>
              If the value type is not "BINARY", the "ENCODING" property
               parameter MUST be removed, and the value MUST be base64 decoded.
             </t>
          </list>
        </t>
        
        <t>
          When base64 encoding and decoding is used, it MUST conform to Section 
          4 of <xref target='RFC4648'/>, which is the base64 method used in 
          <xref target='RFC5545'/>.
        </t>
        
        <t>
          One key difference in the formatting of values used in iCalendar and
          jCal is that in jCal the specification uses date/time values aligned
          with the extended format of <xref target="ISO.8601.2004"/>, which is
          more commonly used in internet applications that make use of the JSON
          format.  The sections of this document describing the various date
          and time formats contain more information on the use of the complete
          representation, reduced accuracy or truncated representation.
        </t>
      </section>

      <section title="iCalendar Stream and Objects (RFC5545 section 3.4)">
        <t>
          At the top level of the iCalendar object model is an "iCalendar
          stream".  This stream encompasses multiple "iCalendar objects". As
          the typical use case is transporting a single iCalendar object, there
          is no defined equivalent to an "iCalendar stream" in jCal.  To
          transport multiple jCal objects in a stream, a simple JSON array can
          be used.
        </t>

        <t>
          <figure>
            <preamble>Example:</preamble>
            <artwork><![CDATA[
["vcalendar",
  [ /* Add jCal properties in place of this comment */ ],
  [ /* Add jCal components in place of this comment */ ]
]
]]></artwork></figure>
        </t>

      </section>

      <section anchor="components" title="Components (RFC5545 section 3.6)">
        <t>
          Each iCalendar component, delimited by "BEGIN" and "END", will be
          converted to a fixed length array with three fields that have a
          specific structure:
          <list style="numbers">
            <t>
              A string with the name of the iCalendar component, but in
              lowercase.
            </t>
            <t>
              An array of jCal properties as described in
              <xref target="properties"/>.
            </t>
            <t>
              An array of jCal components, representing the sub-components of
              the component in question.
            </t>
          </list>
        </t>

        <t>
          This mapping applies to the top level iCalendar objects, as well as
          individual sub-components in the same way.  The iCalendar to jCal
          component mapping is valid for both current iCalendar components and
          any new iCalendar components added in the future. Conversion is to be
          done in the same way.
        </t>

        <t>
          While the grouping of properties and sub-components does not retain
          the original order specified in the iCalendar data, the semantics
          of a component are preserved.
        </t>

        <t>
          <figure>
            <preamble>Example:</preamble>
            <artwork><![CDATA[
["vevent",
  [ /* Add jCal properties in place of this comment */ ],
  [ /* Add jCal components in place of this comment */ ]
]
]]></artwork></figure>    
        </t>
      </section>

      <section anchor="properties" title="Properties (RFC5545 section 3.7 and 3.8)">
        <t>
          iCalendar properties, whether they apply to the "VCALENDAR" object 
          or to a component, are handled in a consistent way in the jCal format.
        </t>

        <t>
          In jCal, each individual iCalendar property MUST be represented by an
          array with three fixed elements, followed by one or more additional
          elements, depending on if the property is a multi-value property as
          described in Section 3.1.2 of <xref target="RFC5545"/>.
        </t>

        <t>
          The array consists of the following fixed elements:
          <list style="numbers">
            <t>
              The name of the property, as a lowercase string.  The iCalendar
              format specifies that property names are case-insensitive, and
              recommends that they be rendered in uppercase.  In jCal, they
              MUST be in lowercase.
            </t>
            <t>
              An object containing the parameters as described in
              <xref target="parameters"/>. If the property has no parameters,
              an empty object is used to represent that.
            </t>
            <t>
              The type identifier string of the value, in lowercase. Due to
              special casing of certain properties as described in
              <xref target="specialproperties"/>, it is important that parsers
              check both the type identifier and the value data type and
              do not rely on assumptions based on the property name.
            </t>
          </list>

          The remaining elements of the array are used for one or more values
          of the property. For single-value properties, the array has exactly
          four elements; for multi-valued properties, as described in
          <xref target="RFC5545"/> Section 3.1.2, each value is another
          element, and there can be any number of additional elements.
        </t>

        <t>
          In the following example, the "categories" property is multi-valued
          and has two values, while the summary property is single-valued:

          <figure>
            <preamble>Example:</preamble>
            <artwork><![CDATA[
["vevent",
  [
    ["summary", {}, "text", "Meeting with Fred"],
    ["categories", {}, "text", "Meetings", "Work"]
    ...
  ],
  [ /* sub-components */ ]
]
]]></artwork></figure>
        </t>

        <section anchor="specialproperties" title="Special Cases for Properties">
          <t>
            This section describes some properties that have special handling 
            when converting to jCal.
          </t>

          <section title="GEO Property (RFC5545 Section 3.8.1.6)">
            <t>
              In iCalendar, the "GEO" property value is defined as a semi-colon 
              separated list of two "FLOAT" values, the first representing 
              latitude and the second longitude.
            </t>
            
            <t>
              In jCal, the value for the "geo" property value is represented as
              an array of two values. The first value of the property
              represents the latitude, the second value represents the
              longitude.
            </t>

            <t>
              When converting from jCal to iCalendar, be careful to use a
              semi-colon as the separator between the two values as required by
              RFC5545.
            </t>

            <t>
              When converting from jCal to iCalendar, the two values MUST be
              converted using a semi-colon as the separator character.
            </t>

			<t>
			  <figure>
              <preamble>Example</preamble>
              <artwork><![CDATA[
["vevent", 
  [
    ["geo", {}, "float", [ 37.386013, -122.082932 ] ]
    ...
  ],
  ...
]
]]></artwork></figure>
	        </t>
          </section>
          
          <section title="REQUEST-STATUS Property (RFC5545 Section 3.8.8.3)">
            <t>
              In iCalendar, the "REQUEST-STATUS" property value is defined as a 
              semi-colon separated list of two or three "TEXT" values. The first 
              represents a code, the second a description, and the third any 
              additional data.
            </t>
            
            <t>
              In jCal, the value for the "request-status" property value is
              represented as an array with two or three values. The first array
              element corresponds to the code, the second element corresponds
              to the description and the third element corresponds to the
              additional data. Each value is represented using a string value.
              If there is no additional data in the iCalendar value, the last
              element of the array SHOULD NOT be present.
            </t>

            <t>
              When converting from jCal to iCalendar, the two or three values
              MUST be converted using a semi-colon as the separator character.
            </t>
            
			<t>
			  <figure>
                <preamble>iCalendar Example:</preamble>
                <artwork><![CDATA[
BEGIN:VEVENT
...
REQUEST-STATUS:2.0;Success
REQUEST-STATUS:3.7;Invalid calendar user;ATTENDEE:
 mailto:jsmith@example.com
...
END:VEVENT
]]></artwork></figure>
			  <figure>
                <preamble>jCal Example:</preamble>
                <artwork><![CDATA[
["vevent":
  [
    ["request-status", {}, "text", ["2.0", "Success"] ],
    ["request-status", {}, "text",
       [
        "3.7",
        "Invalid calendar user",
        "ATTENDEE:mailto:jsmith@example.org"
       ]
    ],
    ...
  ],
  ...
]
]]></artwork></figure>
	        </t>
          </section>
        </section>
      </section>

      <section anchor="parameters" title="Parameters (RFC5545 section 3.2)">
        <t>
          Property parameters are represented as a JSON object where each
          key-value pair represents the iCalendar parameter name and its value.
          The name of the parameter MUST be in lowercase, the original case of
          the parameter value MUST be preserved. For example, the "PARTSTAT"
          property parameter is represented in jCal by the "partstat" key.
          Any new iCalendar parameters added in the future will be converted in the
          same way.
        </t>

        <t>
          <figure>
            <preamble>Example:</preamble>
          <artwork><![CDATA[
["vevent":
  [
    ["attendee",
     { 
       "partstat": "ACCEPTED",
       "rsvp": "TRUE",
       "role": "REQ-PARTICIPANT"
     },
     "cal-address",
     "mailto:jsmith@example.org"
    ],
    ["summary", {}, "text", "Meeting"],
    ...
  ],
  ...
]
]]></artwork></figure>
        </t>

        <section title="VALUE parameter">
          <t>
            iCalendar defines a "VALUE" property parameter (Section 3.2.20 of
            <xref target='RFC5545'/>). This property parameter MUST NOT be
            added to the parameters object. Instead, the value type is signaled
            through the type identifier in the third element of the array
            describing the property. When converting a property from iCalendar to
            jCal, the value type is determined as follows:
            <list style="numbers">
              <t>
                If the property has a "VALUE" parameter, that parameter's value
                is used as the value type. 
              </t>
              <t>
                If the property has no "VALUE" parameter but has a default
                value type, the default value type is used. 
              </t>
              <t>
                If the property has no "VALUE" parameter and has no default
                value type, "unknown" is used. 
              </t>
            </list>
          </t>

          <t>
            Converting from jCal into iCalendar is done as follows:
            <list style="numbers">
              <t>
                If the property's value type is "unknown", no "VALUE" parameter
                is included.
              </t>
              <t>
                If the property's value type is the default type for that
                property, no "VALUE" parameter is included. 
              </t>
              <t>
                Otherwise, a "VALUE" parameter is included, and the value type
                is used as the parameter value. 
              </t>
            </list>
          </t>
          <t>
            See <xref target="unrecognized"/> for information on handling
            unknown value types.
          </t>
        </section>

        <section title="Multi-value Parameters">
          <t>
            In <xref target='RFC5545'/>, some parameters allow using a
            COMMA-separated list of values. To ease processing in jCal, the
            value of such parameters MUST be represented in an array containing
            the separated values. The array elements MUST be string values. 
            Single-value parameters can be represented either using a single
            string value or an array with one string element. A jCal parser
            MUST be able to understand both value data types. An example for a
            such parameter is the iCalendar "DELEGATED-FROM" and "DELEGATED-TO"
            parameter, more such parameters may be added in extensions.
          </t>

          <t>
            The iCalendar specification requires encapsulation between DQUOTE
            characters if a parameter value contains a colon, a semicolon or a
            comma. These extra DQUOTE characters do not belong to the actual
            parameter value, and hence are not included when the parameter is
            converted to jCal.
          </t>
          <t>
            <figure>
              <preamble>Example 1:</preamble>
              <artwork><![CDATA[
["attendee",
 { 
   "delegated-to": ["mailto:jdoe@example.org",
                    "mailto:jqpublic@example.org"]
 },
 "cal-address",
 "mailto:jsmith@example.org"
]
]]></artwork></figure>
          </t>
          <t>
            <figure>
              <preamble>Example 2:</preamble>
              <artwork><![CDATA[
["attendee",
 { 
   "delegated-to": "mailto:jdoe@example.org"
 },
 "cal-address",
 "mailto:jsmith@example.org"
]
]]></artwork></figure>
          </t>
        </section>
      </section>

      <section anchor="values" title="Values (RFC5545 section 3.3)">
        <t>
          The following subsections specify how iCalendar property value data
          types, which are defined in the subsections of <xref target="RFC5545"/>
          Section 3.3, are represented in jCal.
        </t>

        <section title="Binary (RFC5545 section 3.3.1)">
        <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "BINARY" property values are represented by a property
              with type identifier "binary". The value element is a JSON string
              with base64 encoded data, conforming to Section 4 of
              <xref target='RFC4648'/>, which is the base64 method used in <xref
              target='RFC5545'/>.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["attach", {}, "binary", "SGVsbG8gV29ybGQh"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Boolean  (RFC5545 section 3.3.2)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "BOOLEAN" property values are represented by a property
              with the type identifier "boolean". The value is a JSON boolean
              value.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["x-non-smoking", {}, "boolean", true]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Calendar User Address (RFC5545 section 3.3.3)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "CAL-ADDRESS" property values are represented by a
              property with the type identifier "cal-address". The value is a
              JSON string with the URI as described in
              <xref target="RFC3986"/>.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["attendee", {}, "cal-address", "mailto:kewisch@example.com"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Date (RFC5545 section 3.3.4)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "DATE" property values are represented by a property
              with the type identifier "date". The value elements are JSON
              strings with the same date value specified by
              <xref target="RFC5545"/>, but represented using the extended
              format of the complete representation specified in
              <xref target="ISO.8601.2004"/>, Section 4.1.2.2. Other
              variations, for example representation with reduced accuracy,
              MUST NOT be used.
            </t>
            <t hangText="ABNF Schema:"><figure><artwork><![CDATA[
; year, month and day rules are
; defined in [ISO.8601.2004], Section 2.2.
date = year "-" month "-" day ;YYYY-MM-DD
]]></artwork></figure></t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["dtstart", {}, "date", "2011-05-17"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Date-Time (RFC5545 section 3.3.5)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "DATE-TIME" property values are represented by a
              property with the type identifier "date-time". The value elements
              are JSON strings with the same date value specified by
              <xref target="RFC5545"/>, but represented using the extended
              format of the complete representation specified in
              <xref target="ISO.8601.2004"/>, Section 4.3.2. Other variations,
              for example representation with reduced accuracy, MUST NOT be used.
              The same restrictions with respect to leap seconds and timezone
              offsets as specified in <xref target="RFC5545"/> Section 3.3.5
              apply.
            </t>
            <t hangText="ABNF Schema:"><figure><artwork><![CDATA[
; year, month, day, hour, minute and second rules are
; defined in [ISO.8601.2004], Section 2.2.
; The zone identifier is described in [ISO.8601.2004], Section 4.3.2.
date-complete = year "-" month "-" day ;YYYY-MM-DD
time-complete =  hour ":" minute ":" second [zone] ; HH:MM:SS
datetime = date-complete "T" time-complete
]]></artwork></figure></t>

			<t hangText="Examples:"><figure><artwork><![CDATA[
["dtstart", {}, "date-time", "2012-10-17T12:00:00"],
["dtstamp", {}, "date-time", "2012-10-17T12:00:00Z"],
["dtend",
 { "tzid": "Europe/Berlin" },
 "date-time",
 "2011-10-17T13:00:00"
]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Duration (RFC5545 section 3.3.6)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "DURATION" property values are represented by a
              property with the type identifier "duration". The value elements
              are JSON strings with the same duration value specified by <xref
              target="RFC5545"/>.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["duration", {}, "duration", "P1D"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Float (RFC5545 section 3.3.7)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "FLOAT" property values are represented by a property
              with the type identifier "float". The value elements are JSON
              primitive number values.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["x-grade", {}, "float", 1.3]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Integer (RFC5545 section 3.3.8)">
          <t><list style="hanging">
            <t hangText="Description:">
              vCard "INTEGER" property values are represented by a property
              with the type identifier "integer". The value elements are JSON
              primitive number values which MUST resolve to an integer value in
              the range specified in <xref target="RFC5545"/>, Section 3.3.8.
              Thus a fractional and/or exponential part are only allowed under
              limited circumstances.
            </t>

			<t hangText="Examples:"><figure><artwork><![CDATA[
["percent-complete", {}, "integer", 42]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Period of Time (RFC5545 section 3.3.9)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "PERIOD" property values are represented by a jCal
              property with the type identifier "period". The value element is
              an array of JSON strings, with the first element representing the
              start of the period and the second element representing the end
              of the period. As in <xref target='RFC5545'/>, the start of the
              period is always formatted as a date-time value and the end of
              the period MUST be either a date-time or duration value. Any
              date, date-time or duration values contained in the period value
              MUST be formatted in accordance to the rules for date, date-time
              or duration values specified in this document.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["freebusy",
 { "fbtype": "FREE" },
 "period",
 ["1997-03-08T16:00:00Z", "P1D"]
]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Recurrence Rule (RFC5545 section 3.3.10)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "RECUR" property values are represented by a property
              with the type identifier "recur". The value elements are objects
              describing the structured data as specified by
              <xref target='RFC5545'/>. Each rule part is described by the
              combination of key and value.  The key specifies the name of the
              rule part and MUST be converted to lowercase. The value of the
              rule part MUST be mapped by the following rules:

              <list style="symbols">
                <t>
                  The value of the "freq" and "wkst" rule parts MUST be a
                  string as specified in <xref target='RFC5545'/>, with case
                  preserved.
                </t>
                <t>
                  The value of the "until" rule part MUST be a date or
                  date-time value formatted in accordance to the rules for date
                  or date-time specified in this document.
                </t>
                <t>
                  The "count" and "interval" rule parts MUST be specified as a
                  single JSON number value.
                </t>
                <t>
                  The following rule parts can have one or more numeric values:
                  "bysecond", "byminute", "byhour", "bymonthday", "byyearday",
                  "byweekno", "bymonth", and "bysetpos". If a rule part
                  contains multiple values, an array of numbers MUST be used
                  for that rule part. Single-valued rule parts can be
                  represented either using a single number value, omitting the
                  array completely, or an array with one number element. A jCal
                  parser MUST be able to understand both data types.
                </t>
                <t>
                  Similarly, the "byday" rule part can have one or more string
                  values.  If it contains multiple values, an array of strings
                  MUST be used. As before, a single-valued rule part can be
                  represented either using a single string value or an array
                  with one string element, both of which a jCal parser MUST
                  be able to understand.
                </t>
              </list>
            </t>

			<t hangText="Example 1:"><figure><artwork><![CDATA[
["rrule",
 {},
 "recur",
 {
   "freq": "YEARLY",
   "count": 5,
   "byday": [ "-1SU", "2MO" ],
   "bymonth": 10
 }
]
]]></artwork></figure></t>
			<t hangText="Example 2:"><figure><artwork><![CDATA[
["rrule",
 {},
 "recur",
 { 
   "freq": "MONTHLY",
   "interval": 2,
   "bymonthday": [ 1, 15, -1 ],
   "until": "2013-10-01"
 }
]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Text (RFC5545 section 3.3.11)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "TEXT" property values are represented by a property
              with the type identifier "text". The value elements are JSON strings.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["comment", {}, "text", "hello, world"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="Time (RFC5545 section 3.3.12)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "TIME" property values are represented by a property
              with the type identifier "time". The value elements are JSON
              strings with the same time value specified by
              <xref target="RFC5545"/>, but represented using the extended
              format of the complete representation specified in
              <xref target="ISO.8601.2004"/>, Section 4.2.2.2. Other
              variations, for example representation with reduced accuracy,
              MUST NOT be used.  The same restrictions with respect to leap
              seconds, time fractions, and timezone offsets as specified in
              <xref target="RFC5545"/> Section 3.3.12 apply.
            </t>
            <t hangText="ABNF Schema:"><figure><artwork><![CDATA[
; hour, minute and second rules are
; defined in [ISO.8601.2004], Section 2.2.
; The zone identifier is described in [ISO.8601.2004], Section 4.3.2.
time-complete =  hour ":" minute ":" second [zone] ; HH:MM:SS
]]></artwork></figure></t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["x-time-local", {}, "time", "12:30:00"],
["x-time-utc", {}, "time", "12:30:00Z"],
["x-time-offset", { "tzid": "Europe/Berlin" }, "time", "12:30:00"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="URI (RFC5545 section 3.3.13)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "URI" property values are represented by a property with the
              type identifier "uri". The value elements are JSON strings
              representing the URI.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["tzurl", {}, "uri", "http://example.org/tz/Europe-Berlin.ics"]
]]></artwork></figure></t>
          </list></t>
        </section>
        <section title="UTC Offset (RFC5545 section 3.3.14)">
          <t><list style="hanging">
            <t hangText="Description:">
              iCalendar "UTC-OFFSET" property values are represented by a
              property with the type identifier "utc-offset". The value
              elements are JSON strings with the same UTC offset value
              specified by <xref target="RFC5545"/>, with the exception that
              the hour and minute components are separated by a ":" character,
              for consistency with the <xref target="ISO.8601.2004"/> timezone
              offset, extended format.
            </t>

			<t hangText="Example:"><figure><artwork><![CDATA[
["tzoffsetfrom", {}, "utc-offset", "-05:00"],
["tzoffsetto", {}, "utc-offset", "+12:45"]
]]></artwork></figure></t>
          </list></t>
        </section>
      </section>

      <section title="Extensions">
        <t>
          iCalendar extension properties and property parameters (those with an
          "X-" prefix in their name) are handled in the same way as other
          properties and property parameters: the property is represented by an
          array, the property parameter represented by an object. The property
          or parameter name uses the same name as for the iCalendar extension,
          but in lowercase. For example, the "X-FOO" property in iCalendar
          turns into the "x-foo" jCal property. See <xref target="unrecognized"/>
          for how to deal with default values for unrecognized extension
          properties or property parameters.
        </t>
      </section>

    </section>

    <section anchor="jcal-to-ical" title="Converting from jCal into iCalendar">
      <t>
        Converting jCal to iCalendar reverses the process described in
        <xref target="ical-to-jcal"/>. This section describes a few additional
        requirements for conversion.
      </t>

      <t>
        When converting component, property and property parameter names, they
        names SHOULD be converted to uppercase. Although iCalendar names are
        case insensitive, common practice is to keep them all uppercase
        following the actual definitions in <xref target="RFC5545"/>.
      </t>

      <t>
        During conversion, JSON escaping MUST be unescaped. Afterwards,
        iCalendar escaping, as defined by <xref target="RFC5545"/> and
        <xref target="RFC6868"/> MUST be applied. Finally, long lines SHOULD be
        folded as described in <xref target="RFC5545"/>, Section 3.1.
      </t>

      <t>Non-binary value types MUST NOT be base64 encoded.</t>

      <t>
        When converting to iCalendar, the VALUE parameter MUST be added to
        properties whose default value type is unknown, but do not have a jCal
        type identifier "unknown". The VALUE parameter MAY be omitted for
        properties using the default value type. The VALUE parameter MUST be
        omitted for properties which have the jCal type identifier "unknown".
      </t>
    </section>

    <section title="Handling Unrecognized Properties or Parameters" anchor="unrecognized">
      <t>
        In iCalendar, properties can have one or more value types as specified by
        their definition, with one of those values being defined as the
        default. When a property uses its default value type, the "VALUE"
        property parameter does not need to be specified on the property. For
        example, "DTSTART"'s default value type is "DATE-TIME", so
        "VALUE=DATE-TIME" need not be set as a property parameter. However,
        "DTSTART" also allows a "DATE" value to be specified, and if that is
        used, "VALUE=DATE" has to be set as a property parameter.
      </t>
      <t>
        When new properties are defined or "X-" properties used, an iCalendar
        to jCal converter might not recognize them, and not know what the
        appropriate default value types are, yet they need to be able to
        preserve the values. A similar issue arises for unrecognized property
        parameters.
      </t>
      <t>
        In jCal, a new "unknown" property value type is introduced.  Its
        purpose is to allow preserving unknown property values when
        round-tripping between jCal and iCalendar. To avoid collisions, this
        specification reserves the UNKNOWN property value type in iCalendar.
        It MUST NOT be used in any iCalendar as specified by
        <xref target='RFC5545'/>, nor any extensions to it. The type is hence
        registered to the iCalendar Value Data Types registry in 
        <xref target="unknown-registration"/>.
      </t>

      <section title="Converting iCalendar into jCal">
        <t>
          Any property that does not include a "VALUE" property
          parameter and whose default value type is not known, MUST
          be converted to a primitive JSON string. The content of
          that string is the unprocessed value text. Also, value type
          MUST be set to "unknown".
        </t>
        <t>
          To correctly implement this format, it is critical that if
          the default type is not known that the type "unknown" is
          used. If this requirement is ignored and for example "text"
          is used, additional escaping may occur which breaks
          round-tripping values.
        </t>
        <t>
          Any unrecognized property parameter MUST be converted to a
          string value, with its content set to the property
          parameter value text, treated as if it were a "TEXT" value.
        </t>
      </section>

      <section title="Converting jCal into iCalendar">
        <t>
          In jCal the value type is always explicitly specified. It is
          converted to iCalendar using the iCalendar VALUE parameter, except in
          the following two cases:

          <list style="symbols">
            <t>
              If the value type specified in jCal matches the default value
              type in iCalendar, the VALUE parameter MAY be omitted.
            </t>
            <t>
              If the value type specified in jCal is set to "unknown", the
              VALUE parameter MUST NOT be specified. The value MUST be taken
              over in iCalendar without processing. 
            </t>
          </list>
        </t>
      </section>

      <section title="Examples">
        <t>
          The following is an example of an unrecognized iCalendar property
          (that uses a "DATE-TIME" value as its default), and the equivalent
          jCal representation of that property.
        </t>
          
        <figure><preamble>iCalendar:</preamble><artwork><![CDATA[
X-COMPLAINT-DEADLINE:20110512T120000Z
]]></artwork></figure>
          
        <figure><preamble>jCal:</preamble><artwork><![CDATA[
["x-complaint-deadline", {}, "unknown", "20110512T120000Z"]
]]></artwork></figure>
        <t>
          The following is an example of how to cope with jCal data where the
          parser was unable to identify the type. Note how the "unknown" value
          type is not added to the iCalendar data and escaping, aside from
          standard JSON string escaping, is not processed.
        </t>
        <figure><preamble>jCal:</preamble><artwork><![CDATA[
["x-coffee-data", {}, "unknown", "Stenophylla;Guinea\\,Africa"]
]]></artwork></figure>
          <figure><preamble>iCalendar:</preamble><artwork><![CDATA[
X-COFFEE-DATA:Stenophylla;Guinea\,Africa
]]></artwork></figure>

        <t>
          The following is an example of a jCal property (where the
          corresponding iCalendar property uses a "INTEGER" value as its
          default), and the equivalent iCalendar representation of that
          property.
        </t>
          
          <figure><preamble>jCal:</preamble><artwork><![CDATA[
["percent-complete", {}, "integer", 95]
]]></artwork></figure>

          <figure><preamble>iCalendar:</preamble><artwork><![CDATA[
PERCENT-COMPLETE:95
]]></artwork></figure>

        <t>
          The following is an example of an unrecognized iCalendar property
          parameter (that uses a "FLOAT" value as its default) specified on a
          recognized iCalendar property, and the equivalent jCal representation
          of that property and property parameter.
        </t>
          
          <figure><preamble>iCalendar:</preamble><artwork><![CDATA[
DTSTART;X-SLACK=30.3;VALUE=DATE:20110512
]]></artwork></figure>
          
          <figure><preamble>jCal:</preamble><artwork><![CDATA[
["dtstart", { "x-slack": "30.3" }, "date", "2011-05-12"]
]]></artwork></figure>
      </section>
    </section>

    <section title="Security Considerations" anchor="security">
      <t>
        This specification defines how iCalendar data can be "translated" between
        two different data formats - the original text format and JSON - with a
        one-to-one mapping to ensure all the semantic data in one format
        (properties, parameters and values) are preserved in the other. It does
        not change the semantic meaning of the underlying data itself, or
        impose or remove any security considerations that apply to the
        underlying data.
      </t>

      <t>
        The use of JSON as a format does have its own inherent security risks
        as discussed in Section 12 of <xref target="RFC7159"/>. Even though JSON
        is considered a safe subset of JavaScript, it should be kept in mind
        that a flaw in the parser processing JSON could still impose a threat
        which doesn't arise with conventional iCalendar data.
      </t>

      <t>
        With this in mind, a parser for JSON data should be used for jCal that
        is aware of the security implications. For example, the use of
        JavaScript's eval() function is considered an unacceptable security
        risk, as described in <xref target="RFC7159"/>, Section 12. A native
        parser with full awareness of the JSON format should be preferred.
      </t>

      <t>
        In addition, it is expected that this new format will result in iCalendar
        data being more widely disseminated (e.g., with use in web applications
        rather than just dedicated calendaring applications).
      </t>

      <t>
        In all cases, application developers have to conform to the semantics
        of the iCalendar data as defined by <xref target="RFC5545"/> and associated
        extensions, and all of the security considerations described in Section
        7 of <xref target="RFC5545"/>, or any associated extensions, are
        applicable.  
      </t>
    </section>

    <section title="IANA Considerations">
      <t>
        This document defines a MIME media type for use with iCalendar in JSON
        data. This media type SHOULD be used for the transfer of calendaring
        data in JSON.
        <list style="hanging">
          <t hangText="Type name:">application</t>
          <t hangText="Subtype name:">calendar+json</t>
          <t hangText="Required parameters:">none</t>
          <t hangText="Optional parameters:">
            "method", "component" and "optinfo" as defined for the text/calendar
            media type in <xref target="RFC5545"/>, Section 8.1.
          </t>
          <t hangText="Encoding considerations:">
            Same as encoding considerations of application/json as specified in
            <xref target="RFC7159"/>, Section 11.
          </t>
          <t hangText="Security considerations:">See <xref target="security"/>.</t>
          <t hangText="Interoperability considerations:">
            This media type provides an alternative format for iCalendar data
            based on JSON.
          </t>
          <t hangText="Published specification:">This specification.</t>
          <t hangText="Applications which use this media type:">
            Applications that currently make use of the text/calendar media
            type can use this as an alternative. Similarly, Applications that
            use the application/json media type to transfer calendaring data
            can use this to further specify the content.
          </t>
          <t hangText="Fragment identifier considerations:">N/A</t>
          <t hangText="Additional information:">
            <list style="hanging">
              <t hangText="Deprecated alias names for this type:">N/A</t>
              <t hangText="Magic number(s):">N/A</t>
              <t hangText="File extension(s):">N/A</t>
              <t hangText="Macintosh file type code(s):">N/A</t>
            </list>
          </t>
          <t hangText="Person &amp; email address to contact for further information:">calsify@ietf.org</t>
          <t hangText="Intended usage:">COMMON</t>
          <t hangText="Restrictions on usage:">
            There are no restrictions on where this media type can be used.
          </t>
          <t hangText="Author:">
            See the "Author's Address" section of this document.
          </t>
          <t hangText="Change controller:">IETF</t>
        </list>
      </t>
      <section title="UNKNOWN iCalendar Value Data Type" anchor="unknown-registration">
        <t>
          IANA is asked to add the following entry to the iCalendar Data Types
          registry:

          <list style="hanging">
            <t hangText="Value name:">UNKNOWN</t>
            <t hangText="Purpose:">
              To allow preserving property values whose default value type is not
              known during round-tripping between jCal and iCalendar.
            </t>
            <t hangText="Format definition:">(Not applicable)</t>
            <t hangText="Description:">
              The UNKNOWN value data type is reserved for the exclusive use of
              the jCal format. Its use is described in
              <xref target="unrecognized"/> of this document. 
            </t>
            <t hangText="Example:">
              As this registration serves as a reservation of the UNKNOWN type so
              that it is not used in iCalendar, there is no applicable iCalendar
              example. Examples of its usage in jCal can be found in this
              document.
            </t>
          </list>
        </t>
        <t>
          IANA is asked to make the "Status" column for this entry in the
          registry say, "Reserved - Do not use" and to make the "Reference"
          column refer to <xref target="unrecognized"/> of this document. 
        </t>
      </section>
    </section>

    <section title="Acknowledgments">
      <t>
        The authors would like to thank the following for their valuable
        contributions: William Gill, Erwin Rehme, and Dave Thewlis, Simon
        Perreault, Michael Angstadt, Peter Saint-Andre, Bert Greevenbosch,
        Javier Godoy. This specification originated from the work of the
        XML-JSON technical committee of the Calendaring and Scheduling
        Consortium.
      </t>
    </section>
  </middle>

  <back>
    <references title="Normative References">
      &rfc2119;
      &rfc5234;
      &rfc4648;
      &rfc5545;
      &rfc6321;
      &rfc3986;
      &rfc6868;
      &rfc7159;
      <reference anchor="ISO.8601.2004">
        <front>
          <title>
            "Data elements and interchange formats -- Information interchange
            -- Representation of dates and times"
          </title>
          <author>
            <organization>International Organization for Standardization</organization>
          </author>
          <date year="2004" month="12"/>
        </front>
        <seriesInfo name="ISO" value="8601"/>
      </reference>
    </references>

    <references title="Informative References">
      &rfc6982;
      <reference anchor="calconnect-artifacts"
                 target="http://www.calconnect.org/artifacts.shtml">
        <front>
          <title>Code Artifacts and Schemas</title>
          <author>
            <organization>The Calendaring and Scheduling Consortium</organization>
          </author>
          <date/>
        </front>
      </reference>
    </references>

    <section title="Implementation Status (to be removed prior to publication as an RFC, as well as the reference to RFC6982)">
      <t>
        This section records the status of known implementations of the
        protocol defined by this specification at the time of posting of this
        Internet-Draft, and is based on a proposal described in
        <xref target="RFC6982"/>. The description of implementations in this
        section is intended to assist the IETF in its decision processes in
        progressing drafts to RFCs. Please note that the listing of any
        individual implementation here does not imply endorsement by the IETF.
        Furthermore, no effort has been spent to verify the information
        presented here that was supplied by IETF contributors.  This is not
        intended as, and must not be construed to be, a catalog of available
        implementations or their features.  Readers are advised to note that
        other implementations may exist.
      </t>

      <t>
        According to <xref target="RFC6982"/>, "this will allow reviewers and
        working groups to assign due consideration to documents that have the
        benefit of running code, which may serve as evidence of valuable
        experimentation and feedback that have made the implemented protocols
        more mature.  It is up to the individual working groups to use this
        information as they see fit".

        <list style="numbers">
          <t>
            ICAL.js - Philipp Kewisch, James Lal. A JavaScript parser for iCalendar (rfc5545)
            <list style="hanging">
              <t hangText="Source:">https://github.com/mozilla-comm/ical.js/</t>
              <t hangText="Maturity:">production</t>
              <t hangText="Coverage:">All aspects of this draft, up to version 01. Includes an online validator. (as of rev 847c67c501, 2013-02-14)</t>
              <t hangText="Licensing:">MPL, Mozilla Public License 2.0</t>
            </list>
          </t>
          <t>
            Py Calendar - Cyrus Daboo. iCalendar/vCard Library
            <list style="hanging">
              <t hangText="Source:">https://svn.calendarserver.org/repository/calendarserver/PyCalendar/branches/json/</t>
              <t hangText="Maturity:">production</t>
              <t hangText="Coverage:">All aspects of this draft, up to version 01.</t>
              <t hangText="Licensing:">Apache License, Version 2.0</t>
            </list>
          </t>
        </list>
      </t>
      <t>
        Additionally, interoperability testing of this draft is an ongoing
        effort under members of calconnect, the Calendaring and Scheduling
        Consortium. CalDAV Vendors are looking into supporting this draft.
      </t>
    </section>

            

    <section anchor="schema" title="ABNF Schema">
      <t>
        Below is an ABNF schema as per <xref target="RFC5234"/> for iCalendar
        in JSON. ABNF Symbols not described here are taken from
        <xref target="RFC7159"/>. The schema is non-normative and given for
        reference only.
      </t>
      
      <t>
        The numeric section numbers given in the comments refer to section in
        <xref target="RFC5545"/>. Additional semantic restrictions apply,
        especially regarding the allowed properties and sub-components per
        component. Details on these restrictions can be found in this document
        and <xref target="RFC5545"/>.
      </t>

      <t>
        Additional schemas may be available on the internet at
        <xref target="calconnect-artifacts"/>.
      </t>

      <figure><artwork type="abnf"><![CDATA[
; A jCal Object is a component with the component-name "vcalendar".
; Restrictions to which properties and sub-components may be
; specified are to be taken from RFC5545.
jcalobject = component

; A jCal component consists of the name string, properties array and
; component array
component = begin-array
            DQUOTE component-name DQUOTE value-separator
            properties-array value-separator
            components-array
            end-array

components-array = begin-array
                   [ component *(value-separator component) ]
                   end-array

; A jCal property consists of the name string, parameters object,
; type string and one or more values as specified in this document.
property = begin-array
           DQUOTE property-name DQUOTE value-separator
           params-object value-separator
           DQUOTE type-name DQUOTE
           property-value *(value-separator property-value)
           end-array
properties-array = begin-array
                   [ property *(value-separator property) ]
                   end-array

; Property values depend on the type-name. Aside from the value types
; mentioned here, extensions may make use of other JSON value types.
; The non-terminal symbol structured-prop-value covers the special
; cases for GEO and REQUEST-STATUS
property-value = simple-prop-value / structured-prop-value
simple-prop-value = string / number / true / false
structured-prop-value = 
    begin-array
    [ structured-element *(value-separator structured-element) ]
    end-array
structured-element = simple-prop-value

; The jCal params-object is a JSON object which follows the semantic
; guidelines described in this document.
params-object = begin-object
                [ params-member *(value-separator params-member) ]
                end-object
params-member = DQUOTE param-name DQUOTE name-separator param-value
param-value = string / param-multi
param-multi = begin-array
              [ string *(value-separator string) ]
              end-array

; The type MUST be a valid type as described by this document. New
; value types can be added by extensions.
type-name = "binary" / "boolean" / "cal-address" / "date" /
            "date-time" / "duration" / "float" / "integer" /
            "period" / "recur" / "text" / "time" / "uri" /
            "utc-offset" / x-type
           

; Component, property, parameter and type names MUST be lowercase.
; Additional semantic restrictions apply as described by this
; document and RFC5545.
component-name = lowercase-name
property-name = lowercase-name
param-name = lowercase-name
x-type = lowercase-name
lowercase-name = 1*(%x61-7A / DIGIT / "-")
]]></artwork></figure>
    </section>

    <section title="Examples">
      <t>
        This section contains two examples of iCalendar objects with their jCal
        representation.
      </t>

      <section title="Example 1">
        <section title="iCalendar Data">
          <figure><artwork><![CDATA[
BEGIN:VCALENDAR 
CALSCALE:GREGORIAN 
PRODID:-//Example Inc.//Example Calendar//EN
VERSION:2.0 
BEGIN:VEVENT 
DTSTAMP:20080205T191224Z 
DTSTART:20081006 
SUMMARY:Planning meeting 
UID:4088E990AD89CB3DBB484909 
END:VEVENT 
END:VCALENDAR 
]]></artwork></figure>
        </section>

        <section title="jCal Data">
          <figure><artwork><![CDATA[
["vcalendar",
  [
    ["calscale", {}, "text", "GREGORIAN"],
    ["prodid", {}, "text", "-//Example Inc.//Example Calendar//EN"],
    ["version", {}, "text", "2.0"]
  ],
  [
    ["vevent",
      [
        ["dtstamp", {}, "date-time", "2008-02-05T19:12:24Z"],
        ["dtstart", {}, "date", "2008-10-06"],
        ["summary", {}, "text", "Planning meeting"],
        ["uid", {}, "text", "4088E990AD89CB3DBB484909"]
      ],
      []
    ]
  ]
]
]]></artwork></figure>
        </section>
      </section>

      <section title="Example 2">

        <section title="iCalendar Data">
          <figure><artwork><![CDATA[
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp.//Example Client//EN
BEGIN:VTIMEZONE
LAST-MODIFIED:20040110T032845Z
TZID:US/Eastern
BEGIN:DAYLIGHT
DTSTART:20000404T020000
RRULE:FREQ=YEARLY;BYDAY=1SU;BYMONTH=4
TZNAME:EDT
TZOFFSETFROM:-0500
TZOFFSETTO:-0400
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20001026T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:EST
TZOFFSETFROM:-0400
TZOFFSETTO:-0500
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060102T120000
DURATION:PT1H
RRULE:FREQ=DAILY;COUNT=5
RDATE;TZID=US/Eastern;VALUE=PERIOD:20060102T150000/PT2H
SUMMARY:Event #2
DESCRIPTION:We are having a meeting all this week at 12 pm fo
 r one hour\, with an additional meeting on the first day 2 h
 ours long.\nPlease bring your own lunch for the 12 pm meetin
 gs.
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
BEGIN:VEVENT
DTSTAMP:20060206T001121Z
DTSTART;TZID=US/Eastern:20060104T140000
DURATION:PT1H
RECURRENCE-ID;TZID=US/Eastern:20060104T120000
SUMMARY:Event #2 bis
UID:00959BC664CA650E933C892C@example.com
END:VEVENT
END:VCALENDAR
]]></artwork></figure>
        </section>

        <section title="jCal Data">
          <figure><artwork><![CDATA[
["vcalendar",
  [
    ["prodid", {}, "text", "-//Example Corp.//Example Client//EN"],
    ["version", {}, "text", "2.0"]
  ],
  [
    ["vtimezone",
      [
        ["last-modified", {}, "date-time", "2004-01-10T03:28:45Z"],
        ["tzid", {}, "text", "US/Eastern"]
      ],
      [
        ["daylight",
          [
            ["dtstart", {}, "date-time", "2000-04-04T02:00:00"],
            ["rrule",
              {},
              "recur",
              {
                "freq": "YEARLY",
                "byday": "1SU",
                "bymonth": 4
              }
            ],
            ["tzname", {}, "text", "EDT"],
            ["tzoffsetfrom", {}, "utc-offset", "-05:00"],
            ["tzoffsetto", {}, "utc-offset", "-04:00"]
          ],
          []
        ],
        ["standard",
          [
            ["dtstart", {}, "date-time", "2000-10-26T02:00:00"],
            ["rrule",
              {},
              "recur",
              {
                "freq": "YEARLY",
                "byday": "1SU",
                "bymonth": 10 
              }
            ],
            ["tzname", {}, "text", "EST"],
            ["tzoffsetfrom", {}, "utc-offset", "-04:00"],
            ["tzoffsetto", {}, "utc-offset", "-05:00"]
          ],
          []
        ]
      ]
    ],
    ["vevent",
      [
        ["dtstamp", {}, "date-time", "2006-02-06T00:11:21Z"],
        ["dtstart",
          { "tzid": "US/Eastern" },
          "date-time",
          "2006-01-02T12:00:00"
        ],
        ["duration", {}, "duration", "PT1H"],
        ["rrule", {}, "recur", { "freq": "DAILY", "count": 5 } ],
        ["rdate",
          { "tzid": "US/Eastern" },
          "period",
          "2006-01-02T15:00:00/PT2H"
        ],
        ["summary", {}, "text", "Event #2"],
        ["description",
         {},
         "text",
         // Note that comments and string concatenation are not
         // allowed per JSON specification and is used here only
         // to avoid long lines.
         "We are having a meeting all this week at 12 pm for one " +
         "hour, with an additional meeting on the first day 2 " +
         "hours long.\nPlease bring your own lunch for the 12 pm " +
         "meetings."
        ],
        ["uid", {}, "text", "00959BC664CA650E933C892C@example.com"]
      ],
      []
    ],
    ["vevent",
      [
        ["dtstamp", {}, "date-time", "2006-02-06T00:11:21Z"],
        ["dtstart",
          { "tzid": "US/Eastern" },
          "date-time",
          "2006-01-02T14:00:00"
        ],
        ["duration", {}, "duration", "PT1H"],
        ["recurrence-id",
          { "tzid": "US/Eastern" },
          "date-time",
          "2006-01-04T12:00:00"
        ],
        ["summary", {}, "text", "Event #2"],
        ["uid", {}, "text", "00959BC664CA650E933C892C@example.com"]
      ],
      []
    ]
  ]
]
]]></artwork></figure>
        </section>
      </section>
    </section>


    <section title='Change History (to be removed prior to publication as an RFC)'>
      <t>
        <list style="hanging">
          <t hangText="draft-kewisch-et-al-icalendar-in-json-01">
            <list style="symbols">
              <t>
                Added information on how to handle multi-value parameter. The
                decision leads to a cleaner draft for a similar proposal for
                vcard.
              </t>
              <t>
                Removed the open discussion point section regarding the mime
                media type in favor of adding one.
              </t>
              <t>
                Minor corrections in wording and typo fixes.
              </t>
            </list>
          </t>
          <t hangText="draft-kewisch-et-al-icalendar-in-json-02">
            <list style="symbols">
              <t>
                Added implementation status section.
              </t>
              <t>
                Removed various text tables that just show a conversion from
                uppercase to lowercase.
              </t>
              <t>
                Changed value format for RECUR and PERIOD types
              </t>
              <t>
                Minor corrections in wording and typo fixes.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-00">
            <list style="symbols">
              <t>
                Publication as a WG draft
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-01">
            <list style="symbols">
              <t>
                Changed handling of GEO and REQUEST-STATUS to align with jCard
              </t>
              <t>
                Corrections and additions to the ABNF Section
              </t>
              <t>
                Added a further sentence on preprocessing and escaping to clarify that JSON escaping must be used.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-02">
            <list style="symbols">
              <t>
                Changed handling of unknown property parameter types.
              </t>
              <t>
                Minor corrections and fixing typos.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-03">
            <list style="symbols">
              <t>
                Changed wording around RECUR value handling.
              </t>
              <t>
                Minor corrections and fixing typos.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-04">
            <list style="symbols">
              <t>
                Changed wording around RECUR value handling again.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-05">
            <list style="symbols">
              <t>
                Added reference to rfc6868 for both directions
              </t>
              <t>
                Resolved a few MAY/SHOULD conflicts
              </t>
              <t>
                Improved UNKNOWN registration by only putting iCalendar related
                information into the registration template.
              </t>
              <t>
                Removed the stream construct, replaced with general information
                on how to handle iCalendar streams.
              </t>
              <t>
                Corrected some examples and ABNF
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-06">
            <list style="symbols">
              <t>
                Corrected trailing commas in some examples.
              </t>
              <t>
                Corrected rrule examples to use object syntax.
              </t>
              <t>
                Corrected "request-status" example to use an array.
              </t>
              <t>
                Updated UNKNOWN registration text as per iCalendar expert suggestion.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-07">
            <list style="symbols">
              <t>
                Minor fix in an example.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-08">
            <list style="symbols">
              <t>
                Editorial changes for alignment with draft-ietf-jcardcal-jcard.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-09">
            <list style="symbols">
              <t>
                Editorial changes in preparation for IETF last call.
              </t>
              <t>
                Removed reference to jcard draft
              </t>
              <t>
                Made more clear that parsers MUST be able to understand both
                single-valued and array data types.
              </t>
            </list>
          </t>
          <t hangText="draft-ietf-jcardcal-jcal-10">
            <list style="symbols">
              <t>
                Updated references from rfc4627 to rfc7159
              </t>
              <t>
                Added a paragraph on number formats between iCalendar and JSON
              </t>
              <t>
                Additions and corrections to conversion from jCal to iCalendar and moved redundant paragraph from Section 3.1 to 4.
              </t>
              <t>
                Addded references to ISO.8501.2004 for ABNF of date/time rules.
              </t>
              <t>
                Fixed typos in informative ABNF
              </t>
            </list>
          </t>
        </list>
      </t>
    </section>
  </back>
</rfc>
