<?php
/**
 * Recurrence Rule Property
 * @package qCal
 * @copyright Luke Visinoni (luke.visinoni@gmail.com)
 * @author Luke Visinoni (luke.visinoni@gmail.com)
 * @license GNU Lesser General Public License
 * @todo Make sure allowedCompoents is correct. The RFC isn't dead clear
 * @todo There are a lot of rules for this guy. Make sure you take them all
 * into consideration and conform to the shit below.
 * @todo This property doesn't require a value. Make sure it is possible to
 * render the property without the colon that comes between name, params and value
 * 
 * RFC 2445 Definition
 * 
 * Property Name: RRULE
 * 
 * Purpose: This property defines a rule or repeating pattern for
 * recurring events, to-dos, or time zone definitions.
 * 
 * Value Type: RECUR
 * 
 * Property Parameters: Non-standard property parameters can be
 * specified on this property.
 * 
 * Conformance: This property can be specified one or more times in
 * recurring "VEVENT", "VTODO" and "VJOURNAL" calendar components. It
 * can also be specified once in each STANDARD or DAYLIGHT sub-component
 * of the "VTIMEZONE" calendar component.
 * 
 * Description: The recurrence rule, if specified, is used in computing
 * the recurrence set. The recurrence set is the complete set of
 * recurrence instances for a calendar component. The recurrence set is
 * generated by considering the initial "DTSTART" property along with
 * the "RRULE", "RDATE", "EXDATE" and "EXRULE" properties contained
 * within the iCalendar object. The "DTSTART" property defines the first
 * instance in the recurrence set. Multiple instances of the "RRULE" and
 * "EXRULE" properties can also be specified to define more
 * sophisticated recurrence sets. The final recurrence set is generated
 * by gathering all of the start date/times generated by any of the
 * specified "RRULE" and "RDATE" properties, and excluding any start
 * date/times which fall within the union of start date/times generated
 * by any specified "EXRULE" and "EXDATE" properties. This implies that
 * start date/times within exclusion related properties (i.e., "EXDATE"
 * and "EXRULE") take precedence over those specified by inclusion
 * properties (i.e., "RDATE" and "RRULE"). Where duplicate instances are
 * generated by the "RRULE" and "RDATE" properties, only one recurrence
 * is considered. Duplicate instances are ignored.
 * 
 * 
 * 
 * The "DTSTART" and "DTEND" property pair or "DTSTART" and "DURATION"
 * property pair, specified within the iCalendar object defines the
 * first instance of the recurrence. When used with a recurrence rule,
 * the "DTSTART" and "DTEND" properties MUST be specified in local time
 * and the appropriate set of "VTIMEZONE" calendar components MUST be
 * included. For detail on the usage of the "VTIMEZONE" calendar
 * component, see the "VTIMEZONE" calendar component definition.
 * 
 * Any duration associated with the iCalendar object applies to all
 * members of the generated recurrence set. Any modified duration for
 * specific recurrences MUST be explicitly specified using the "RDATE"
 * property.
 * 
 * Format Definition: This property is defined by the following
 * notation:
 * 
 *   rrule      = "RRULE" rrulparam ":" recur CRLF
 * 
 *   rrulparam  = *(";" xparam)
 * 
 * Example: All examples assume the Eastern United States time zone.
 * 
 * Daily for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=DAILY;COUNT=10
 * 
 *   ==> (1997 9:00 AM EDT)September 2-11
 * 
 * Daily until December 24, 1997:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=DAILY;UNTIL=19971224T000000Z
 * 
 *   ==> (1997 9:00 AM EDT)September 2-30;October 1-25
 *       (1997 9:00 AM EST)October 26-31;November 1-30;December 1-23
 * 
 * Every other day - forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=DAILY;INTERVAL=2
 *   ==> (1997 9:00 AM EDT)September2,4,6,8...24,26,28,30;
 *        October 2,4,6...20,22,24
 *       (1997 9:00 AM EST)October 26,28,30;November 1,3,5,7...25,27,29;
 *        Dec 1,3,...
 * 
 * Every 10 days, 5 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=DAILY;INTERVAL=10;COUNT=5
 * 
 *   ==> (1997 9:00 AM EDT)September 2,12,22;October 2,12
 * 
 * Everyday in January, for 3 years:
 * 
 *   DTSTART;TZID=US-Eastern:19980101T090000
 *   RRULE:FREQ=YEARLY;UNTIL=20000131T090000Z;
 *    BYMONTH=1;BYDAY=SU,MO,TU,WE,TH,FR,SA
 *   or
 *   RRULE:FREQ=DAILY;UNTIL=20000131T090000Z;BYMONTH=1
 * 
 *   ==> (1998 9:00 AM EDT)January 1-31
 *       (1999 9:00 AM EDT)January 1-31
 *       (2000 9:00 AM EDT)January 1-31
 * 
 * Weekly for 10 occurrences
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=WEEKLY;COUNT=10
 * 
 *   ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
 *       (1997 9:00 AM EST)October 28;November 4
 * 
 * Weekly until December 24, 1997
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=WEEKLY;UNTIL=19971224T000000Z
 * 
 *   ==> (1997 9:00 AM EDT)September 2,9,16,23,30;October 7,14,21
 *       (1997 9:00 AM EST)October 28;November 4,11,18,25;
 *                         December 2,9,16,23
 * Every other week - forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=WEEKLY;INTERVAL=2;WKST=SU
 * 
 *   ==> (1997 9:00 AM EDT)September 2,16,30;October 14
 *       (1997 9:00 AM EST)October 28;November 11,25;December 9,23
 *       (1998 9:00 AM EST)January 6,20;February
 *   ...
 * 
 * Weekly on Tuesday and Thursday for 5 weeks:
 * 
 *  DTSTART;TZID=US-Eastern:19970902T090000
 *  RRULE:FREQ=WEEKLY;UNTIL=19971007T000000Z;WKST=SU;BYDAY=TU,TH
 *  or
 *  RRULE:FREQ=WEEKLY;COUNT=10;WKST=SU;BYDAY=TU,TH
 * 
 *  ==> (1997 9:00 AM EDT)September 2,4,9,11,16,18,23,25,30;October 2
 * 
 * Every other week on Monday, Wednesday and Friday until December 24,
 * 1997, but starting on Tuesday, September 2, 1997:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=WEEKLY;INTERVAL=2;UNTIL=19971224T000000Z;WKST=SU;
 *    BYDAY=MO,WE,FR
 *   ==> (1997 9:00 AM EDT)September 2,3,5,15,17,19,29;October
 *   1,3,13,15,17
 *       (1997 9:00 AM EST)October 27,29,31;November 10,12,14,24,26,28;
 *                         December 8,10,12,22
 * 
 * Every other week on Tuesday and Thursday, for 8 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=8;WKST=SU;BYDAY=TU,TH
 * 
 *   ==> (1997 9:00 AM EDT)September 2,4,16,18,30;October 2,14,16
 * 
 * Monthly on the 1st Friday for ten occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970905T090000
 *   RRULE:FREQ=MONTHLY;COUNT=10;BYDAY=1FR
 * 
 *   ==> (1997 9:00 AM EDT)September 5;October 3
 *       (1997 9:00 AM EST)November 7;Dec 5
 *       (1998 9:00 AM EST)January 2;February 6;March 6;April 3
 *       (1998 9:00 AM EDT)May 1;June 5
 * 
 * Monthly on the 1st Friday until December 24, 1997:
 * 
 *   DTSTART;TZID=US-Eastern:19970905T090000
 *   RRULE:FREQ=MONTHLY;UNTIL=19971224T000000Z;BYDAY=1FR
 * 
 *   ==> (1997 9:00 AM EDT)September 5;October 3
 *       (1997 9:00 AM EST)November 7;December 5
 * 
 * Every other month on the 1st and last Sunday of the month for 10
 * occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970907T090000
 *   RRULE:FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=1SU,-1SU
 * 
 *   ==> (1997 9:00 AM EDT)September 7,28
 *       (1997 9:00 AM EST)November 2,30
 *    (1998 9:00 AM EST)January 4,25;March 1,29
 *       (1998 9:00 AM EDT)May 3,31
 * 
 * Monthly on the second to last Monday of the month for 6 months:
 * 
 *   DTSTART;TZID=US-Eastern:19970922T090000
 *   RRULE:FREQ=MONTHLY;COUNT=6;BYDAY=-2MO
 * 
 *   ==> (1997 9:00 AM EDT)September 22;October 20
 *       (1997 9:00 AM EST)November 17;December 22
 *       (1998 9:00 AM EST)January 19;February 16
 * 
 * Monthly on the third to the last day of the month, forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970928T090000
 *   RRULE:FREQ=MONTHLY;BYMONTHDAY=-3
 * 
 *   ==> (1997 9:00 AM EDT)September 28
 *       (1997 9:00 AM EST)October 29;November 28;December 29
 *       (1998 9:00 AM EST)January 29;February 26
 *   ...
 * 
 * Monthly on the 2nd and 15th of the month for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=2,15
 * 
 *   ==> (1997 9:00 AM EDT)September 2,15;October 2,15
 *       (1997 9:00 AM EST)November 2,15;December 2,15
 *       (1998 9:00 AM EST)January 2,15
 * 
 * Monthly on the first and last day of the month for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970930T090000
 *   RRULE:FREQ=MONTHLY;COUNT=10;BYMONTHDAY=1,-1
 * 
 *   ==> (1997 9:00 AM EDT)September 30;October 1
 *       (1997 9:00 AM EST)October 31;November 1,30;December 1,31
 *       (1998 9:00 AM EST)January 1,31;February 1
 * 
 * Every 18 months on the 10th thru 15th of the month for 10
 * occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970910T090000
 *   RRULE:FREQ=MONTHLY;INTERVAL=18;COUNT=10;BYMONTHDAY=10,11,12,13,14,
 *    15
 * 
 *   ==> (1997 9:00 AM EDT)September 10,11,12,13,14,15
 *    (1999 9:00 AM EST)March 10,11,12,13
 * 
 * Every Tuesday, every other month:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=MONTHLY;INTERVAL=2;BYDAY=TU
 * 
 *   ==> (1997 9:00 AM EDT)September 2,9,16,23,30
 *       (1997 9:00 AM EST)November 4,11,18,25
 *       (1998 9:00 AM EST)January 6,13,20,27;March 3,10,17,24,31
 *   ...
 * 
 * Yearly in June and July for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970610T090000
 *   RRULE:FREQ=YEARLY;COUNT=10;BYMONTH=6,7
 *   ==> (1997 9:00 AM EDT)June 10;July 10
 *       (1998 9:00 AM EDT)June 10;July 10
 *       (1999 9:00 AM EDT)June 10;July 10
 *       (2000 9:00 AM EDT)June 10;July 10
 *       (2001 9:00 AM EDT)June 10;July 10
 *   Note: Since none of the BYDAY, BYMONTHDAY or BYYEARDAY components
 *   are specified, the day is gotten from DTSTART
 * 
 * Every other year on January, February, and March for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970310T090000
 *   RRULE:FREQ=YEARLY;INTERVAL=2;COUNT=10;BYMONTH=1,2,3
 * 
 *   ==> (1997 9:00 AM EST)March 10
 *       (1999 9:00 AM EST)January 10;February 10;March 10
 *       (2001 9:00 AM EST)January 10;February 10;March 10
 *       (2003 9:00 AM EST)January 10;February 10;March 10
 * 
 * Every 3rd year on the 1st, 100th and 200th day for 10 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970101T090000
 *   RRULE:FREQ=YEARLY;INTERVAL=3;COUNT=10;BYYEARDAY=1,100,200
 * 
 *   ==> (1997 9:00 AM EST)January 1
 *       (1997 9:00 AM EDT)April 10;July 19
 *       (2000 9:00 AM EST)January 1
 *       (2000 9:00 AM EDT)April 9;July 18
 *       (2003 9:00 AM EST)January 1
 *       (2003 9:00 AM EDT)April 10;July 19
 *       (2006 9:00 AM EST)January 1
 * 
 * Every 20th Monday of the year, forever:
 *   DTSTART;TZID=US-Eastern:19970519T090000
 *   RRULE:FREQ=YEARLY;BYDAY=20MO
 * 
 *   ==> (1997 9:00 AM EDT)May 19
 *       (1998 9:00 AM EDT)May 18
 *       (1999 9:00 AM EDT)May 17
 *   ...
 * 
 * Monday of week number 20 (where the default start of the week is
 * Monday), forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970512T090000
 *   RRULE:FREQ=YEARLY;BYWEEKNO=20;BYDAY=MO
 * 
 *   ==> (1997 9:00 AM EDT)May 12
 *       (1998 9:00 AM EDT)May 11
 *       (1999 9:00 AM EDT)May 17
 *   ...
 * 
 * Every Thursday in March, forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970313T090000
 *   RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=TH
 * 
 *   ==> (1997 9:00 AM EST)March 13,20,27
 *       (1998 9:00 AM EST)March 5,12,19,26
 *       (1999 9:00 AM EST)March 4,11,18,25
 *   ...
 * 
 * Every Thursday, but only during June, July, and August, forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970605T090000
 *   RRULE:FREQ=YEARLY;BYDAY=TH;BYMONTH=6,7,8
 * 
 *   ==> (1997 9:00 AM EDT)June 5,12,19,26;July 3,10,17,24,31;
 *                     August 7,14,21,28
 *       (1998 9:00 AM EDT)June 4,11,18,25;July 2,9,16,23,30;
 *                     August 6,13,20,27
 *       (1999 9:00 AM EDT)June 3,10,17,24;July 1,8,15,22,29;
 *                     August 5,12,19,26
 *   ...
 * 
 * Every Friday the 13th, forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   EXDATE;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=MONTHLY;BYDAY=FR;BYMONTHDAY=13
 * 
 *   ==> (1998 9:00 AM EST)February 13;March 13;November 13
 *       (1999 9:00 AM EDT)August 13
 *       (2000 9:00 AM EDT)October 13
 *   ...
 * 
 * The first Saturday that follows the first Sunday of the month,
 *  forever:
 * 
 *   DTSTART;TZID=US-Eastern:19970913T090000
 *   RRULE:FREQ=MONTHLY;BYDAY=SA;BYMONTHDAY=7,8,9,10,11,12,13
 * 
 *   ==> (1997 9:00 AM EDT)September 13;October 11
 *       (1997 9:00 AM EST)November 8;December 13
 *       (1998 9:00 AM EST)January 10;February 7;March 7
 *       (1998 9:00 AM EDT)April 11;May 9;June 13...
 *   ...
 * 
 * Every four years, the first Tuesday after a Monday in November,
 * forever (U.S. Presidential Election day):
 * 
 *   DTSTART;TZID=US-Eastern:19961105T090000
 *   RRULE:FREQ=YEARLY;INTERVAL=4;BYMONTH=11;BYDAY=TU;BYMONTHDAY=2,3,4,
 *    5,6,7,8
 * 
 *   ==> (1996 9:00 AM EST)November 5
 *       (2000 9:00 AM EST)November 7
 *       (2004 9:00 AM EST)November 2
 *   ...
 * 
 * The 3rd instance into the month of one of Tuesday, Wednesday or
 * Thursday, for the next 3 months:
 * 
 *   DTSTART;TZID=US-Eastern:19970904T090000
 *   RRULE:FREQ=MONTHLY;COUNT=3;BYDAY=TU,WE,TH;BYSETPOS=3
 * 
 *   ==> (1997 9:00 AM EDT)September 4;October 7
 *       (1997 9:00 AM EST)November 6
 * 
 * The 2nd to last weekday of the month:
 * 
 *   DTSTART;TZID=US-Eastern:19970929T090000
 *   RRULE:FREQ=MONTHLY;BYDAY=MO,TU,WE,TH,FR;BYSETPOS=-2
 * 
 *   ==> (1997 9:00 AM EDT)September 29
 *       (1997 9:00 AM EST)October 30;November 27;December 30
 *       (1998 9:00 AM EST)January 29;February 26;March 30
 *   ...
 * 
 * Every 3 hours from 9:00 AM to 5:00 PM on a specific day:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=HOURLY;INTERVAL=3;UNTIL=19970902T170000Z
 * 
 *   ==> (September 2, 1997 EDT)09:00,12:00,15:00
 * 
 * Every 15 minutes for 6 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=MINUTELY;INTERVAL=15;COUNT=6
 * 
 *   ==> (September 2, 1997 EDT)09:00,09:15,09:30,09:45,10:00,10:15
 * 
 * Every hour and a half for 4 occurrences:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=MINUTELY;INTERVAL=90;COUNT=4
 * 
 *   ==> (September 2, 1997 EDT)09:00,10:30;12:00;13:30
 * 
 * Every 20 minutes from 9:00 AM to 4:40 PM every day:
 * 
 *   DTSTART;TZID=US-Eastern:19970902T090000
 *   RRULE:FREQ=DAILY;BYHOUR=9,10,11,12,13,14,15,16;BYMINUTE=0,20,40
 *   or
 *   RRULE:FREQ=MINUTELY;INTERVAL=20;BYHOUR=9,10,11,12,13,14,15,16
 * 
 *   ==> (September 2, 1997 EDT)9:00,9:20,9:40,10:00,10:20,
 *                              ... 16:00,16:20,16:40
 *       (September 3, 1997 EDT)9:00,9:20,9:40,10:00,10:20,
 *                             ...16:00,16:20,16:40
 *   ...
 * 
 * An example where the days generated makes a difference because of
 * WKST:
 * 
 *   DTSTART;TZID=US-Eastern:19970805T090000
 *   RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=MO
 * 
 *   ==> (1997 EDT)Aug 5,10,19,24
 * 
 *   changing only WKST from MO to SU, yields different results...
 * 
 *   DTSTART;TZID=US-Eastern:19970805T090000
 *   RRULE:FREQ=WEEKLY;INTERVAL=2;COUNT=4;BYDAY=TU,SU;WKST=SU
 *   ==> (1997 EDT)August 5,17,19,31
 */
class qCal_Property_Rrule extends qCal_Property {

	protected $type = 'RECUR';
	protected $allowedComponents = array('VEVENT','VTODO','VJOURNAL','VTIMEZONE','DAYLIGHT','STANDARD');
	protected $allowMultiple = true;

}