draft-ietf-calext-jscalendar-08.txt   draft-ietf-calext-jscalendar-09.txt 
Calendaring extensions N. Jenkins Calendaring extensions N. Jenkins
Internet-Draft R. Stepanek Internet-Draft R. Stepanek
Intended status: Standards Track FastMail Intended status: Standards Track FastMail
Expires: April 11, 2019 October 8, 2018 Expires: May 9, 2019 November 5, 2018
JSCalendar: A JSON representation of calendar data JSCalendar: A JSON representation of calendar data
draft-ietf-calext-jscalendar-08 draft-ietf-calext-jscalendar-09
Abstract Abstract
This specification defines a data model and JSON representation of This specification defines a data model and JSON representation of
calendar data that can be used for storage and data exchange in a calendar data that can be used for storage and data exchange in a
calendaring and scheduling environment. It aims to be an alternative calendaring and scheduling environment. It aims to be an alternative
to the widely deployed iCalendar data format and to be unambiguous, to the widely deployed iCalendar data format and to be unambiguous,
extendable and simple to process. extendable and simple to process.
Status of This Memo Status of This Memo
skipping to change at page 1, line 34 skipping to change at page 1, line 34
Internet-Drafts are working documents of the Internet Engineering Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF). Note that other groups may also distribute Task Force (IETF). Note that other groups may also distribute
working documents as Internet-Drafts. The list of current Internet- working documents as Internet-Drafts. The list of current Internet-
Drafts is at https://datatracker.ietf.org/drafts/current/. Drafts is at https://datatracker.ietf.org/drafts/current/.
Internet-Drafts are draft documents valid for a maximum of six months Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress." material or to cite them other than as "work in progress."
This Internet-Draft will expire on April 11, 2019. This Internet-Draft will expire on May 9, 2019.
Copyright Notice Copyright Notice
Copyright (c) 2018 IETF Trust and the persons identified as the Copyright (c) 2018 IETF Trust and the persons identified as the
document authors. All rights reserved. document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents Provisions Relating to IETF Documents
(https://trustee.ietf.org/license-info) in effect on the date of (https://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents publication of this document. Please review these documents
skipping to change at page 2, line 39 skipping to change at page 2, line 39
4.1.4. prodId . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.4. prodId . . . . . . . . . . . . . . . . . . . . . . . 11
4.1.5. created . . . . . . . . . . . . . . . . . . . . . . . 11 4.1.5. created . . . . . . . . . . . . . . . . . . . . . . . 11
4.1.6. updated . . . . . . . . . . . . . . . . . . . . . . . 12 4.1.6. updated . . . . . . . . . . . . . . . . . . . . . . . 12
4.1.7. sequence . . . . . . . . . . . . . . . . . . . . . . 12 4.1.7. sequence . . . . . . . . . . . . . . . . . . . . . . 12
4.1.8. method . . . . . . . . . . . . . . . . . . . . . . . 12 4.1.8. method . . . . . . . . . . . . . . . . . . . . . . . 12
4.2. What and where properties . . . . . . . . . . . . . . . . 12 4.2. What and where properties . . . . . . . . . . . . . . . . 12
4.2.1. title . . . . . . . . . . . . . . . . . . . . . . . . 12 4.2.1. title . . . . . . . . . . . . . . . . . . . . . . . . 12
4.2.2. description . . . . . . . . . . . . . . . . . . . . . 12 4.2.2. description . . . . . . . . . . . . . . . . . . . . . 12
4.2.3. descriptionContentType . . . . . . . . . . . . . . . 12 4.2.3. descriptionContentType . . . . . . . . . . . . . . . 12
4.2.4. locations . . . . . . . . . . . . . . . . . . . . . . 13 4.2.4. locations . . . . . . . . . . . . . . . . . . . . . . 13
4.2.5. virtualLocations . . . . . . . . . . . . . . . . . . 13 4.2.5. virtualLocations . . . . . . . . . . . . . . . . . . 14
4.2.6. links . . . . . . . . . . . . . . . . . . . . . . . . 14 4.2.6. links . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2.7. locale . . . . . . . . . . . . . . . . . . . . . . . 15 4.2.7. locale . . . . . . . . . . . . . . . . . . . . . . . 15
4.2.8. keywords . . . . . . . . . . . . . . . . . . . . . . 15 4.2.8. keywords . . . . . . . . . . . . . . . . . . . . . . 16
4.2.9. categories . . . . . . . . . . . . . . . . . . . . . 16 4.2.9. categories . . . . . . . . . . . . . . . . . . . . . 16
4.2.10. color . . . . . . . . . . . . . . . . . . . . . . . . 16 4.2.10. color . . . . . . . . . . . . . . . . . . . . . . . . 16
4.3. Recurrence properties . . . . . . . . . . . . . . . . . . 16 4.3. Recurrence properties . . . . . . . . . . . . . . . . . . 16
4.3.1. recurrenceRule . . . . . . . . . . . . . . . . . . . 16 4.3.1. recurrenceRule . . . . . . . . . . . . . . . . . . . 16
4.3.2. recurrenceOverrides . . . . . . . . . . . . . . . . . 21 4.3.2. recurrenceOverrides . . . . . . . . . . . . . . . . . 21
4.3.3. excluded . . . . . . . . . . . . . . . . . . . . . . 22 4.3.3. excluded . . . . . . . . . . . . . . . . . . . . . . 22
4.4. Sharing and scheduling properties . . . . . . . . . . . . 22 4.4. Sharing and scheduling properties . . . . . . . . . . . . 22
4.4.1. priority . . . . . . . . . . . . . . . . . . . . . . 22 4.4.1. priority . . . . . . . . . . . . . . . . . . . . . . 22
4.4.2. freeBusyStatus . . . . . . . . . . . . . . . . . . . 22 4.4.2. freeBusyStatus . . . . . . . . . . . . . . . . . . . 22
4.4.3. privacy . . . . . . . . . . . . . . . . . . . . . . . 23 4.4.3. privacy . . . . . . . . . . . . . . . . . . . . . . . 23
4.4.4. replyTo . . . . . . . . . . . . . . . . . . . . . . . 24 4.4.4. replyTo . . . . . . . . . . . . . . . . . . . . . . . 24
4.4.5. participants . . . . . . . . . . . . . . . . . . . . 24 4.4.5. participants . . . . . . . . . . . . . . . . . . . . 24
4.5. Alerts properties . . . . . . . . . . . . . . . . . . . . 27 4.5. Alerts properties . . . . . . . . . . . . . . . . . . . . 28
4.5.1. useDefaultAlerts . . . . . . . . . . . . . . . . . . 27 4.5.1. useDefaultAlerts . . . . . . . . . . . . . . . . . . 28
4.5.2. alerts . . . . . . . . . . . . . . . . . . . . . . . 28 4.5.2. alerts . . . . . . . . . . . . . . . . . . . . . . . 28
4.6. Multilingual properties . . . . . . . . . . . . . . . . . 29 4.6. Multilingual properties . . . . . . . . . . . . . . . . . 29
4.6.1. localizations . . . . . . . . . . . . . . . . . . . . 29 4.6.1. localizations . . . . . . . . . . . . . . . . . . . . 29
5. Type-specific JSCalendar properties . . . . . . . . . . . . . 30 5. Type-specific JSCalendar properties . . . . . . . . . . . . . 30
5.1. JSEvent properties . . . . . . . . . . . . . . . . . . . 30 5.1. JSEvent properties . . . . . . . . . . . . . . . . . . . 30
5.1.1. start . . . . . . . . . . . . . . . . . . . . . . . . 30 5.1.1. start . . . . . . . . . . . . . . . . . . . . . . . . 31
5.1.2. timeZone . . . . . . . . . . . . . . . . . . . . . . 30 5.1.2. timeZone . . . . . . . . . . . . . . . . . . . . . . 31
5.1.3. duration . . . . . . . . . . . . . . . . . . . . . . 30 5.1.3. duration . . . . . . . . . . . . . . . . . . . . . . 31
5.1.4. isAllDay . . . . . . . . . . . . . . . . . . . . . . 31 5.1.4. isAllDay . . . . . . . . . . . . . . . . . . . . . . 31
5.1.5. status . . . . . . . . . . . . . . . . . . . . . . . 31 5.1.5. status . . . . . . . . . . . . . . . . . . . . . . . 32
5.2. JSTask properties . . . . . . . . . . . . . . . . . . . . 32 5.2. JSTask properties . . . . . . . . . . . . . . . . . . . . 32
5.2.1. due . . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.1. due . . . . . . . . . . . . . . . . . . . . . . . . . 32
5.2.2. start . . . . . . . . . . . . . . . . . . . . . . . . 32 5.2.2. start . . . . . . . . . . . . . . . . . . . . . . . . 32
5.2.3. timeZone . . . . . . . . . . . . . . . . . . . . . . 32 5.2.3. timeZone . . . . . . . . . . . . . . . . . . . . . . 32
5.2.4. estimatedDuration . . . . . . . . . . . . . . . . . . 32 5.2.4. estimatedDuration . . . . . . . . . . . . . . . . . . 33
5.2.5. statusUpdatedAt . . . . . . . . . . . . . . . . . . . 32 5.2.5. statusUpdatedAt . . . . . . . . . . . . . . . . . . . 33
5.2.6. isAllDay . . . . . . . . . . . . . . . . . . . . . . 33 5.2.6. isAllDay . . . . . . . . . . . . . . . . . . . . . . 33
5.2.7. progress . . . . . . . . . . . . . . . . . . . . . . 33 5.2.7. progress . . . . . . . . . . . . . . . . . . . . . . 33
5.2.8. status . . . . . . . . . . . . . . . . . . . . . . . 33 5.2.8. status . . . . . . . . . . . . . . . . . . . . . . . 34
5.3. JSGroup properties . . . . . . . . . . . . . . . . . . . 34 5.3. JSGroup properties . . . . . . . . . . . . . . . . . . . 35
5.3.1. entries . . . . . . . . . . . . . . . . . . . . . . . 35 5.3.1. entries . . . . . . . . . . . . . . . . . . . . . . . 35
5.3.2. source . . . . . . . . . . . . . . . . . . . . . . . 35 5.3.2. source . . . . . . . . . . . . . . . . . . . . . . . 35
6. Conversion from and to iCalendar . . . . . . . . . . . . . . 35 6. Conversion from and to iCalendar . . . . . . . . . . . . . . 35
6.1. JSEvent . . . . . . . . . . . . . . . . . . . . . . . . . 35 6.1. JSEvent . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.2. JSTask . . . . . . . . . . . . . . . . . . . . . . . . . 36 6.2. JSTask . . . . . . . . . . . . . . . . . . . . . . . . . 36
6.3. JSGroup . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.3. JSGroup . . . . . . . . . . . . . . . . . . . . . . . . . 38
6.4. Common properties . . . . . . . . . . . . . . . . . . . . 38 6.4. Common properties . . . . . . . . . . . . . . . . . . . . 38
6.5. Locations and participants . . . . . . . . . . . . . . . 40 6.5. Locations and participants . . . . . . . . . . . . . . . 40
6.6. Unknown properties . . . . . . . . . . . . . . . . . . . 43 6.6. Unknown properties . . . . . . . . . . . . . . . . . . . 43
7. JSCalendar object examples . . . . . . . . . . . . . . . . . 43 7. JSCalendar object examples . . . . . . . . . . . . . . . . . 43
7.1. Simple event . . . . . . . . . . . . . . . . . . . . . . 43 7.1. Simple event . . . . . . . . . . . . . . . . . . . . . . 43
7.2. Simple task . . . . . . . . . . . . . . . . . . . . . . . 44 7.2. Simple task . . . . . . . . . . . . . . . . . . . . . . . 44
7.3. Simple group . . . . . . . . . . . . . . . . . . . . . . 44 7.3. Simple group . . . . . . . . . . . . . . . . . . . . . . 44
7.4. All-day event . . . . . . . . . . . . . . . . . . . . . . 44 7.4. All-day event . . . . . . . . . . . . . . . . . . . . . . 44
7.5. Task with a due date . . . . . . . . . . . . . . . . . . 45 7.5. Task with a due date . . . . . . . . . . . . . . . . . . 45
7.6. Event with end time-zone . . . . . . . . . . . . . . . . 45 7.6. Event with end time zone . . . . . . . . . . . . . . . . 45
7.7. Floating-time event (with recurrence) . . . . . . . . . . 46 7.7. Floating-time event (with recurrence) . . . . . . . . . . 46
7.8. Event with multiple locations and localization . . . . . 46 7.8. Event with multiple locations and localization . . . . . 46
7.9. Recurring event with overrides . . . . . . . . . . . . . 47 7.9. Recurring event with overrides . . . . . . . . . . . . . 47
7.10. Recurring event with participants . . . . . . . . . . . . 48 7.10. Recurring event with participants . . . . . . . . . . . . 48
8. Security Considerations . . . . . . . . . . . . . . . . . . . 50 8. Security Considerations . . . . . . . . . . . . . . . . . . . 50
9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50 9. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 50
10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 50 10. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 50
11. References . . . . . . . . . . . . . . . . . . . . . . . . . 50 11. References . . . . . . . . . . . . . . . . . . . . . . . . . 50
11.1. Normative References . . . . . . . . . . . . . . . . . . 50 11.1. Normative References . . . . . . . . . . . . . . . . . . 50
11.2. Informative References . . . . . . . . . . . . . . . . . 52 11.2. Informative References . . . . . . . . . . . . . . . . . 52
skipping to change at page 4, line 36 skipping to change at page 4, line 36
iCalendar data format ([RFC5545], also see Section 1.1), but the iCalendar data format ([RFC5545], also see Section 1.1), but the
specification should add new attributes or value types, or not specification should add new attributes or value types, or not
support existing ones, where appropriate. Conversion between the support existing ones, where appropriate. Conversion between the
data formats need not fully preserve semantic meaning. data formats need not fully preserve semantic meaning.
o Extensions, such as new properties and components, MUST NOT lead o Extensions, such as new properties and components, MUST NOT lead
to requiring an update to this document. to requiring an update to this document.
The representation of this data model is defined in the I-JSON format The representation of this data model is defined in the I-JSON format
[RFC7493], which is a strict subset of the JavaScript Object Notation [RFC7493], which is a strict subset of the JavaScript Object Notation
(JSON) Data Interchange Format [RFC8259]. Using JSON mostly is a (JSON) Data Interchange Format [RFC8259]. Using JSON is mostly a
pragmatic choice: its widespread use should help to speed up pragmatic choice: its widespread use makes JSCalendar easier to
JSCalendar adoption and a wide range of production-ready JSON adopt, and the ready availability of production-ready JSON
implementations allows to decrease interoperability issues. implementations eliminates a whole category of parser-related
interoperability issues.
1.1. Relation to the iCalendar format 1.1. Relation to the iCalendar format
The iCalendar data format [RFC5545], a widely deployed interchange The iCalendar data format [RFC5545], a widely deployed interchange
format for calendaring and scheduling data, has served calendaring format for calendaring and scheduling data, has served calendaring
vendors for a long while, but contains some ambiguities and pitfalls vendors for a long while, but contains some ambiguities and pitfalls
that can not be overcome without backward-incompatible changes. that can not be overcome without backward-incompatible changes.
For example, iCalendar defines various formats for local times, UTC For example, iCalendar defines various formats for local times, UTC
time and dates, which confuses new users. Other sources for errors time and dates, which confuses new users. Other sources for errors
are the requirement for custom time-zone definitions within a single are the requirement for custom time zone definitions within a single
calendar component, as well as the iCalendar format itself; the calendar component, as well as the iCalendar format itself; the
latter causing interoperability issues due to misuse of CR LF latter causing interoperability issues due to misuse of CR LF
terminated strings, line continuations and subtle differences between terminated strings, line continuations and subtle differences between
iCalendar parsers. Lastly, up until recently the iCalendar format iCalendar parsers. Lastly, up until recently the iCalendar format
did not allow to express the difference between two calendar did not have a way to express a concise difference between two
components, which results in verbose exchanges during scheduling. calendar components, which results in verbose exchanges during
scheduling.
Some of these issues were addressed by the jCal [RFC7265] format, Some of these issues were addressed by the jCal [RFC7265] format,
which is a direct mapping between iCalendar and JSON. However, it which is a direct mapping between iCalendar and JSON. However, it
did not attempt to extend or update iCalendar semantics. did not attempt to extend or update iCalendar semantics.
1.2. Notational Conventions 1.2. Notational Conventions
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119]. document are to be interpreted as described in [RFC2119].
The underlying format used for this specification is JSON. The underlying format used for this specification is JSON.
Consequently, the terms "object" and "array" as well as the four Consequently, the terms "object" and "array" as well as the four
primitive types (strings, numbers, booleans, and null) are to be primitive types (strings, numbers, booleans, and null) are to be
interpreted as described in Section 1 of[RFC8259]. interpreted as described in Section 1 of [RFC8259].
Some examples in this document contain "partial" JSON documents used Some examples in this document contain "partial" JSON documents used
for illustrative purposes. In these examples, three periods "..." for illustrative purposes. In these examples, three periods "..."
are used to indicate a portion of the document that has been removed are used to indicate a portion of the document that has been removed
for compactness. for compactness.
2. JSCalendar objects 2. JSCalendar objects
This section describes the calendar object types specified by This section describes the calendar object types specified by
JSCalendar. JSCalendar.
skipping to change at page 7, line 27 skipping to change at page 7, line 27
each date-time. each date-time.
For example "2010-10-10T10:10:10.003Z" is OK, but For example "2010-10-10T10:10:10.003Z" is OK, but
"2010-10-10T10:10:10.000Z" is invalid and MUST be encoded as "2010-10-10T10:10:10.000Z" is invalid and MUST be encoded as
"2010-10-10T10:10:10Z". "2010-10-10T10:10:10Z".
In common notation, it should be of the form "YYYY-MM-DDTHH:MM:SSZ". In common notation, it should be of the form "YYYY-MM-DDTHH:MM:SSZ".
3.2.2. LocalDate 3.2.2. LocalDate
This is a date-time string _with no time-zone/offset information_. This is a date-time string _with no time zone/offset information_.
It is otherwise in the same format as UTCDate: "YYYY-MM-DDTHH:MM:SS". It is otherwise in the same format as UTCDate: "YYYY-MM-DDTHH:MM:SS".
The time-zone to associate the LocalDate with comes from an The time zone to associate the LocalDate with comes from an
associated property, or if no time-zone is associated it defines associated property, or if no time zone is associated it defines
_floating time_. Floating date-times are not tied to any specific _floating time_. Floating date-times are not tied to any specific
time-zone. Instead, they occur in every timezone at the same _wall- time zone. Instead, they occur in every timezone at the same _wall-
clock_ time (as opposed to the same instant point in time). clock_ time (as opposed to the same instant point in time).
3.2.3. Duration 3.2.3. Duration
A duration is represented by a subset of ISO8601 duration format, as A duration is represented by a subset of ISO8601 duration format, as
specified by the following ABNF: specified by the following ABNF:
dur-secfrac = "." 1*DIGIT dur-secfrac = "." 1*DIGIT
dur-second = 1*DIGIT [dur-secfrac] "S" dur-second = 1*DIGIT [dur-secfrac] "S"
dur-minute = 1*DIGIT "M" [dur-second] dur-minute = 1*DIGIT "M" [dur-second]
skipping to change at page 10, line 25 skipping to change at page 10, line 25
4.1.2. uid 4.1.2. uid
Type: "String" Type: "String"
A globally unique identifier, used to associate the object as the A globally unique identifier, used to associate the object as the
same across different systems, calendars and views. The value of same across different systems, calendars and views. The value of
this property MUST be unique across _all_ JSCalendar objects, even if this property MUST be unique across _all_ JSCalendar objects, even if
they are of different type. [RFC4122] describes a range of they are of different type. [RFC4122] describes a range of
established algorithms to generate universally unique identifiers established algorithms to generate universally unique identifiers
(UUID), and the random or pseudo-random version is recommended to (UUID), and the random or pseudo-random version is recommended.
use.
For compatibility with [RFC5545] UIDs, implementations MUST be able For compatibility with [RFC5545] UIDs, implementations MUST be able
to receive and persist values of at least 255 octets for this to receive and persist values of at least 255 octets for this
property, but they MUST NOT truncate values in the middle of a UTF-8 property, but they MUST NOT truncate values in the middle of a UTF-8
multi-octet sequence. multi-octet sequence.
A valid JSCalendar object MUST include this property. A valid JSCalendar object MUST include this property.
4.1.3. relatedTo 4.1.3. relatedTo
Type: "String[Relation]" (optional) Type: "String[Relation]" (optional)
Relates the object to other JSCalendar objects. This is represented Relates the object to other JSCalendar objects. This is represented
as a map of the UIDs of the related objects to information about the as a map of the UIDs of the related objects to information about the
relation. relation.
A *Relation* object has the following properties: A *Relation* object has the following properties:
o *relation*: "String[Boolean]" Describes how the linked object is o *relation*: "String[Boolean]" (optional) Describes how the linked
related to this object as a set of relation types. object is related to this object as a set of relation types. If
not null, the set MUST NOT be empty.
Keys in the set MUST be one of the following values, defined in a Keys in the set MUST be one of the following values, defined in a
future specification or a vendor-specific value: future specification or a vendor-specific value:
* "first": The linked object is the first in the series this * "first": The linked object is the first in the series this
object is part of. object is part of.
* "next": The linked object is the next in the series this object * "next": The linked object is the next in the series this object
is part of. is part of.
skipping to change at page 13, line 35 skipping to change at page 13, line 35
This MUST be either one of the following values, registered in a This MUST be either one of the following values, registered in a
future RFC, or a vendor-specific value. Any value the client or future RFC, or a vendor-specific value. Any value the client or
server doesn't understand should be treated the same as if this server doesn't understand should be treated the same as if this
property is omitted. property is omitted.
* "start": The JSCalendar object starts at this location. * "start": The JSCalendar object starts at this location.
* "end": The JSCalendar object ends at this location. * "end": The JSCalendar object ends at this location.
o *timeZone*: "String" (optional) A time-zone for this location. o *timeZone*: "String" (optional) A time zone for this location.
o *coordinates*: "String" (optional) An [RFC5870] "geo:" URI for the o *coordinates*: "String" (optional) An [RFC5870] "geo:" URI for the
location. location.
o *linkIds*: "String[]" (optional) A list of ids for links to o *linkIds*: "String[Boolean]" (optional) A set of link ids for
alternate representations of this location. links to alternate representations of this location. Each key in
the set MUST be the identifier of a Link object defined in the
*links* property of this calendar object. The value for each key
in the set MUST be "true". This MUST be omitted if none (rather
than an empty set).
For example, an alternative representation could be in vCard For example, an alternative representation could be in vCard
format. format.
4.2.5. virtualLocations 4.2.5. virtualLocations
Type: "String[VirtualLocation]" (optional) Type: "String[VirtualLocation]" (optional)
A map of ids to VirtualLocation objects, representing virtual A map of ids to VirtualLocation objects, representing virtual
locations, such as video conferences or chat rooms, associated with locations, such as video conferences or chat rooms, associated with
skipping to change at page 17, line 16 skipping to change at page 17, line 25
* "daily" * "daily"
* "hourly" * "hourly"
* "minutely" * "minutely"
* "secondly" * "secondly"
To convert from iCalendar, simply lower-case the FREQ part. To convert from iCalendar, simply lower-case the FREQ part.
o *interval*: "Number"(optional, default:"1") The INTERVAL part from o *interval*: "Number" (optional, default:"1") The INTERVAL part
iCal. If included, it MUST be an integer "x >= 1". from iCal. If included, it MUST be an integer "x >= 1".
o *rscale*: "String"(optional, default:""gregorian"") The RSCALE o *rscale*: "String" (optional, default:""gregorian"") The RSCALE
part from iCalendar RSCALE [RFC7529], converted to lower-case. part from iCalendar RSCALE [RFC7529], converted to lower-case.
o *skip*: "String"(optional, default:""omit"") The SKIP part from o *skip*: "String" (optional, default:""omit"") The SKIP part from
iCalendar RSCALE [RFC7529], converted to lower-case. iCalendar RSCALE [RFC7529], converted to lower-case.
o *firstDayOfWeek*: "String"(optional, default:""mo"") The WKST part o *firstDayOfWeek*: "String" (optional, default:""mo"") The WKST
from iCalendar, represented as a lower-case abbreviated two-letter part from iCalendar, represented as a lower-case abbreviated two-
English day of the week. If included, it MUST be one of the letter English day of the week. If included, it MUST be one of
following values: ""mo"|"tu"|"we"|"th"|"fr"|"sa"|"su"". the following values: ""mo"|"tu"|"we"|"th"|"fr"|"sa"|"su"".
o *byDay*: "NDay[]" (optional) An *NDay* object has the following o *byDay*: "NDay[]" (optional) An *NDay* object has the following
properties: properties:
* *day*: "String" The day-of-the-week part of the BYDAY value in * *day*: "String" The day-of-the-week part of the BYDAY value in
iCalendar, lower-cased. MUST be one of the following values: iCalendar, lower-cased. MUST be one of the following values:
""mo"|"tu"|"we"|"th"|"fr"|"sa"|"su"". ""mo"|"tu"|"we"|"th"|"fr"|"sa"|"su"".
* *nthOfPeriod*: "Number" (optional) The ordinal part of the * *nthOfPeriod*: "Number" (optional) The ordinal part of the
BYDAY value in iCalendar (e.g. ""+1"" or ""-3""). If present, BYDAY value in iCalendar (e.g. ""+1"" or ""-3""). If present,
skipping to change at page 18, line 7 skipping to change at page 18, line 15
o *byMonthDay*: "Number[]" (optional) The BYMONTHDAY part from o *byMonthDay*: "Number[]" (optional) The BYMONTHDAY part from
iCalendar. The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *byMonth*: "String[]" (optional) The BYMONTH part from iCalendar. o *byMonth*: "String[]" (optional) The BYMONTH part from iCalendar.
Each entry is a string representation of a number, starting from Each entry is a string representation of a number, starting from
"1" for the first month in the calendar (e.g. ""1" " means "1" for the first month in the calendar (e.g. ""1" " means
""January"" with Gregorian calendar), with an optional ""L"" ""January"" with Gregorian calendar), with an optional ""L""
suffix (see [RFC7529]) for leap months (this MUST be upper-case, suffix (see [RFC7529]) for leap months (this MUST be upper-case,
e.g. ""3L""). The array MUST have at least one entry if included. e.g. ""3L""). The array MUST have at least one entry if included.
o *byYearDay*: "Number[]"(optional) The BYYEARDAY part from o *byYearDay*: "Number[]" (optional) The BYYEARDAY part from
iCalendar. The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *byWeekNo*: "Number[]"(optional) The BYWEEKNO part from iCalendar. o *byWeekNo*: "Number[]" (optional) The BYWEEKNO part from
The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *byHour*: "Number[]"(optional) The BYHOUR part from iCalendar. o *byHour*: "Number[]" (optional) The BYHOUR part from iCalendar.
The array MUST have at least one entry if included. The array MUST have at least one entry if included.
o *byMinute*: "Number[]"(optional) The BYMINUTE part from iCalendar. o *byMinute*: "Number[]" (optional) The BYMINUTE part from
The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *bySecond*: "Number[]"(optional) The BYSECOND part from iCalendar. o *bySecond*: "Number[]" (optional) The BYSECOND part from
The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *bySetPosition*: "Number[]"(optional) The BYSETPOS part from o *bySetPosition*: "Number[]" (optional) The BYSETPOS part from
iCalendar. The array MUST have at least one entry if included. iCalendar. The array MUST have at least one entry if included.
o *count*: "Number"(optional) The COUNT part from iCalendar. This o *count*: "Number" (optional) The COUNT part from iCalendar. This
MUST NOT be included if an *until* property is specified. MUST NOT be included if an *until* property is specified.
o *until*: "LocalDate"(optional) The UNTIL part from iCalendar. o *until*: "LocalDate" (optional) The UNTIL part from iCalendar.
This MUST NOT be included if a *count* property is specified. This MUST NOT be included if a *count* property is specified.
Note, as in iCalendar, this date is presumed to be in the time- Note, as in iCalendar, this date is presumed to be in the time
zone specified in *timeZone*. It is not a UTC time. zone specified in *timeZone*. It is not a UTC time.
A recurrence rule specifies a set of set of date-times for recurring A recurrence rule specifies a set of set of date-times for recurring
calendar objects. A recurrence rule has the following semantics: calendar objects. A recurrence rule has the following semantics:
1. A set of candidates is generated. This is every second within a 1. A set of candidates is generated. This is every second within a
period defined by the frequency property: period defined by the frequency property:
* *yearly*: every second from midnight on the 1st January * *yearly*: every second from midnight on the 1st January
(inclusive) to midnight the following 1st January (exclusive) (inclusive) to midnight the following 1st January (exclusive)
skipping to change at page 22, line 19 skipping to change at page 22, line 30
o replyTo o replyTo
4.3.3. excluded 4.3.3. excluded
Type: "Boolean" (optional, default:"false") Type: "Boolean" (optional, default:"false")
Defines if this object is an overridden, excluded instance of a Defines if this object is an overridden, excluded instance of a
recurring JSCalendar object (also see Section 4.3.2). If this recurring JSCalendar object (also see Section 4.3.2). If this
property value is "true", this calendar object instance MUST be property value is "true", this calendar object instance MUST be
treated as if not existent. removed from the occurrence expansion.
4.4. Sharing and scheduling properties 4.4. Sharing and scheduling properties
4.4.1. priority 4.4.1. priority
Type: "Number" (optional, default:"0") Type: "Number" (optional, default:"0")
Specifies a priority for the calendar object. This may be used as Specifies a priority for the calendar object. This may be used as
part of scheduling systems to help resolve conflicts for a time part of scheduling systems to help resolve conflicts for a time
period. period.
The priority is specified as an integer in the range 0 to 9. A value The priority is specified as an integer in the range 0 to 9. A value
of 0 specifies an undefined priority. A value of 1 is the highest of 0 specifies an undefined priority. A value of 1 is the highest
priority. A value of 2 is the second highest priority. Subsequent priority. A value of 2 is the second highest priority. Subsequent
numbers specify a decreasing ordinal priority. A value of 9 is the numbers specify a decreasing ordinal priority. A value of 9 is the
lowest priority. Other integer values are reserved for future use. lowest priority. Other integer values are reserved for future use.
4.4.2. freeBusyStatus 4.4.2. freeBusyStatus
Type: "String"(optional, default:"busy") Type: "String" (optional, default:"busy")
Specifies how this property should be treated when calculating free- Specifies how this property should be treated when calculating free-
busy state. The value MUST be one of: busy state. The value MUST be one of:
o ""free"": The object should be ignored when calculating whether o ""free"": The object should be ignored when calculating whether
the user is busy. the user is busy.
o ""busy"": The object should be included when calculating whether o ""busy"": The object should be included when calculating whether
the user is busy. the user is busy.
4.4.3. privacy 4.4.3. privacy
Type: "String"(optional, default:"public") Type: "String" (optional, default:"public")
Calendar objects are normally collected together and may be shared Calendar objects are normally collected together and may be shared
with other users. The privacy property allows the object owner to with other users. The privacy property allows the object owner to
indicate that it should not be shared, or should only have the time indicate that it should not be shared, or should only have the time
information shared but the details withheld. Enforcement of the information shared but the details withheld. Enforcement of the
restrictions indicated by this property are up to the restrictions indicated by this property are up to the
implementations. implementations.
This property MUST NOT affect the information sent to scheduled This property MUST NOT affect the information sent to scheduled
participants; it is only interpreted when the object is shared as participants; it is only interpreted when the object is shared as
skipping to change at page 24, line 14 skipping to change at page 24, line 22
o "secret": The object is hidden completely (as though it did not o "secret": The object is hidden completely (as though it did not
exist) when the calendar is shared. exist) when the calendar is shared.
4.4.4. replyTo 4.4.4. replyTo
Type: "String[String]" (optional) Type: "String[String]" (optional)
Represents methods by which participants may submit their RSVP Represents methods by which participants may submit their RSVP
response to the organizer of the calendar object. The keys in the response to the organizer of the calendar object. The keys in the
property value are the available methods. The value is a URI to use property value are the available methods and MUST only contain ASCII
that method. Future methods may be defined in future specifications; alphanumeric characters (A-Za-z0-9). The value is a URI to use that
a calendar client MUST ignore any method it does not understand, but method. Future methods may be defined in future specifications; a
MUST preserve the method key and URI. calendar client MUST ignore any method it does not understand, but
MUST preserve the method key and URI. This property MUST be omitted
if no method is defined (rather than an empty object).
The following methods are defined: The following methods are defined:
o "imip": The organizer accepts an iMIP [RFC6047] response at this o "imip": The organizer accepts an iMIP [RFC6047] response at this
email address. The value MUST be a "mailto:" URI. email address. The value MUST be a "mailto:" URI.
o "web": Opening this URI in a web browser will provide the user
with a page where they can submit a reply to the organizer.
o "other": The organizer is identified by this URI but the method o "other": The organizer is identified by this URI but the method
how to submit the RSVP is undefined. how to submit the RSVP is undefined.
4.4.5. participants 4.4.5. participants
Type: "String[Participant]" (optional) Type: "String[Participant]" (optional)
A map of participant ids to participants, describing their A map of participant ids to participants, describing their
participation in the calendar object. A participant id MUST unique participation in the calendar object. A participant id MUST be
to this calendar object; a UUID or the base-64 encoded email address unique to this calendar object; a UUID or the base-64 encoded email
of the participant is a good choice. address of the participant is a good choice.
A *Participant* object has the following properties: A *Participant* object has the following properties:
o *name*: "String" The display name of the participant (e.g. "Joe o *name*: "String" (optional) The display name of the participant
Bloggs"). (e.g. "Joe Bloggs").
o *email*: "String" (optional) The email address for the o *email*: "String" (optional) The email address for the
participant. participant.
o *sendTo*: "String[String]" Represents methods by which the o *sendTo*: "String[String]" Represents methods by which the
participant may receive the invitation and updates to the calendar participant may receive the invitation and updates to the calendar
object. object.
The keys in the property value are the available methods. The The keys in the property value are the available methods and MUST
value is a URI to use that method. Future methods may be defined only contain ASCII alphanumeric characters (A-Za-z0-9). The value
in future specifications; a calendar client MUST ignore any method is a URI to use that method. Future methods may be defined in
it does not understand, but MUST preserve the method key and URI. future specifications; a calendar client MUST ignore any method it
does not understand, but MUST preserve the method key and URI.
This property MUST be omitted if no method is defined (rather than
an empty object).
The following methods are defined: The following methods are defined:
* "imip": The participant accepts an iMIP [RFC6047] request at * "imip": The participant accepts an iMIP [RFC6047] request at
this email address. The value MUST be a "mailto:" URI. It MAY this email address. The value MUST be a "mailto:" URI. It MAY
be different from the value of the participant's *email* be different from the value of the participant's *email*
property. property.
* "other": The participant is identified by this URI but the * "other": The participant is identified by this URI but the
method how to submit the invitation or update is undefined. method how to submit the invitation or update is undefined.
skipping to change at page 26, line 9 skipping to change at page 26, line 28
unknown to the implementation MUST be preserved and MAY be unknown to the implementation MUST be preserved and MAY be
ignored. ignored.
o *locationId*: "String" (optional) The location at which this o *locationId*: "String" (optional) The location at which this
participant is expected to be attending. participant is expected to be attending.
If the value does not correspond to any location id in the If the value does not correspond to any location id in the
*locations* property of the instance, this MUST be treated the *locations* property of the instance, this MUST be treated the
same as if the participant's locationId were omitted. same as if the participant's locationId were omitted.
o *participationStatus*: "String"(optional, default:"needs-action") o *participationStatus*: "String" (optional, default:"needs-action")
The participation status, if any, of this participant. The participation status, if any, of this participant.
The value MUST be either one of the following values, registered The value MUST be either one of the following values, registered
in a future RFC, or a vendor-specific value: in a future RFC, or a vendor-specific value:
* "needs-action": No status yet set by the participant. * "needs-action": No status yet set by the participant.
* "accepted": The invited participant will participate. * "accepted": The invited participant will participate.
* "declined": The invited participant will not participate. * "declined": The invited participant will not participate.
* "tentative": The invited participant may participate. * "tentative": The invited participant may participate.
o *attendance*: "String"(optional, default:"required") The required o *attendance*: "String" (optional, default:"required") The required
attendance of this participant. attendance of this participant.
The value MUST be either one of the following values, registered The value MUST be either one of the following values, registered
in a future RFC, or a vendor-specific value. Any value the client in a future RFC, or a vendor-specific value. Any value the client
or server doesn't understand should be treated the same as or server doesn't understand should be treated the same as
"required". "required".
* "none": Indicates a participant who is copied for information * "none": Indicates a participant who is copied for information
purposes only. purposes only.
* "optional": Indicates a participant whose attendance is * "optional": Indicates a participant whose attendance is
optional. optional.
* "required": Indicates a participant whose attendance is * "required": Indicates a participant whose attendance is
required. required.
o *expectReply*: "Boolean"(optional, default:"false") If true, the o *expectReply*: "Boolean" (optional, default:"false") If true, the
organizer is expecting the participant to notify them of their organizer is expecting the participant to notify them of their
status. status.
o *scheduleSequence*: "Number"(optional, default:"0") The sequence o *scheduleSequence*: "Number" (optional, default:"0") The sequence
number of the last response from the participant. If defined, number of the last response from the participant. If defined,
this MUST be a non-negative integer. this MUST be a non-negative integer.
This can be used to determine whether the participant has sent a This can be used to determine whether the participant has sent a
new RSVP following significant changes to the calendar object, and new RSVP following significant changes to the calendar object, and
to determine if future responses are responding to a current or to determine if future responses are responding to a current or
older view of the data. older view of the data.
o *scheduleUpdated*: "UTCDate" (optional) The *updated* property of o *scheduleUpdated*: "UTCDate" (optional) The *updated* property of
the last iMIP response from the participant. the last iMIP response from the participant.
This can be compared to the *updated* timestamp in future iMIP This can be compared to the *updated* timestamp in future iMIP
responses to determine if the response is older or newer than the responses to determine if the response is older or newer than the
current data. current data.
o *invitedBy*: "String" (optional) The participant id of the o *invitedBy*: "String" (optional) The participant id of the
participant who invited this one, if known. participant who invited this one, if known.
o *delegatedTo*: "String[Boolean]|null" (optional) A set of o *delegatedTo*: "String[Boolean]" (optional) A set of participant
participant ids that this participant has delegated their ids that this participant has delegated their participation to.
participation to. Each key in the set MUST be the identifier of a
participant. The value for each key in the set MUST be "true".
This MUST be omitted if none (rather than an empty set).
o *delegatedFrom*: "String[Boolean]|null" (optional) A set of
participant ids that this participant is acting as a delegate for.
Each key in the set MUST be the identifier of a participant. The Each key in the set MUST be the identifier of a participant. The
value for each key in the set MUST be "true". This MUST be value for each key in the set MUST be "true". This MUST be
omitted if none (rather than an empty set). omitted if none (rather than an empty set).
o *memberOf*: "String[Boolean]|null" (optional) A set of group o *delegatedFrom*: "String[Boolean]" (optional) A set of participant
ids that this participant is acting as a delegate for. Each key
in the set MUST be the identifier of a participant. The value for
each key in the set MUST be "true". This MUST be omitted if none
(rather than an empty set).
o *memberOf*: "String[Boolean]" (optional) A set of group
participants that were invited to this calendar object, which participants that were invited to this calendar object, which
caused this participant to be invited due to their membership of caused this participant to be invited due to their membership of
the group(s). Each key in the set MUST be the identifier of a the group(s). Each key in the set MUST be the identifier of a
participant. The value for each key in the set MUST be "true". participant. The value for each key in the set MUST be "true".
This MUST be omitted if none (rather than an empty set). This MUST be omitted if none (rather than an empty set).
o *linkIds*: "String[Boolean]|null" (optional) A set of links to o *linkIds*: "String[Boolean]" (optional) A set of links to more
more information about this participant, for example in vCard information about this participant, for example in vCard format.
format. The keys in the set MUST be the identifier of a Link The keys in the set MUST be the identifier of a Link object in the
object in the calendar object's *links* property. The value for calendar object's *links* property. The value for each key in the
each key in the set MUST be "true". This MUST be omitted if none set MUST be "true". This MUST be omitted if none (rather than an
(rather than an empty set). empty set).
4.5. Alerts properties 4.5. Alerts properties
4.5.1. useDefaultAlerts 4.5.1. useDefaultAlerts
Type: "Boolean" (optional, default:"false") Type: "Boolean" (optional, default:"false")
If "true", use the user's default alerts and ignore the value of the If "true", use the user's default alerts and ignore the value of the
*alerts* property. Fetching user defaults is dependent on the API *alerts* property. Fetching user defaults is dependent on the API
from which this JSCalendar object is being fetched, and is not from which this JSCalendar object is being fetched, and is not
skipping to change at page 28, line 29 skipping to change at page 28, line 49
* "before-start" * "before-start"
* "after-start" * "after-start"
* "before-end" * "before-end"
* "after-end" * "after-end"
o *offset*: "Duration" The offset from the start and end/due of the o *offset*: "Duration" The offset from the start and end/due of the
calendar object to fire the alert. If the calendar object does calendar object to fire the alert. If the calendar object does
not define a time-zone, the user's default time-zone SHOULD be not define a time zone, the user's default time zone SHOULD be
used when determining the offset, if known. Otherwise, the time- used when determining the offset, if known. Otherwise, the time
zone to use is implementation specific. zone to use is implementation specific.
o *acknowledged*: "UTCDate" (optional) o *acknowledged*: "UTCDate" (optional)
When the user has permanently dismissed the alert the client MUST When the user has permanently dismissed the alert the client MUST
set this to the current time in UTC. Other clients which sync set this to the current time in UTC. Other clients which sync
this property can then automatically dismiss or suppress duplicate this property can then automatically dismiss or suppress duplicate
alerts (alerts with the same alert id that triggered on or before alerts (alerts with the same alert id that triggered on or before
this date-time). this date-time).
skipping to change at page 30, line 34 skipping to change at page 31, line 9
5.1. JSEvent properties 5.1. JSEvent properties
In addition to the common JSCalendar object properties (Section 4) a In addition to the common JSCalendar object properties (Section 4) a
JSEvent has the following properties: JSEvent has the following properties:
5.1.1. start 5.1.1. start
Type: "LocalDate" e.g. "2015-09-02T00:00:00" Type: "LocalDate" e.g. "2015-09-02T00:00:00"
The date/time the event would start in the event's time-zone. The date/time the event would start in the event's time zone.
A valid JSEvent MUST include this property. A valid JSEvent MUST include this property.
5.1.2. timeZone 5.1.2. timeZone
Type: "String|null" (optional, default:"null") Type: "String|null" (optional, default:"null")
The IANA Time Zone Database [3] name for the time-zone the event is The IANA Time Zone Database [3] name for the time zone the event is
scheduled in, or "null" for floating time. If omitted, this MUST be scheduled in, or "null" for floating time. If omitted, this MUST be
presumed to be "null" (i.e. floating time). presumed to be "null" (i.e. floating time).
5.1.3. duration 5.1.3. duration
Type: "Duration", e.g. "P2DT3H" (optional, default: "PT0S") Type: "Duration", e.g. "P2DT3H" (optional, default: "PT0S")
The zero or positive duration of the event in the event's start time- The zero or positive duration of the event in the event's start time
zone. The same rules as for the iCalendar DURATION value type zone. The same rules as for the iCalendar DURATION value type
([RFC5545]) apply: The duration of a week or a day depends on its ([RFC5545]) apply: The duration of a week or a day in hours/minutes/
position in the calendar. In the case of discontinuities in the time seconds may vary if it overlaps a period of discontinuity in the
scale, such as the change from standard time to daylight time and event's time zone, for example a change from standard time to
back, the computation of the exact duration requires the subtraction daylight-savings time. Leap seconds MUST NOT be considered when
or addition of the change of duration of the discontinuity. Leap computing an exact duration. When computing an exact duration, the
seconds MUST NOT be considered when computing an exact duration. greatest order time components MUST be added first, that is, the
When computing an exact duration, the greatest order time components number of days MUST be added first, followed by the number of hours,
MUST be added first, that is, the number of days MUST be added first, number of minutes, and number of seconds. Fractional seconds MUST be
followed by the number of hours, number of minutes, and number of added last.
seconds. Fractional seconds MUST be added last.
A JSEvent MAY be end in a different time-zone (e.g. a plane flight A JSEvent MAY involve start and end locations that are in different
crossing time-zones). In this case, the JSEvent MUST specify the end time zones (e.g. a trans-continental flight). This can be expressed
time-zone in a *location* property value that defines its *rel* to be using the *rel* and *timeZone* properties of the JSEvent's *location*
"end" and the end time-zone in its *timeZone* property. objects.
5.1.4. isAllDay 5.1.4. isAllDay
Type: "Boolean" (optional, default:"false") Type: "Boolean" (optional, default:"false")
Specifies if the event an all day event, such as a birthday or public Specifies if the event is an all day event, such as a birthday or
holiday. public holiday.
If *isAllDay* is true, then the following restrictions apply: If *isAllDay* is true, then the following restrictions apply:
o the *start* property MUST have a time component of "T00:00:00". o the *start* property MUST have a time component of "T00:00:00".
o the *duration* property MUST only include a day component. o the *duration* property MUST NOT include non-zero time components
(hours, minutes, or seconds).
Note that all-day events MAY be bound to a specific time-zone, as Note that all-day events MAY be bound to a specific time zone, as
defined by the *timeZone* property. defined by the *timeZone* property.
5.1.5. status 5.1.5. status
Type: "String" (optional, default:"confirmed") Type: "String" (optional, default:"confirmed")
The scheduling status (Section 4.4) of a JSEvent. If set, it MUST be The scheduling status (Section 4.4) of a JSEvent. If set, it MUST be
one of: one of:
o "confirmed": Indicates the event is definite. o "confirmed": Indicates the event is definite.
skipping to change at page 32, line 14 skipping to change at page 32, line 33
5.2. JSTask properties 5.2. JSTask properties
In addition to the common JSCalendar object properties (Section 4) a In addition to the common JSCalendar object properties (Section 4) a
JSTask has the following properties: JSTask has the following properties:
5.2.1. due 5.2.1. due
Type: "LocalDate" (optional) e.g. "2015-09-02T00:00:00" Type: "LocalDate" (optional) e.g. "2015-09-02T00:00:00"
The date/time the task is due in the task's time-zone. The date/time the task is due in the task's time zone.
5.2.2. start 5.2.2. start
Type: "LocalDate" (optional) e.g. "2015-09-02T00:00:00" Type: "LocalDate" (optional) e.g. "2015-09-02T00:00:00"
The date/time the task should start in the task's time-zone. The date/time the task should start in the task's time zone.
5.2.3. timeZone 5.2.3. timeZone
Type: "String|null" (optional, default:"null") Type: "String|null" (optional, default:"null")
The IANA Time Zone Database name for the time-zone the task is The IANA Time Zone Database name for the time zone the task is
scheduled in, or "null" for floating time. If omitted, this MUST be scheduled in, or "null" for floating time. If omitted, this MUST be
presumed to be "null" (i.e. floating time). presumed to be "null" (i.e. floating time).
5.2.4. estimatedDuration 5.2.4. estimatedDuration
Type: "Duration" (optional), e.g. "P2DT3H" Type: "Duration" (optional), e.g. "P2DT3H"
Specifies the estimated positive duration of time the task takes to Specifies the estimated positive duration of time the task takes to
complete. complete.
skipping to change at page 33, line 14 skipping to change at page 33, line 37
5.2.6. isAllDay 5.2.6. isAllDay
Type: "Boolean" (optional, default:"false") Type: "Boolean" (optional, default:"false")
Specifies if the task is an all day task. Specifies if the task is an all day task.
If *isAllDay* is true, then the *start* and *due* properties MUST If *isAllDay* is true, then the *start* and *due* properties MUST
have a time component of "T00:00:00". Note that the have a time component of "T00:00:00". Note that the
*estimatedDuration* property MAY contain a non-zero time duration. *estimatedDuration* property MAY contain a non-zero time duration.
All-day tasks MAY be bound to a specific time-zone, as defined by the All-day tasks MAY be bound to a specific time zone, as defined by the
*timeZone* property. *timeZone* property.
5.2.7. progress 5.2.7. progress
In addition to the common properties of a *Participant* object In addition to the common properties of a *Participant* object
(Section 4.4.5), a Participant within a JSTask supports the following (Section 4.4.5), a Participant within a JSTask supports the following
property: property:
o *progress*: "ParticipantProgress" (optional) The progress of the o *progress*: "ParticipantProgress" (optional) The progress of the
participant for this task, if known. This property MUST NOT be participant for this task, if known. This property MUST NOT be
skipping to change at page 36, line 15 skipping to change at page 36, line 23
+----------+--------------------------------------------------------+ +----------+--------------------------------------------------------+
| Property | iCalendar counterpart | | Property | iCalendar counterpart |
+----------+--------------------------------------------------------+ +----------+--------------------------------------------------------+
| isAllDay | True, if the type of the DTSTART property in iCalendar | | isAllDay | True, if the type of the DTSTART property in iCalendar |
| | is DATE. When translating from JSCalendar the | | | is DATE. When translating from JSCalendar the |
| | iCalendar DTSTART property is of DATE value type, if | | | iCalendar DTSTART property is of DATE value type, if |
| | the *isAllDay* property is set to true and the | | | the *isAllDay* property is set to true and the |
| | *timeZone* property is null. | | | *timeZone* property is null. |
| | | | | |
| start | Corresponds to the DTSTART property in iCalendar. Note | | start | Corresponds to the DTSTART property in iCalendar. Note |
| | that time-zone information is stored separately in | | | that time zone information is stored separately in |
| | JSEvent. | | | JSEvent. |
| | | | | |
| timeZone | Corresponds to the TZID part of the DTSTART property | | timeZone | Corresponds to the TZID part of the DTSTART property |
| | in iCalendar. If the event has a different end time- | | | in iCalendar. If the event has a different end time |
| | zone to start time-zone, this should be added as a | | | zone to start time zone, this should be added as a |
| | JSCalendar *location* with just a *timeZone* property | | | JSCalendar *location* with just a *timeZone* property |
| | and "rel="end"". | | | and "rel="end"". |
| | | | | |
| duration | Corresponds to the DURATION or DSTART+DTEND properties | | duration | Corresponds to the DURATION or DSTART+DTEND properties |
| | in iCalendar. | | | in iCalendar. |
+----------+--------------------------------------------------------+ +----------+--------------------------------------------------------+
Table 1: Translation between JSEvent and iCalendar Table 1: Translation between JSEvent and iCalendar
6.2. JSTask 6.2. JSTask
skipping to change at page 37, line 19 skipping to change at page 37, line 19
| | iCalendar is DATE. When translating from | | | iCalendar is DATE. When translating from |
| | JSCalendar the iCalendar DTSTART property is | | | JSCalendar the iCalendar DTSTART property is |
| | of DATE value type, if the *isAllDay* | | | of DATE value type, if the *isAllDay* |
| | property is set to true and the *timeZone* | | | property is set to true and the *timeZone* |
| | property is null. | | | property is null. |
| | | | | |
| due | Corresponds to the DUE and DTSTART+DURATION | | due | Corresponds to the DUE and DTSTART+DURATION |
| | properties in iCalendar. When mapping | | | properties in iCalendar. When mapping |
| | iCalendar VTODOs with DTSTART+DURATION, the | | | iCalendar VTODOs with DTSTART+DURATION, the |
| | due date is the result of adding DURATION to | | | due date is the result of adding DURATION to |
| | DTSTART in the DTSTART time-zone. | | | DTSTART in the DTSTART time zone. |
| | | | | |
| start | Corresponds to the DTSTART property in | | start | Corresponds to the DTSTART property in |
| | iCalendar. | | | iCalendar. |
| | | | | |
| timeZone | Corresponds to the TZID part of the | | timeZone | Corresponds to the TZID part of the |
| | DTSTART/DUE properties in iCalendar. If the | | | DTSTART/DUE properties in iCalendar. If the |
| | task has a different end time-zone to start | | | task has a different end time zone to start |
| | or due time-zone, this should be added as a | | | or due time zone, this should be added as a |
| | JSCalendar *location* with just a *timeZone* | | | JSCalendar *location* with just a *timeZone* |
| | property and "rel="end"". | | | property and "rel="end"". |
| | | | | |
| estimatedDuration | Corresponds to the ESTIMATED-DURATION | | estimatedDuration | Corresponds to the ESTIMATED-DURATION |
| | iCalendar property in the RFC draft | | | iCalendar property in the RFC draft |
| | [draft-apthorp-ical-tasks]. | | | [draft-apthorp-ical-tasks]. |
| | | | | |
| statusUpdatedAt | Maps to the COMPLETED iCalendar property. The | | statusUpdatedAt | Maps to the COMPLETED iCalendar property. The |
| | JSTask status property MUST have value | | | JSTask status property MUST have value |
| | "completed". | | | "completed". |
skipping to change at page 45, line 30 skipping to change at page 45, line 30
calendar user expects to need 1 hour for shopping. calendar user expects to need 1 hour for shopping.
{ {
"...": "", "...": "",
"title": "Buy groceries", "title": "Buy groceries",
"due": "2018-01-19T18:00:00", "due": "2018-01-19T18:00:00",
"timeZone": "Europe/Vienna", "timeZone": "Europe/Vienna",
"estimatedDuration": "PT1H" "estimatedDuration": "PT1H"
} }
7.6. Event with end time-zone 7.6. Event with end time zone
This example illustrates the use of end time-zones by use of an This example illustrates the use of end time zones by use of an
international flight. The flight starts on April 1, 2018 at 9am in international flight. The flight starts on April 1, 2018 at 9am in
Berlin local time. The duration of the flight is scheduled at 10 Berlin local time. The duration of the flight is scheduled at 10
hours 30 minutes. The time at the flights destination is in the same hours 30 minutes. The time at the flights destination is in the same
time-zone as Tokyo. Calendar clients could use the end time-zone to time zone as Tokyo. Calendar clients could use the end time zone to
display the arrival time in Tokyo local time and highlight the time- display the arrival time in Tokyo local time and highlight the time
zone difference of the flight. The location names can serve as input zone difference of the flight. The location names can serve as input
for navigation systems. for navigation systems.
{ {
"...": "", "...": "",
"title": "Flight XY51 to Tokyo", "title": "Flight XY51 to Tokyo",
"start": "2018-04-01T09:00:00", "start": "2018-04-01T09:00:00",
"timeZone": "Europe/Berlin", "timeZone": "Europe/Berlin",
"duration": "PT10H30M", "duration": "PT10H30M",
"locations": { "locations": {
skipping to change at page 46, line 28 skipping to change at page 46, line 28
"name": "Narita International Airport (NRT)", "name": "Narita International Airport (NRT)",
"timeZone": "Asia/Tokyo" "timeZone": "Asia/Tokyo"
} }
} }
} }
7.7. Floating-time event (with recurrence) 7.7. Floating-time event (with recurrence)
This example illustrates the use of floating-time. Since January 1, This example illustrates the use of floating-time. Since January 1,
2018, a calendar user blocks 30 minutes every day to practice Yoga at 2018, a calendar user blocks 30 minutes every day to practice Yoga at
7am local time, in whatever time-zone the user is located on that 7am local time, in whatever time zone the user is located on that
date. date.
{ {
"...": "", "...": "",
"title": "Yoga", "title": "Yoga",
"start": "2018-01-01T07:00:00", "start": "2018-01-01T07:00:00",
"duration": "PT30M", "duration": "PT30M",
"recurrenceRule": { "recurrenceRule": {
"frequency": "daily" "frequency": "daily"
} }
skipping to change at page 53, line 12 skipping to change at page 53, line 12
[MIME] "IANA Media Types", <https://www.iana.org/assignments/ [MIME] "IANA Media Types", <https://www.iana.org/assignments/
media-types/media-types.xhtml>. media-types/media-types.xhtml>.
11.3. URIs 11.3. URIs
[1] https://www.iana.org/assignments/link-relations/link- [1] https://www.iana.org/assignments/link-relations/link-
relations.xhtml relations.xhtml
[2] https://www.w3.org/TR/2011/REC-css3-color-20110607/#svg-color [2] https://www.w3.org/TR/2011/REC-css3-color-20110607/#svg-color
[3] http://www.iana.org/time-zones [3] http://www.iana.org/time zones
Authors' Addresses Authors' Addresses
Neil Jenkins Neil Jenkins
FastMail FastMail
PO Box 234 PO Box 234
Collins St West Collins St West
Melbourne VIC 8007 Melbourne VIC 8007
Australia Australia
 End of changes. 73 change blocks. 
131 lines changed or deleted 144 lines changed or added

This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/