diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..e62761b
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,73 @@
+
+
+ 4.0.0
+
+ ui
+ org.richfaces.sandbox
+ 3.3.3.Final
+
+ org.richfaces.sandbox.ui
+ schedule
+ schedule
+
+
+
+ org.richfaces.cdk
+ maven-cdk-plugin
+ ${project.version}
+
+
+ generate-sources
+
+ generate
+
+
+
+ generate-test-sources
+ generate-test-sources
+
+ generate-tests
+
+
+
+
+
+ org.richfaces.ui
+
+ schedule
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+
+
+ displayedDaysForMonthViewCalculationTestData
+ ${basedir}/src/test/resources/displayedDaysForMonthViewCalculationTestData.txt
+
+
+ displayedDaysForWeekViewCalculationTestData
+ ${basedir}/src/test/resources/displayedDaysForWeekViewCalculationTestData.txt
+
+
+ displayedDaysForDayViewCalculationTestData
+ ${basedir}/src/test/resources/displayedDaysForDayViewCalculationTestData.txt
+
+
+
+
+
+
+
+
+ org.richfaces.framework
+ richfaces-impl
+ ${project.version}
+
+
+
diff --git a/src/main/config/component/README b/src/main/config/component/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/main/config/component/README
diff --git a/src/main/config/component/commonViewAttributes.ent b/src/main/config/component/commonViewAttributes.ent
new file mode 100644
index 0000000..8a77f0e
--- /dev/null
+++ b/src/main/config/component/commonViewAttributes.ent
@@ -0,0 +1,43 @@
+
+ timeFormat
+ java.lang.String
+
+ Determines the time-text that will be displayed on each event.
+ Time-text will only be displayed for Event Objects that have allDay equal to false.
+ default for agendaDay and agendaWeek: 'h:mm{ - h:mm}', // 5:00 - 6:30
+ default for all others: 'h(:mm)t' // 7p
+
+ null
+
+
+ columnFormat
+ java.lang.String
+
+ Determines the text that will be displayed on the calendar's column headings.
+ default for month: 'ddd', // Mon
+ default for week: 'ddd M/d', // Mon 9/7
+ default for day: 'dddd M/d' // Monday 9/7
+
+ null
+
+
+ titleFormat
+ java.lang.String
+
+ Determines the text that will be displayed in the header's title.
+ default for month: 'MMMM yyyy', // September 2009
+ default for week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}", // Sep 7 - 13 2009
+ default for day: 'dddd, MMM d, yyyy' // Tuesday, Sep 8, 2009
+
+ null
+
+
+ dragOpacity
+ java.lang.Double
+
+ The opacity of an event while it is being dragged.
+ default for agendaWeek: .5
+ default for other views: 1
+
+ null
+
\ No newline at end of file
diff --git a/src/main/config/component/listeners.ent b/src/main/config/component/listeners.ent
new file mode 100644
index 0000000..d52fcdc
--- /dev/null
+++ b/src/main/config/component/listeners.ent
@@ -0,0 +1,215 @@
+
+ itemSelectedListener
+
+ binding
+ org.richfaces.scheduleItemSelectedListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleItemSelectedListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleItemSelectedEvent
+
+
+
+ org.richfaces.taglib.ScheduleItemSelectedListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.ItemSelectedListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
+
+
+ itemMoveListener
+
+ binding
+ org.richfaces.scheduleItemMoveListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleItemMoveListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleItemMoveEvent
+
+
+
+ org.richfaces.taglib.ScheduleItemMoveListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.ItemMoveListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
+
+
+ itemResizeListener
+
+ binding
+ org.richfaces.scheduleItemResizeListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleItemResizeListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleItemResizeEvent
+
+
+
+ org.richfaces.taglib.ScheduleItemResizeListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.ItemResizeListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
+
+
+ viewChangedListener
+
+ binding
+ org.richfaces.scheduleViewChangedListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleViewChangedListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleViewChangedEvent
+
+
+
+ org.richfaces.taglib.ScheduleViewChangedListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.ViewChangedListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
+
+
+ dateRangeChangedListener
+
+ binding
+ org.richfaces.scheduleDateRangeChangedListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleDateRangeChangedListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleDateRangeChangedEvent
+
+
+
+ org.richfaces.taglib.ScheduleDateRangeChangedListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.DateRangeChangedListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
+
+
+ dateSelectedListener
+
+ binding
+ org.richfaces.scheduleDateSelectedListener
+ The attribute takes a value-binding expression for a component property of
+ a backing bean
+
+
+
+ org.richfaces.component.event.ScheduleDateSelectedListener
+
+
+ org.richfaces.component.event.ScheduleListenerEventsProducer
+
+
+ org.richfaces.component.event.ScheduleDateSelectedEvent
+
+
+
+ org.richfaces.taglib.ScheduleDateSelectedListenerTagHandler
+
+
+
+
+ org.richfaces.taglib.DateSelectedListenerTag
+
+
+
+
+ type
+ java.lang.String
+ The fully qualified Java class name for the listener
+
+
\ No newline at end of file
diff --git a/src/main/config/component/schedule.xml b/src/main/config/component/schedule.xml
new file mode 100644
index 0000000..66b8c49
--- /dev/null
+++ b/src/main/config/component/schedule.xml
@@ -0,0 +1,537 @@
+
+
+
+ ]
+ >
+
+
+ org.richfaces.Schedule
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlSchedule
+ org.richfaces.component.UISchedule
+
+
+
+
+ org.richfaces.renderkit.ScheduleRenderer
+ org/richfaces/htmlSchedule.jspx
+ org.richfaces.renderkit.ScheduleRendererBase
+
+
+ schedule
+ org.richfaces.taglib.ScheduleTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ org.richfaces.taglib.ScheduleTagHandler
+ org.richfaces.taglib.ScheduleTagHandlerBase
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
+
+
+ switchType
+ java.lang.String
+
+ Available options:
+
+ ajax
+ server
+ client
+
+
+ "ajax"
+
+
+ view
+ java.lang.String
+
+ Schedule has a number of different "views",
+ or ways of displaying days and events.
+ The following 5 views are all built in to schedule:
+
+ month
+ basicWeek
+ basicDay
+ agendaWeek
+ agendaDay
+
+ default: 'month'
+
+ null
+
+
+ headerLeft
+ java.lang.String
+
+ Defines the buttons and title at the top of the calendar.
+ Values separated by a comma will be displayed adjacently.
+ Values separated by a space will be displayed with a small gap in between.
+ Strings can contain any of the following values:
+
+
+ title
+ - text containing the current month/week/day
+
+
+ prev
+ - button for moving the calendar back one month/week/day
+
+
+ next
+ - button for moving the calendar forward one month/week/day
+
+
+ prevYear
+ - button for moving the calendar back on year
+
+
+ nextYear
+ - button for moving the calendar forward one year
+
+
+ today
+ - button for moving the calendar to the current month/week/day
+
+
+ a view name
+ - button that will switch the calendar to any of the available views; see defaultView
+
+
+ default: 'title'
+
+ null
+
+
+ headerCenter
+ java.lang.String
+
+ Defines the buttons and title at the top of the calendar.
+ Values separated by a comma will be displayed adjacently.
+ Values separated by a space will be displayed with a small gap in between.
+ Strings can contain any of the following values:
+
+
+ title
+ - text containing the current month/week/day
+
+
+ prev
+ - button for moving the calendar back one month/week/day
+
+
+ next
+ - button for moving the calendar forward one month/week/day
+
+
+ prevYear
+ - button for moving the calendar back on year
+
+
+ nextYear
+ - button for moving the calendar forward one year
+
+
+ today
+ - button for moving the calendar to the current month/week/day
+
+
+ a view name
+ - button that will switch the calendar to any of the available views; see defaultView
+
+
+ default: ''
+
+ null
+
+
+ headerRight
+ java.lang.String
+
+ Defines the buttons and title at the top of the calendar.
+ Values separated by a comma will be displayed adjacently.
+ Values separated by a space will be displayed with a small gap in between.
+ Strings can contain any of the following values:
+
+
+ title
+ - text containing the current month/week/day
+
+
+ prev
+ - button for moving the calendar back one month/week/day
+
+
+ next
+ - button for moving the calendar forward one month/week/day
+
+
+ prevYear
+ - button for moving the calendar back on year
+
+
+ nextYear
+ - button for moving the calendar forward one year
+
+
+ today
+ - button for moving the calendar to the current month/week/day
+
+
+ a view name
+ - button that will switch the calendar to any of the available views; see defaultView
+
+
+ default: 'today prev,next'
+
+ null
+
+
+ allDaySlot
+ java.lang.Boolean
+
+ Determines if the "all-day" slot is displayed at the top of the calendar.
+ When hidden with false, all-day events will not be displayed in agenda views.
+ default: true
+
+ null
+
+
+ allDayText
+ java.lang.String
+
+ The text titling the "all-day" slot at the top of the calendar.
+ default: 'all-day'
+
+ null
+
+
+ axisFormat
+ java.lang.String
+
+ Determines the time-text that will be displayed on the vertical axis of the agenda views.
+ The default value will produce times that look like "5pm" and "5:30pm".
+ default: 'h(:mm)tt'
+
+ null
+
+
+ slotMinutes
+ java.lang.Integer
+
+ The frequency for displaying time slots, in minutes.
+ The default will make a slot every half hour.
+ default: 30
+
+ null
+
+
+ defaultEventMinutes
+ java.lang.Integer
+
+ Determines the length (in minutes) an event appears to be when it has an unspecified end date.
+ By default, if an Event Object has no end, it will appear to be 2 hours.
+ This option only affects events that appear in the agenda slots, meaning they have allDay set to true.
+ default: 120
+
+ null
+
+
+ firstHour
+ java.lang.Integer
+
+ Determines the first hour that will be visible in the scroll pane.
+ Values must be from 0-23, where 0=midnight, 1=1am, etc.
+ The user will be able to scroll upwards to see events before this time.
+ If you want to prevent users from doing this, use the minTime option instead.
+ default: 6
+
+ null
+
+
+ minTime
+ java.lang.String
+
+ Determines the first hour/time that will be displayed, even when the scrollbars have been scrolled all
+ the way up.
+ This can be a number like 5 (which means 5am), a string like '5:30' (which means 5:30am) or a string
+ like '5:30am'.
+ default: 0
+
+ null
+
+
+ maxTime
+ java.lang.String
+
+ Determines the last hour/time (exclusively) that will be displayed, even when the scrollbars have been
+ scrolled all the way down.
+ This can be a number like 22 (which means 10pm), a string like '22:30' (which means 10:30pm) or a string
+ like '10:30pm'.
+ default: 24
+
+ null
+
+
+ firstDay
+ java.lang.Integer
+
+ The day that each week begins.
+ The value must be a number that represents the day of the week.
+ Sunday=0, Monday=1, Tuesday=2, etc.
+ default: 0
+
+ null
+
+
+ isRTL
+ java.lang.Boolean
+
+ Displays the calendar in right-to-left mode.
+ default: false
+
+ null
+
+
+ showWeekends
+ java.lang.Boolean
+
+ Whether to include Saturday/Sunday columns in any of the calendar views.
+ default: true
+
+ null
+
+
+ height
+ java.lang.Integer
+
+ Will make the entire calendar (including header) a pixel height.
+ By default, this option is unset and the calendar's height is calculated by aspectRatio.
+
+ null
+
+
+ contentHeight
+ java.lang.Integer
+
+ Will make the calendar's content area a pixel height.
+ By default, this option is unset and the calendar's height is calculated by aspectRatio.
+
+ null
+
+
+ aspectRatio
+ java.lang.Double
+
+ Determines the width-to-height aspect ratio of the calendar.
+ A calendar is a block-level element that fills its entire avaiable width. The calendar’s height,
+ however, is determined by this ratio of width-to-height. (Hint: larger numbers make smaller heights).
+ default: 1.35
+
+ null
+
+
+ allDayByDefault
+ java.lang.Boolean
+
+ Determines the default value for each Event Object's allDay property, when it is unspecified.
+ default: true
+
+ null
+
+
+
+ editable
+ java.lang.Boolean
+
+ Determines whether the events on the calendar can be modified.
+ This determines if the events can be dragged and resized.
+ Enables/disables both at the same time.
+ If you don't want both, use editable in conjunction with disableDragging and disableResizing.
+ This option can be overridden on a per-event basis with the Event Object editable property.
+ default: false
+
+ null
+
+
+ disableDragging
+ java.lang.Boolean
+
+ Disables all event dragging, even when events are editable.
+ default: false
+
+ null
+
+
+ disableResizing
+ java.lang.Boolean
+
+ Disables all event resizing, even when events are editable.
+ default: false
+
+ null
+
+
+ dragRevertDuration
+ java.lang.Integer
+
+ Time in millisecond it takes for an event to revert to its original position after an unsuccessful drag.
+ default: 500
+
+ null
+
+
+
+ date
+ java.util.Date
+
+ The initial date when schedule loads.
+ default:
+ current date
+
+ null
+
+
+
+ onItemSelected
+ java.lang.String
+
+
+
+ null
+
+
+ onItemDragStart
+ java.lang.String
+
+
+
+ null
+
+
+ onItemDragStop
+ java.lang.String
+
+
+
+ null
+
+
+ onItemResizeStart
+ java.lang.String
+
+
+
+ null
+
+
+ onItemResizeStop
+ java.lang.String
+
+
+
+ null
+
+
+ onItemDrop
+ java.lang.String
+
+
+
+ null
+
+
+ onItemResized
+ java.lang.String
+
+
+
+ null
+
+
+ onItemMouseover
+ java.lang.String
+
+
+
+ null
+
+
+ onItemMouseout
+ java.lang.String
+
+
+
+ null
+
+
+ onViewDisplay
+ java.lang.String
+
+
+
+ null
+
+
+ onDateSelected
+ java.lang.String
+
+
+
+ null
+
+
+ styleClass
+ java.lang.String
+
+
+ null
+
+
+
+
+ itemMoveListener
+ javax.faces.el.MethodBinding
+
+ boolean
+
+
+
+ itemResizeListener
+ javax.faces.el.MethodBinding
+
+
+
+ itemSelectedListener
+ javax.faces.el.MethodBinding
+
+
+
+ viewChangedListener
+ javax.faces.el.MethodBinding
+
+
+
+ dateRangeChangedListener
+ javax.faces.el.MethodBinding
+
+
+
+ dateSelectedListener
+ javax.faces.el.MethodBinding
+
+
+
+
+ &listeners;
+
diff --git a/src/main/config/component/scheduleAgendaDayView.xml b/src/main/config/component/scheduleAgendaDayView.xml
new file mode 100644
index 0000000..fe20347
--- /dev/null
+++ b/src/main/config/component/scheduleAgendaDayView.xml
@@ -0,0 +1,33 @@
+
+
+]
+>
+
+
+ org.richfaces.ScheduleAgendaDayView
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleAgendaDayView
+ org.richfaces.component.UIScheduleAgendaDayView
+
+
+
+
+ scheduleAgendaDayView
+ org.richfaces.taglib.ScheduleAgendaDayViewTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
diff --git a/src/main/config/component/scheduleAgendaWeekView.xml b/src/main/config/component/scheduleAgendaWeekView.xml
new file mode 100644
index 0000000..eb18633
--- /dev/null
+++ b/src/main/config/component/scheduleAgendaWeekView.xml
@@ -0,0 +1,33 @@
+
+
+]
+>
+
+
+ org.richfaces.ScheduleAgendaWeekView
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleAgendaWeekView
+ org.richfaces.component.UIScheduleAgendaWeekView
+
+
+
+
+ scheduleAgendaWeekView
+ org.richfaces.taglib.ScheduleAgendaWeekViewTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
diff --git a/src/main/config/component/scheduleBasicDayView.xml b/src/main/config/component/scheduleBasicDayView.xml
new file mode 100644
index 0000000..e9250fc
--- /dev/null
+++ b/src/main/config/component/scheduleBasicDayView.xml
@@ -0,0 +1,33 @@
+
+
+]
+>
+
+
+ org.richfaces.ScheduleBasicDayView
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleBasicDayView
+ org.richfaces.component.UIScheduleBasicDayView
+
+
+
+
+ scheduleBasicDayView
+ org.richfaces.taglib.ScheduleBasicDayViewTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
diff --git a/src/main/config/component/scheduleBasicWeekView.xml b/src/main/config/component/scheduleBasicWeekView.xml
new file mode 100644
index 0000000..793b884
--- /dev/null
+++ b/src/main/config/component/scheduleBasicWeekView.xml
@@ -0,0 +1,33 @@
+
+
+]
+>
+
+
+ org.richfaces.ScheduleBasicWeekView
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleBasicWeekView
+ org.richfaces.component.UIScheduleBasicWeekView
+
+
+
+
+ scheduleBasicWeekView
+ org.richfaces.taglib.ScheduleBasicWeekViewTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
diff --git a/src/main/config/component/scheduleItem.xml b/src/main/config/component/scheduleItem.xml
new file mode 100644
index 0000000..936a8be
--- /dev/null
+++ b/src/main/config/component/scheduleItem.xml
@@ -0,0 +1,85 @@
+
+
+
+
+
+ org.richfaces.ScheduleItem
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleItem
+ org.richfaces.component.UIScheduleItem
+
+
+
+
+ scheduleItem
+ org.richfaces.taglib.ScheduleItemTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+
+
+ styleClass
+ java.lang.String
+
+
+ null
+
+
+ startDate
+ java.util.Date
+
+
+
+
+ endDate
+ java.util.Date
+
+
+
+
+ eventId
+ java.lang.String
+
+
+
+
+ title
+ java.lang.String
+
+
+
+
+ allDay
+ java.lang.Boolean
+
+
+ null
+
+
+ url
+ java.lang.String
+ null
+
+
+ editable
+ java.lang.Boolean
+ null
+
+
+
+ data
+ java.lang.Object
+ null
+
+
+
diff --git a/src/main/config/component/scheduleMonthView.xml b/src/main/config/component/scheduleMonthView.xml
new file mode 100644
index 0000000..85785fa
--- /dev/null
+++ b/src/main/config/component/scheduleMonthView.xml
@@ -0,0 +1,63 @@
+
+
+]
+>
+
+
+ org.richfaces.ScheduleMonthView
+ org.richfaces.Schedule
+ org.richfaces.component.html.HtmlScheduleMonthView
+ org.richfaces.component.UIScheduleMonthView
+
+
+
+
+ scheduleMonthView
+ org.richfaces.taglib.ScheduleMonthViewTag
+
+ org.ajax4jsf.webapp.taglib.HtmlComponentTagBase
+
+
+
+ &ui_component_attributes;
+ &commonViewAttributes;
+
+
+ weekMode
+ java.lang.String
+
+ Determines the number of weeks displayed in a month view. Also determines each week's height.
+ Available options:
+
+
+ fixed
+ - The calendar will always be 6 weeks tall. The height will always be the same, as determined by
+ height, contentHeight, or aspectRatio.
+
+
+ liquid
+ - The calendar will have either 4, 5, or 6 weeks, depending on the month. The height of the
+ weeks will stretch to fill the available height, as determined by height, contentHeight, or
+ aspectRatio.
+
+
+ variable
+ - The calendar will have either 4, 5, or 6 weeks, depending on the month. Each week will have
+ the same constant height, meaning the calendar’s height will change month-to-month.
+
+
+ default: 'fixed'
+
+ null
+
+
+
diff --git a/src/main/config/resources/resources-config.xml b/src/main/config/resources/resources-config.xml
new file mode 100644
index 0000000..482f01b
--- /dev/null
+++ b/src/main/config/resources/resources-config.xml
@@ -0,0 +1,6 @@
+
+
+
+ org.richfaces.renderkit.html.scripts.ScheduleMessages
+
+
diff --git a/src/main/java/org/richfaces/component/README b/src/main/java/org/richfaces/component/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/main/java/org/richfaces/component/README
diff --git a/src/main/java/org/richfaces/component/ScheduleCommonViewAttributes.java b/src/main/java/org/richfaces/component/ScheduleCommonViewAttributes.java
new file mode 100644
index 0000000..ff363e0
--- /dev/null
+++ b/src/main/java/org/richfaces/component/ScheduleCommonViewAttributes.java
@@ -0,0 +1,20 @@
+package org.richfaces.component;
+
+public interface ScheduleCommonViewAttributes {
+
+ public String getTimeFormat();
+
+ public void setTimeFormat(String format);
+
+ public String getColumnFormat();
+
+ public void setColumnFormat(String format);
+
+ public String getTitleFormat();
+
+ public void setTitleFormat(String format);
+
+ public Double getDragOpacity();
+
+ public void setDragOpacity(Double dragOpacity);
+}
diff --git a/src/main/java/org/richfaces/component/UISchedule.java b/src/main/java/org/richfaces/component/UISchedule.java
new file mode 100644
index 0000000..98f6904
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UISchedule.java
@@ -0,0 +1,609 @@
+package org.richfaces.component;
+
+import org.richfaces.component.event.ScheduleViewChangedEvent;
+import org.richfaces.component.event.ScheduleDateRangeChangedEvent;
+import org.richfaces.component.event.ScheduleItemResizeEvent;
+import org.richfaces.component.event.ScheduleItemSelectedEvent;
+import org.ajax4jsf.context.AjaxContext;
+import org.ajax4jsf.model.DataVisitor;
+import org.ajax4jsf.model.ExtendedDataModel;
+
+import javax.el.ELContext;
+import javax.el.ValueExpression;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIComponentBase;
+import javax.faces.context.FacesContext;
+import javax.faces.el.MethodBinding;
+import javax.faces.event.AbortProcessingException;
+import javax.faces.event.FacesEvent;
+import javax.faces.model.*;
+import javax.servlet.jsp.jstl.sql.Result;
+import java.io.IOException;
+import java.sql.ResultSet;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+import org.richfaces.component.event.ScheduleDateRangeChangedListener;
+import org.richfaces.component.event.ScheduleDateSelectedEvent;
+import org.richfaces.component.event.ScheduleDateSelectedListener;
+import org.richfaces.component.event.ScheduleItemSelectedListener;
+import org.richfaces.component.event.ScheduleItemMoveEvent;
+import org.richfaces.component.event.ScheduleItemMoveListener;
+import org.richfaces.component.event.ScheduleItemResizeListener;
+import org.richfaces.component.event.ScheduleListenerEventsProducer;
+import org.richfaces.component.event.ScheduleViewChangedListener;
+import org.richfaces.component.model.DateRange;
+
+public abstract class UISchedule extends UIComponentBase implements ScheduleCommonViewAttributes, ScheduleListenerEventsProducer {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.Schedule";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+ public static final String VIEW_MONTH = "month";
+ public static final String VIEW_BASIC_WEEK = "basicWeek";
+ public static final String VIEW_AGENDA_WEEK = "agendaWeek";
+ public static final String VIEW_BASIC_DAY = "basicDay";
+ public static final String VIEW_AGENDA_DAY = "agendaDay";
+ public static final String WEEK_MODE_FIXED = "fixed";
+ private DataModel model;
+
+ public abstract Object getValue();
+
+ public abstract void setValue(Object value);
+
+ public abstract String getVar();
+
+ public abstract void setVar(String value);
+
+ public abstract Date getDate();
+
+ public abstract void setDate(Date date);
+
+ public abstract String getSwitchType();
+
+ public abstract void setSwitchType(String switchType);
+
+ public abstract String getView();
+
+ public abstract void setView(String defaultView);
+
+ public abstract String getHeaderLeft();
+
+ public abstract void setHeaderLeft(String headerLeft);
+
+ public abstract String getHeaderCenter();
+
+ public abstract void setHeaderCenter(String headerCenter);
+
+ public abstract String getHeaderRight();
+
+ public abstract void setHeaderRight(String headerRight);
+
+ public abstract Integer getFirstDay();
+
+ public abstract void setFirstDay(Integer firstDay);
+
+ public abstract Boolean getIsRTL();
+
+ public abstract void setIsRTL(Boolean isrtl);
+
+ public abstract Boolean getShowWeekends();
+
+ public abstract void setShowWeekends(Boolean showWeekends);
+
+ public abstract String getWeekMode();
+
+ public abstract void setWeekMode(String weekMode);
+
+ public abstract Integer getHeight();
+
+ public abstract void setHeight(Integer height);
+
+ public abstract Integer getContentHeight();
+
+ public abstract void setContentHeight(Integer contentHeight);
+
+ public abstract Double getAspectRatio();
+
+ public abstract void setAspectRatio(Double aspectRatio);
+
+ public abstract Boolean getAllDayByDefault();
+
+ public abstract void setAllDayByDefault(Boolean allDayByDefault);
+
+ public abstract Boolean getAllDaySlot();
+
+ public abstract void setAllDaySlot(Boolean allDaySlot);
+
+ public abstract String getAllDayText();
+
+ public abstract void setAllDayText(String allDayText);
+
+ public abstract String getAxisFormat();
+
+ public abstract void setAxisFormat(String axisFormat);
+
+ public abstract Integer getSlotMinutes();
+
+ public abstract void setSlotMinutes(Integer slotMinutes);
+
+ public abstract Integer getDefaultEventMinutes();
+
+ public abstract void setDefaultEventMinutes(Integer defaultEventMinutes);
+
+ public abstract Integer getFirstHour();
+
+ public abstract void setFirstHour(Integer firstHour);
+
+ public abstract String getMinTime();
+
+ public abstract void setMinTime(String minTime);
+
+ public abstract String getMaxTime();
+
+ public abstract void setMaxTime(String maxTime);
+
+ public abstract Boolean getEditable();
+
+ public abstract void setEditable(Boolean editable);
+
+ public abstract Boolean getDisableDragging();
+
+ public abstract void setDisableDragging(Boolean disableDragging);
+
+ public abstract Boolean getDisableResizing();
+
+ public abstract void setDisableResizing(Boolean disableResizing);
+
+ public abstract Integer getDragRevertDuration();
+
+ public abstract void setDragRevertDuration(Integer dragRevertDuration);
+
+ public abstract Double getDragOpacity();
+
+ public abstract void setDragOpacity(Double dragOpacity);
+
+ public abstract String getStyleClass();
+
+ public abstract void setStyleClass(String styleClass);
+
+ public abstract String getOnItemSelected();
+
+ public abstract void setOnItemSelected(String onItemSelect);
+
+ public abstract String getOnItemDragStart();
+
+ public abstract void setOnItemDragStart(String onItemDragStart);
+
+ public abstract String getOnItemDragStop();
+
+ public abstract void setOnItemDragStop(String onItemDragStop);
+
+ public abstract String getOnItemDrop();
+
+ public abstract void setOnItemDrop(String onItemDrop);
+
+ public abstract String getOnItemResizeStart();
+
+ public abstract void setOnItemResizeStart(String onItemResizeStart);
+
+ public abstract String getOnItemResizeStop();
+
+ public abstract void setOnItemResizeStop(String onItemResizeStop);
+
+ public abstract String getOnItemResized();
+
+ public abstract void setOnItemResized(String onItemMouseover);
+
+ public abstract String getOnItemMouseover();
+
+ public abstract void setOnItemMouseover(String onItemMouseover);
+
+ public abstract String getOnItemMouseout();
+
+ public abstract void setOnItemMouseout(String onItemMouseout);
+
+ public abstract String getOnViewDisplay();
+
+ public abstract void setOnViewDisplay(String onViewDisplay);
+
+ public abstract String getOnDateSelected();
+
+ public abstract void setOnDateSelected(String onDaySelected);
+
+ // TODO do we use MethodBinding or MethodExpression?
+ public abstract MethodBinding getItemMoveListener();
+
+ public abstract void setItemMoveListener(MethodBinding listener);
+
+ public abstract MethodBinding getItemSelectedListener();
+
+ public abstract void setItemSelectedListener(MethodBinding listener);
+
+ public abstract MethodBinding getItemResizeListener();
+
+ public abstract void setItemResizeListener(MethodBinding listener);
+
+ public abstract MethodBinding getViewChangedListener();
+
+ public abstract void setViewChangedListener(MethodBinding listener);
+
+ public abstract MethodBinding getDateRangeChangedListener();
+
+ public abstract void setDateRangeChangedListener(MethodBinding listener);
+
+ public abstract MethodBinding getDateSelectedListener();
+
+ public abstract void setDateSelectedListener(MethodBinding listener);
+
+ @Override
+ public void broadcast(FacesEvent event) throws AbortProcessingException {
+ if (event instanceof ScheduleDateRangeChangedEvent) {
+ super.broadcast(event);
+ ScheduleDateRangeChangedEvent calendarAjaxEvent = (ScheduleDateRangeChangedEvent) event;
+ FacesContext facesContext = getFacesContext();
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext);
+ MethodBinding expression = getDateRangeChangedListener();
+ if (expression != null) {
+ expression.invoke(facesContext, new Object[]{event});
+ }
+ try {
+ ajaxContext.getResponseDataMap().put("_ajax:scheduleData", getScheduleData(calendarAjaxEvent.getStartDate(), calendarAjaxEvent.getEndDate()));
+ } catch (IOException ex) {
+ getFacesContext().getExternalContext().log("Cannot get schedule data", ex);
+ }
+ } else if (event instanceof ScheduleItemMoveEvent) {
+ FacesContext facesContext = getFacesContext();
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext);
+ MethodBinding expression = getItemMoveListener();
+ boolean allow = true;
+ if (expression != null) {
+ Object result = expression.invoke(facesContext, new Object[]{event});
+ allow = ((Boolean) result);
+ }
+ ajaxContext.setResponseData(allow);
+ super.broadcast(event);
+ } else if (event instanceof ScheduleItemResizeEvent) {
+ FacesContext facesContext = getFacesContext();
+ AjaxContext ajaxContext = AjaxContext.getCurrentInstance(facesContext);
+ MethodBinding expression = getItemResizeListener();
+ boolean allow = true;
+ if (expression != null) {
+ Object result = expression.invoke(facesContext, new Object[]{event});
+ allow = ((Boolean) result);
+ }
+ ajaxContext.setResponseData(allow);
+ super.broadcast(event);
+ } else if (event instanceof ScheduleItemSelectedEvent) {
+ super.broadcast(event);
+ FacesContext facesContext = getFacesContext();
+ MethodBinding expression = getItemSelectedListener();
+ if (expression != null) {
+ expression.invoke(facesContext, new Object[]{event});
+ }
+ } else if (event instanceof ScheduleViewChangedEvent) {
+ super.broadcast(event);
+ FacesContext facesContext = getFacesContext();
+ MethodBinding expression = getViewChangedListener();
+ if (expression != null) {
+ expression.invoke(facesContext, new Object[]{event});
+ }
+ } else if (event instanceof ScheduleDateSelectedEvent) {
+ super.broadcast(event);
+ FacesContext facesContext = getFacesContext();
+ MethodBinding expression = getDateSelectedListener();
+ if (expression != null) {
+ expression.invoke(facesContext, new Object[]{event});
+ }
+ }
+ }
+
+ /**
+ * Range is [startDate;endDate), which means that start date is inclusive
+ * and end date is exclusive.
+ *
+ * @param startDate
+ * @param endDate
+ * @return
+ * @throws IOException
+ */
+ public List> getScheduleData(Date startDate, Date endDate) throws IOException {
+ /**
+ * Locale must be US because this is the format the javascript widget supports
+ */
+ DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.US);
+ format.setLenient(false);
+ DataModel dataModel = getDataModel();
+ if (dataModel instanceof ExtendedDataModel) {
+ DataVisitor visitor = new DataVisitor() {
+ //TODO Is this fine? or should we stack rowKeys and not use dataModel later on. I'don't know business rules of extendedDataModel, just used it to did once pagination with underlying EntityQuery from Seam
+
+ public void process(FacesContext context, Object rowKey, Object argument) throws IOException {
+ }
+ };
+ ((ExtendedDataModel) dataModel).walk(getFacesContext(), visitor, new DateRange(startDate, endDate), null);
+ }
+ ELContext elContext = getFacesContext().getELContext();
+ ValueExpression valueExpression = getFacesContext().getApplication().getExpressionFactory().createValueExpression(getFacesContext().getELContext(), "#{" + getVar() + "}", Object.class);
+ List> data = new ArrayList>();
+ for (int i = 0; i < dataModel.getRowCount(); i++) {
+ dataModel.setRowIndex(i);
+ valueExpression.setValue(elContext, dataModel.getRowData());
+ Map firstDataElement = new HashMap();
+// TODO shouldn't we check earlier if there is at most one renderable UIScheduleItem child?
+ for (UIComponent child : getChildren()) {
+ if (child instanceof UIScheduleItem) {
+ UIScheduleItem item = (UIScheduleItem) child;
+ if (!item.isRendered()) {
+ continue;
+ }
+ firstDataElement.put("id", item.getEventId());
+ firstDataElement.put("title", item.getTitle());
+ if (item.getAllDay() != null) {
+ firstDataElement.put("allDay", item.getAllDay());
+ }
+ firstDataElement.put("start", format.format(item.getStartDate()));
+ if (item.getEndDate() != null) {
+ firstDataElement.put("end", format.format(item.getEndDate()));
+ }
+ if (item.getUrl() != null) {
+ firstDataElement.put("url", item.getUrl());
+ }
+ if (item.getStyleClass() != null) {
+ firstDataElement.put("className", item.getStyleClass());
+ }
+ if (item.getEditable() != null) {
+ firstDataElement.put("editable", item.getEditable());
+ }
+ if (item.getData() != null) {
+ firstDataElement.put("data", item.getData());
+ }
+ data.add(firstDataElement);
+ }
+ }
+ }
+ valueExpression.setValue(elContext, null);
+ return data;
+ }
+
+ public static Date getFirstDisplayedDay(UISchedule schedule) {
+ Calendar calendar = Calendar.getInstance();
+ Date date = schedule.getDate();
+ if (date != null) {
+ calendar.setTime(date);
+ }
+ int firstDayOfWeek = getFirstDay(schedule);
+ calendar.setFirstDayOfWeek(firstDayOfWeek);
+ String view = getView(schedule);
+ boolean showWeekends = isShowWeekends(schedule);
+ if (VIEW_MONTH.equals(view)) {
+ calendar.set(Calendar.DATE, 1);
+ if (!showWeekends) {
+ int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+ if (dayOfWeek == Calendar.SUNDAY) {
+ calendar.add(Calendar.DATE, 1);
+ } else if (dayOfWeek == Calendar.SATURDAY) {
+ calendar.add(Calendar.DATE, 2);
+ }
+ }
+ if (!showWeekends && firstDayOfWeek == Calendar.SUNDAY) {
+ firstDayOfWeek++;
+ }
+ /**
+ * Following 1 line is a fix to what i believe is a bug of java.util.Calendar
+ */
+ calendar.get(Calendar.DAY_OF_WEEK);
+ calendar.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
+ return calendar.getTime();
+ } else if (VIEW_AGENDA_WEEK.equals(view) || VIEW_BASIC_WEEK.equals(view)) {
+ calendar.set(Calendar.DAY_OF_WEEK, firstDayOfWeek);
+ if (!showWeekends) {
+ int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+ if (dayOfWeek == Calendar.SUNDAY) {
+ calendar.add(Calendar.DATE, 1);
+ } else if (dayOfWeek == Calendar.SATURDAY) {
+ calendar.add(Calendar.DATE, 2);
+ }
+ }
+ return calendar.getTime();
+ } else if (VIEW_AGENDA_DAY.equals(view) || VIEW_BASIC_DAY.equals(view)) {
+ return calendar.getTime();
+ } else {
+ throw new IllegalStateException("Invalid view attribute: " + view);
+ }
+ }
+
+ public static Date getLastDisplayedDate(UISchedule schedule) {
+ Calendar calendar = Calendar.getInstance();
+ int firstDayOfWeek = getFirstDay(schedule);
+ String view = getView(schedule);
+ boolean showWeekends = isShowWeekends(schedule);
+ if (VIEW_MONTH.equals(view)) {
+ if (WEEK_MODE_FIXED.equals(getWeekMode(schedule))) {
+ calendar.setTime(getFirstDisplayedDay(schedule));
+ calendar.add(Calendar.DAY_OF_YEAR, 7 * 6);
+ } else {
+ Date date = schedule.getDate();
+ if (date != null) {
+ calendar.setTime(date);
+ }
+
+ if (!showWeekends && firstDayOfWeek == Calendar.SUNDAY) {
+ firstDayOfWeek++;
+ }
+ calendar.setFirstDayOfWeek(firstDayOfWeek);
+ calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE));
+ int dayOfWeek = firstDayOfWeek + 6;
+ if (dayOfWeek > Calendar.SATURDAY) {
+ dayOfWeek -= 7;
+ }
+ /**
+ * Following 1 line is a fix to what i believe is a bug of java.util.Calendar
+ */
+ calendar.get(Calendar.DAY_OF_WEEK);
+ calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
+ calendar.add(Calendar.DATE, 1);
+ }
+ return calendar.getTime();
+ } else if (VIEW_AGENDA_WEEK.equals(view) || VIEW_BASIC_WEEK.equals(view)) {
+ calendar.setFirstDayOfWeek(firstDayOfWeek);
+ calendar.setTime(getFirstDisplayedDay(schedule));
+ calendar.add(Calendar.DATE, 7);
+ if (!showWeekends) {
+ int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
+ if (dayOfWeek - 1 == Calendar.SUNDAY) {
+ calendar.add(Calendar.DATE, -2);
+ } else if (dayOfWeek - 1 == Calendar.SATURDAY) {
+ calendar.add(Calendar.DATE, -1);
+ }
+ }
+ return calendar.getTime();
+ } else if (VIEW_AGENDA_DAY.equals(view) || VIEW_BASIC_DAY.equals(view)) {
+ calendar.setTime(getFirstDisplayedDay(schedule));
+ calendar.add(Calendar.DATE, 1);
+ return calendar.getTime();
+ } else {
+ throw new IllegalStateException("Invalid view attribute: " + view);
+ }
+
+ }
+
+ /**
+ * Here go static methods for getting value or default value of attributes.
+ */
+ /**
+ * @param schedule
+ * @return
+ */
+ public static boolean isShowWeekends(UISchedule schedule) {
+ Boolean showWeekends = schedule.getShowWeekends();
+ return showWeekends == null || schedule.getShowWeekends();
+ }
+
+ public static int getFirstDay(UISchedule schedule) {
+ Integer firstDay = schedule.getFirstDay();
+ if (firstDay == null) {
+ firstDay = Calendar.SUNDAY;
+ }
+ return firstDay;
+ }
+
+ public static String getWeekMode(UISchedule schedule) {
+ String weekMode = schedule.getWeekMode();
+ if (weekMode == null) {
+ weekMode = WEEK_MODE_FIXED;
+ }
+ return weekMode;
+ }
+
+ public static String getView(UISchedule schedule) {
+ String view = schedule.getView();
+ if (view == null) {
+ view = VIEW_MONTH;
+ }
+ return view;
+ }
+
+ protected DataModel getDataModel() {
+ // Return any previously cached DataModel instance
+ if (this.model != null) {
+ return (model);
+ }
+
+ // Synthesize a DataModel around our current value if possible
+ Object current = getValue();
+ if (current == null) {
+ setDataModel(new ListDataModel(Collections.EMPTY_LIST));
+ } else if (current instanceof DataModel) {
+ setDataModel((DataModel) current);
+ } else if (current instanceof List) {
+ setDataModel(new ListDataModel((List) current));
+ } else if (Object[].class.isAssignableFrom(current.getClass())) {
+ setDataModel(new ArrayDataModel((Object[]) current));
+ } else if (current instanceof ResultSet) {
+ setDataModel(new ResultSetDataModel((ResultSet) current));
+ } else if (current instanceof Result) {
+ setDataModel(new ResultDataModel((Result) current));
+ } else {
+ setDataModel(new ScalarDataModel(current));
+ }
+ return (model);
+
+ }
+
+ public void setDataModel(DataModel model) {
+ this.model = model;
+ }
+
+ public void addItemSelectedListener(ScheduleItemSelectedListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeItemSelectedListener(ScheduleItemSelectedListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleItemSelectedListener[] getItemSelectedListeners() {
+ return (ScheduleItemSelectedListener[]) getFacesListeners(ScheduleItemSelectedListener.class);
+ }
+
+ public void addItemMoveListener(ScheduleItemMoveListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeItemMoveListener(ScheduleItemMoveListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleItemMoveListener[] getItemMoveListeners() {
+ return (ScheduleItemMoveListener[]) getFacesListeners(ScheduleItemMoveListener.class);
+ }
+
+ public void addItemResizeListener(ScheduleItemResizeListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeItemResizeListener(ScheduleItemResizeListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleItemResizeListener[] getItemResizeListeners() {
+ return (ScheduleItemResizeListener[]) getFacesListeners(ScheduleItemResizeListener.class);
+ }
+
+ public void addViewChangedListener(ScheduleViewChangedListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeViewChangedListener(ScheduleViewChangedListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleViewChangedListener[] getViewChangedListeners() {
+ return (ScheduleViewChangedListener[]) getFacesListeners(ScheduleViewChangedListener.class);
+ }
+
+ public void addDateRangeChangedListener(ScheduleDateRangeChangedListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeDateRangeChangedListener(ScheduleDateRangeChangedListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleDateRangeChangedListener[] getDateRangeChangedListeners() {
+ return (ScheduleDateRangeChangedListener[]) getFacesListeners(ScheduleDateRangeChangedListener.class);
+ }
+
+ public void addDateSelectedListener(ScheduleDateSelectedListener listener) {
+ addFacesListener(listener);
+ }
+
+ public void removeDateSelectedListener(ScheduleDateSelectedListener listener) {
+ removeFacesListener(listener);
+ }
+
+ public ScheduleDateSelectedListener[] getDateSelectedListeners() {
+ return (ScheduleDateSelectedListener[]) getFacesListeners(ScheduleDateSelectedListener.class);
+ }
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleAgendaDayView.java b/src/main/java/org/richfaces/component/UIScheduleAgendaDayView.java
new file mode 100644
index 0000000..f363b69
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleAgendaDayView.java
@@ -0,0 +1,9 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class UIScheduleAgendaDayView extends UIComponentBase implements ScheduleCommonViewAttributes {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleAgendaDayView";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleAgendaWeekView.java b/src/main/java/org/richfaces/component/UIScheduleAgendaWeekView.java
new file mode 100644
index 0000000..9577cc6
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleAgendaWeekView.java
@@ -0,0 +1,9 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class UIScheduleAgendaWeekView extends UIComponentBase implements ScheduleCommonViewAttributes {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleAgendaWeekView";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleBasicDayView.java b/src/main/java/org/richfaces/component/UIScheduleBasicDayView.java
new file mode 100644
index 0000000..f8a83bd
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleBasicDayView.java
@@ -0,0 +1,9 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class UIScheduleBasicDayView extends UIComponentBase implements ScheduleCommonViewAttributes{
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleBasicDayView";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleBasicWeekView.java b/src/main/java/org/richfaces/component/UIScheduleBasicWeekView.java
new file mode 100644
index 0000000..cf23d91
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleBasicWeekView.java
@@ -0,0 +1,9 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class UIScheduleBasicWeekView extends UIComponentBase implements ScheduleCommonViewAttributes {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleBasicWeekView";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleItem.java b/src/main/java/org/richfaces/component/UIScheduleItem.java
new file mode 100644
index 0000000..3883043
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleItem.java
@@ -0,0 +1,49 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+import java.util.Date;
+
+/**
+ * JSF component class
+ */
+public abstract class UIScheduleItem extends UIComponentBase {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleItem";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+
+ public abstract String getStyleClass();
+
+ public abstract void setStyleClass(String styleClass);
+
+ public abstract String getTitle();
+
+ public abstract void setTitle(String title);
+
+ public abstract Date getStartDate();
+
+ public abstract void setStartDate(Date date);
+
+ public abstract Date getEndDate();
+
+ public abstract void setEndDate(Date date);
+
+ public abstract String getEventId();
+
+ public abstract void setEventId(String eventId);
+
+ public abstract Boolean getAllDay();
+
+ public abstract void setAllDay(Boolean isAllDay);
+
+ public abstract String getUrl();
+
+ public abstract void setUrl(String url);
+
+ public abstract Boolean getEditable();
+
+ public abstract void setEditable(Boolean editable);
+
+ public abstract Object getData();
+
+ public abstract void setData(Object data);
+}
diff --git a/src/main/java/org/richfaces/component/UIScheduleMonthView.java b/src/main/java/org/richfaces/component/UIScheduleMonthView.java
new file mode 100644
index 0000000..f779bf5
--- /dev/null
+++ b/src/main/java/org/richfaces/component/UIScheduleMonthView.java
@@ -0,0 +1,13 @@
+package org.richfaces.component;
+
+import javax.faces.component.UIComponentBase;
+
+public abstract class UIScheduleMonthView extends UIComponentBase implements ScheduleCommonViewAttributes {
+
+ public static final String COMPONENT_TYPE = "org.richfaces.ScheduleMonthView";
+ public static final String COMPONENT_FAMILY = "org.richfaces.Schedule";
+
+ public abstract String getWeekMode();
+
+ public abstract void setWeekMode(String mode);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedEvent.java b/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedEvent.java
new file mode 100644
index 0000000..02fce6b
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedEvent.java
@@ -0,0 +1,43 @@
+package org.richfaces.component.event;
+
+import java.util.Date;
+
+import javax.faces.component.UIComponent;
+
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleDateRangeChangedEvent extends FacesEvent {
+
+ private Date startDate;
+ private Date endDate;
+
+ public ScheduleDateRangeChangedEvent(UIComponent component, Date startDate, Date endDate) {
+ super(component);
+ this.startDate = startDate;
+ this.endDate = endDate;
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[startDate=" + startDate + ";endDate=" + endDate + "]";
+ }
+
+ @Override
+ public boolean isAppropriateListener(FacesListener listener) {
+ return listener instanceof ScheduleDateRangeChangedListener;
+ }
+
+ @Override
+ public void processListener(FacesListener listener) {
+ ((ScheduleDateRangeChangedListener) listener).dateRangeChanged(this);
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedListener.java b/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedListener.java
new file mode 100644
index 0000000..f11c0fd
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleDateRangeChangedListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleDateRangeChangedListener extends FacesListener {
+
+ void dateRangeChanged(ScheduleDateRangeChangedEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleDateSelectedEvent.java b/src/main/java/org/richfaces/component/event/ScheduleDateSelectedEvent.java
new file mode 100644
index 0000000..75a66e9
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleDateSelectedEvent.java
@@ -0,0 +1,39 @@
+package org.richfaces.component.event;
+
+import java.util.Date;
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleDateSelectedEvent extends FacesEvent {
+
+ private Date date;
+ private boolean allDay;
+
+ public ScheduleDateSelectedEvent(UIComponent component, Date date, boolean allDay) {
+ super(component);
+ this.date = date;
+ this.allDay = allDay;
+ }
+
+ public boolean isAppropriateListener(FacesListener facesListener) {
+ return facesListener instanceof ScheduleDateSelectedListener;
+ }
+
+ public void processListener(FacesListener facesListener) {
+ ((ScheduleDateSelectedListener) facesListener).dateSelected(this);
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public boolean isAllDay() {
+ return allDay;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[date=" + date + ";allDay=" + allDay + "]";
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleDateSelectedListener.java b/src/main/java/org/richfaces/component/event/ScheduleDateSelectedListener.java
new file mode 100644
index 0000000..9e83fbe
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleDateSelectedListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleDateSelectedListener extends FacesListener {
+
+ void dateSelected(ScheduleDateSelectedEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemMoveEvent.java b/src/main/java/org/richfaces/component/event/ScheduleItemMoveEvent.java
new file mode 100644
index 0000000..f469277
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemMoveEvent.java
@@ -0,0 +1,50 @@
+package org.richfaces.component.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleItemMoveEvent extends FacesEvent {
+
+ private String eventId;
+ private int dayDelta;
+ private int minuteDelta;
+ private boolean allDay;
+
+ public ScheduleItemMoveEvent(UIComponent component, String eventId, int dayDelta, int minuteDelta, boolean allDay) {
+ super(component);
+ this.eventId = eventId;
+ this.dayDelta = dayDelta;
+ this.minuteDelta = minuteDelta;
+ this.allDay = allDay;
+ }
+
+ public boolean isAppropriateListener(FacesListener facesListener) {
+ return facesListener instanceof ScheduleItemMoveListener;
+ }
+
+ public void processListener(FacesListener facesListener) {
+ ((ScheduleItemMoveListener) facesListener).itemMove(this);
+ }
+
+ public String getEventId() {
+ return eventId;
+ }
+
+ public int getDayDelta() {
+ return dayDelta;
+ }
+
+ public int getMinuteDelta() {
+ return minuteDelta;
+ }
+
+ public boolean isAllDay() {
+ return allDay;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[eventId=" + eventId + ";dayDelta=" + dayDelta + ";minuteDelta=" + minuteDelta + ";allDay=" + allDay + "]";
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemMoveListener.java b/src/main/java/org/richfaces/component/event/ScheduleItemMoveListener.java
new file mode 100644
index 0000000..d30484f
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemMoveListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleItemMoveListener extends FacesListener{
+
+ void itemMove(ScheduleItemMoveEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemResizeEvent.java b/src/main/java/org/richfaces/component/event/ScheduleItemResizeEvent.java
new file mode 100644
index 0000000..5b8940a
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemResizeEvent.java
@@ -0,0 +1,44 @@
+package org.richfaces.component.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleItemResizeEvent extends FacesEvent {
+
+ private String eventId;
+ private int dayDelta;
+ private int minuteDelta;
+
+ public ScheduleItemResizeEvent(UIComponent component, String eventId, int dayDelta, int minuteDelta) {
+ super(component);
+ this.eventId = eventId;
+ this.dayDelta = dayDelta;
+ this.minuteDelta = minuteDelta;
+ }
+
+ public boolean isAppropriateListener(FacesListener facesListener) {
+ return facesListener instanceof ScheduleItemResizeListener;
+ }
+
+ public void processListener(FacesListener facesListener) {
+ ((ScheduleItemResizeListener) facesListener).itemResize(this);
+ }
+
+ public String getEventId() {
+ return eventId;
+ }
+
+ public int getDayDelta() {
+ return dayDelta;
+ }
+
+ public int getMinuteDelta() {
+ return minuteDelta;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[eventId=" + eventId + ";dayDelta=" + dayDelta + ";minuteDelta=" + minuteDelta + "]";
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemResizeListener.java b/src/main/java/org/richfaces/component/event/ScheduleItemResizeListener.java
new file mode 100644
index 0000000..032e16e
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemResizeListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleItemResizeListener extends FacesListener{
+
+ void itemResize(ScheduleItemResizeEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemSelectedEvent.java b/src/main/java/org/richfaces/component/event/ScheduleItemSelectedEvent.java
new file mode 100644
index 0000000..57b8d63
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemSelectedEvent.java
@@ -0,0 +1,32 @@
+package org.richfaces.component.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleItemSelectedEvent extends FacesEvent {
+
+ private String eventId;
+
+ public ScheduleItemSelectedEvent(UIComponent component, String eventId) {
+ super(component);
+ this.eventId = eventId;
+ }
+
+ public boolean isAppropriateListener(FacesListener facesListener) {
+ return facesListener instanceof ScheduleItemSelectedListener;
+ }
+
+ public void processListener(FacesListener facesListener) {
+ ((ScheduleItemSelectedListener) facesListener).itemSelected(this);
+ }
+
+ public String getEventId() {
+ return eventId;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[eventId=" + eventId + "]";
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleItemSelectedListener.java b/src/main/java/org/richfaces/component/event/ScheduleItemSelectedListener.java
new file mode 100644
index 0000000..a163247
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleItemSelectedListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleItemSelectedListener extends FacesListener {
+
+ public void itemSelected(ScheduleItemSelectedEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleListenerEventsProducer.java b/src/main/java/org/richfaces/component/event/ScheduleListenerEventsProducer.java
new file mode 100644
index 0000000..0b1b43d
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleListenerEventsProducer.java
@@ -0,0 +1,28 @@
+package org.richfaces.component.event;
+
+public interface ScheduleListenerEventsProducer {
+
+ void addItemSelectedListener(ScheduleItemSelectedListener listener);
+ void removeItemSelectedListener(ScheduleItemSelectedListener listener);
+ ScheduleItemSelectedListener[] getItemSelectedListeners();
+
+ void addItemMoveListener(ScheduleItemMoveListener listener);
+ void removeItemMoveListener(ScheduleItemMoveListener listener);
+ ScheduleItemMoveListener[] getItemMoveListeners();
+
+ void addItemResizeListener(ScheduleItemResizeListener listener);
+ void removeItemResizeListener(ScheduleItemResizeListener listener);
+ ScheduleItemResizeListener[] getItemResizeListeners();
+
+ void addViewChangedListener(ScheduleViewChangedListener listener);
+ void removeViewChangedListener(ScheduleViewChangedListener listener);
+ ScheduleViewChangedListener[] getViewChangedListeners();
+
+ void addDateRangeChangedListener(ScheduleDateRangeChangedListener listener);
+ void removeDateRangeChangedListener(ScheduleDateRangeChangedListener listener);
+ ScheduleDateRangeChangedListener[] getDateRangeChangedListeners();
+
+ void addDateSelectedListener(ScheduleDateSelectedListener listener);
+ void removeDateSelectedListener(ScheduleDateSelectedListener listener);
+ ScheduleDateSelectedListener[] getDateSelectedListeners();
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleViewChangedEvent.java b/src/main/java/org/richfaces/component/event/ScheduleViewChangedEvent.java
new file mode 100644
index 0000000..13e0ef8
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleViewChangedEvent.java
@@ -0,0 +1,32 @@
+package org.richfaces.component.event;
+
+import javax.faces.component.UIComponent;
+import javax.faces.event.FacesEvent;
+import javax.faces.event.FacesListener;
+
+public class ScheduleViewChangedEvent extends FacesEvent {
+
+ private String view;
+
+ public ScheduleViewChangedEvent(UIComponent component, String view) {
+ super(component);
+ this.view = view;
+ }
+
+ public boolean isAppropriateListener(FacesListener facesListener) {
+ return facesListener instanceof ScheduleViewChangedListener;
+ }
+
+ public void processListener(FacesListener facesListener) {
+ ((ScheduleViewChangedListener) facesListener).viewChanged(this);
+ }
+
+ public String getView() {
+ return view;
+ }
+
+ @Override
+ public String toString() {
+ return getClass().getSimpleName() + "[view=" + view + "]";
+ }
+}
diff --git a/src/main/java/org/richfaces/component/event/ScheduleViewChangedListener.java b/src/main/java/org/richfaces/component/event/ScheduleViewChangedListener.java
new file mode 100644
index 0000000..2da6982
--- /dev/null
+++ b/src/main/java/org/richfaces/component/event/ScheduleViewChangedListener.java
@@ -0,0 +1,8 @@
+package org.richfaces.component.event;
+
+import javax.faces.event.FacesListener;
+
+public interface ScheduleViewChangedListener extends FacesListener{
+
+ void viewChanged(ScheduleViewChangedEvent event);
+}
diff --git a/src/main/java/org/richfaces/component/model/DateRange.java b/src/main/java/org/richfaces/component/model/DateRange.java
new file mode 100644
index 0000000..d47b583
--- /dev/null
+++ b/src/main/java/org/richfaces/component/model/DateRange.java
@@ -0,0 +1,34 @@
+package org.richfaces.component.model;
+
+import java.util.Date;
+import org.ajax4jsf.model.Range;
+
+public class DateRange implements Range {
+
+ private Date startDate;
+ private Date endDate;
+
+ public DateRange() {
+ }
+
+ public DateRange(Date startDate, Date endDate) {
+ setStartDate(startDate);
+ setEndDate(endDate);
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(Date startDate) {
+ this.startDate = startDate;
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(Date endDate) {
+ this.endDate = endDate;
+ }
+}
diff --git a/src/main/java/org/richfaces/renderkit/ScheduleRendererBase.java b/src/main/java/org/richfaces/renderkit/ScheduleRendererBase.java
new file mode 100644
index 0000000..6663043
--- /dev/null
+++ b/src/main/java/org/richfaces/renderkit/ScheduleRendererBase.java
@@ -0,0 +1,291 @@
+package org.richfaces.renderkit;
+
+import java.util.Locale;
+import org.richfaces.component.event.ScheduleViewChangedEvent;
+import org.richfaces.component.event.ScheduleDateRangeChangedEvent;
+import org.richfaces.component.event.ScheduleItemResizeEvent;
+import org.richfaces.component.event.ScheduleItemSelectedEvent;
+import org.ajax4jsf.javascript.JSFunction;
+import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.javascript.JSObject;
+import org.ajax4jsf.javascript.JSReference;
+import org.ajax4jsf.renderkit.AjaxComponentRendererBase;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
+import org.richfaces.component.*;
+
+import javax.faces.component.NamingContainer;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.faces.FacesException;
+
+import org.richfaces.component.event.ScheduleDateSelectedEvent;
+import org.richfaces.component.event.ScheduleItemMoveEvent;
+
+public abstract class ScheduleRendererBase extends AjaxComponentRendererBase {
+
+ public static final String ITEM_MOVE_EVENT = "itemMove";
+ public static final String ITEM_RESIZE_EVENT = "itemResize";
+ public static final String ITEM_SELECTED_EVENT = "itemSelected";
+ public static final String DATE_RANGE_CHANGED_EVENT = "dateRangeChanged";
+ public static final String VIEW_CHANGED_EVENT = "viewChanged";
+ public static final String DATE_SELECTED_EVENT = "dateSelected";
+ public static final String AJAX_MODE = "ajax";
+ public static final String SERVER_MODE = "server";
+ public static final String CLIENT_MODE = "client";
+ private static final String CALLBACK = "callback";
+ private static final String END_DATE_PARAM = "endDate";
+ private static final String START_DATE_PARAM = "startDate";
+ private static final String ITEM_ID_PARAM = "itemId";
+ private static final String DAY_DELTA_PARAM = "dayDelta";
+ private static final String MINUTE_DELTA_PARAM = "minuteDelta";
+ private static final String ALL_DAY_PARAM = "allDay";
+ private static final String EVENT_TYPE_PARAM = "eventType";
+ private static final String VIEW_PARAM = "view";
+
+ protected Object createSubmitEventFunction(FacesContext context, UISchedule component) {
+ JSFunction jsFunction = null;
+ Map params = new HashMap();
+ params.put(getFieldId(context, component, START_DATE_PARAM), new JSReference(START_DATE_PARAM));
+ params.put(getFieldId(context, component, END_DATE_PARAM), new JSReference(END_DATE_PARAM));
+ params.put(getFieldId(context, component, ITEM_ID_PARAM), new JSReference(ITEM_ID_PARAM));
+ params.put(getFieldId(context, component, DAY_DELTA_PARAM), new JSReference(DAY_DELTA_PARAM));
+ params.put(getFieldId(context, component, MINUTE_DELTA_PARAM), new JSReference(MINUTE_DELTA_PARAM));
+ params.put(getFieldId(context, component, ALL_DAY_PARAM), new JSReference(ALL_DAY_PARAM));
+ params.put(getFieldId(context, component, EVENT_TYPE_PARAM), new JSReference(EVENT_TYPE_PARAM));
+ params.put(getFieldId(context, component, VIEW_PARAM), new JSReference(VIEW_PARAM));
+ if (isAjaxMode(component)) {
+ jsFunction = AjaxRendererUtils.buildAjaxFunction(component, context);
+ Map eventOptions = AjaxRendererUtils.buildEventOptions(context, component, params);
+ eventOptions.put("oncomplete", new JSReference(CALLBACK));
+ jsFunction.addParameter(eventOptions);
+ } else if (SERVER_MODE.equals(component.getSwitchType())) {
+ jsFunction = new JSFunction("Richfaces.jsFormSubmit",
+ component.getClientId(context),
+ getUtils().getNestingForm(context, component).getClientId(context),
+ null,
+ params);
+ } else {
+ return null;
+ }
+ return new JSFunctionDefinition("event", VIEW_PARAM, EVENT_TYPE_PARAM, ITEM_ID_PARAM, START_DATE_PARAM, END_DATE_PARAM, DAY_DELTA_PARAM, MINUTE_DELTA_PARAM, ALL_DAY_PARAM, CALLBACK).addToBody(jsFunction);
+ }
+
+ @Override
+ public void decode(FacesContext context, UIComponent component) {
+ if (!component.isRendered()) {
+ return;
+ }
+ Map requestParameterMap = context.getExternalContext().getRequestParameterMap();
+ if (requestParameterMap.get(component.getClientId(context)) != null) {
+ String startDateParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, START_DATE_PARAM));
+ String endDateParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, END_DATE_PARAM));
+ String itemIdParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, ITEM_ID_PARAM));
+ String dayDeltaParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, DAY_DELTA_PARAM));
+ String minuteDeltaParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, MINUTE_DELTA_PARAM));
+ String allDayParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, ALL_DAY_PARAM));
+ String eventTypeParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, EVENT_TYPE_PARAM));
+ String viewParam = requestParameterMap.get(getFieldId(context, (UISchedule) component, VIEW_PARAM));
+
+ try {
+ if (DATE_RANGE_CHANGED_EVENT.equals(eventTypeParam)) {
+ Date startDate = new Date(Long.parseLong(startDateParam) * 1000);
+ Date endDate = new Date(Long.parseLong(endDateParam) * 1000);
+ new ScheduleDateRangeChangedEvent(component, startDate, endDate).queue();
+ } else if (ITEM_MOVE_EVENT.equals(eventTypeParam)) {
+ int dayDelta = Integer.parseInt(dayDeltaParam);
+ int minuteDelta = Integer.parseInt(minuteDeltaParam);
+ boolean allDay = Boolean.parseBoolean(allDayParam);
+ new ScheduleItemMoveEvent(component, itemIdParam, dayDelta, minuteDelta, allDay).queue();
+ } else if (ITEM_RESIZE_EVENT.equals(eventTypeParam)) {
+ int dayDelta = Integer.parseInt(dayDeltaParam);
+ int minuteDelta = Integer.parseInt(minuteDeltaParam);
+ new ScheduleItemResizeEvent(component, itemIdParam, dayDelta, minuteDelta).queue();
+ } else if (ITEM_SELECTED_EVENT.equals(eventTypeParam)) {
+ new ScheduleItemSelectedEvent(component, itemIdParam).queue();
+ } else if (VIEW_CHANGED_EVENT.equals(eventTypeParam)) {
+ new ScheduleViewChangedEvent(component, viewParam).queue();
+ } else if (DATE_SELECTED_EVENT.equals(eventTypeParam)) {
+ Date startDate = new Date(Long.parseLong(startDateParam) * 1000);
+ boolean allDay = Boolean.parseBoolean(allDayParam);
+ new ScheduleDateSelectedEvent(component, startDate, allDay).queue();
+ }
+ } catch (NumberFormatException ex) {
+ throw new FacesException("Cannot convert request parmeters", ex);
+ }
+ }
+ }
+
+ public void writeInitFunction(FacesContext context, UISchedule component) throws IOException {
+ ResponseWriter writer = context.getResponseWriter();
+ String clientId = component.getClientId(context);
+ Locale locale = context.getViewRoot().getLocale();
+ writer.writeText(new JSObject("RichFaces.Schedule", clientId, locale.getLanguage(),
+ getOptions(component),
+ DATE_RANGE_CHANGED_EVENT,
+ ITEM_SELECTED_EVENT,
+ ITEM_MOVE_EVENT,
+ ITEM_RESIZE_EVENT,
+ VIEW_CHANGED_EVENT,
+ DATE_SELECTED_EVENT,
+ createSubmitEventFunction(context, component)).toScript(),
+ null);
+ }
+
+ public Map getOptions(UISchedule schedule) throws IOException {
+ /**
+ * Copy attributes from child view components
+ */
+ for (UIComponent child : schedule.getChildren()) {
+ if (!child.isRendered()) {
+ continue;
+ }
+ String suffix = "";
+ if (child instanceof UIScheduleMonthView) {
+ copyAttribute("weekMode", "", child, schedule);
+ suffix = "Month";
+ } else if (child instanceof UIScheduleAgendaDayView) {
+ suffix = "AgendaDay";
+ } else if (child instanceof UIScheduleAgendaWeekView) {
+ suffix = "AgendaWeek";
+ } else if (child instanceof UIScheduleBasicDayView) {
+ suffix = "BasicDay";
+ } else if (child instanceof UIScheduleBasicWeekView) {
+ suffix = "BasicWeek";
+ }
+ if (child instanceof ScheduleCommonViewAttributes) {
+ copyAttribute("timeFormat", suffix, child, schedule);
+ copyAttribute("columnFormat", suffix, child, schedule);
+ copyAttribute("titleFormat", suffix, child, schedule);
+ copyAttribute("dragOpacity", suffix, child, schedule);
+ }
+ }
+ /**
+ * Include only attributes that are actually set.
+ */
+ Map options = new HashMap();
+ addOptionIfSet("defaultView", schedule.getView(), options);
+// TODO shall we numerate firstDayOfWeek as in Calendar (sunday=1,monday=2,etc.) or like in widget(sunday=0,monday=1,etc.)?
+ if (schedule.getFirstDay() != null) {
+ options.put("firstDay", schedule.getFirstDay() - 1);
+ }
+ addOptionIfSet("isRTL", schedule.getIsRTL(), options);
+ addOptionIfSet("weekends", schedule.getShowWeekends(), options);
+ addOptionIfSet("weekMode", schedule.getWeekMode(), options);
+ addOptionIfSet("height", schedule.getHeight(), options);
+ addOptionIfSet("contentHeight", schedule.getContentHeight(), options);
+ addOptionIfSet("aspectRatio", schedule.getAspectRatio(), options);
+ addOptionIfSet("allDaySlot", schedule.getAllDaySlot(), options);
+ addOptionIfSet("allDayText", schedule.getAllDayText(), options);
+ addOptionIfSet("axisFormat", schedule.getAxisFormat(), options);
+ addOptionIfSet("slotMinutes", schedule.getSlotMinutes(), options);
+ addOptionIfSet("defaultEventMinutes", schedule.getDefaultEventMinutes(), options);
+ addOptionIfSet("firstHour", schedule.getFirstHour(), options);
+ addOptionIfSet("minTime", schedule.getMinTime(), options);
+ addOptionIfSet("maxTime", schedule.getMaxTime(), options);
+ addOptionIfSet("editable", schedule.getEditable(), options);
+ addOptionIfSet("disableDragging", schedule.getDisableDragging(), options);
+ addOptionIfSet("disableResizing", schedule.getDisableResizing(), options);
+ addOptionIfSet("dragRevertDuration", schedule.getDragRevertDuration(), options);
+ addOptionHash("dragOpacity", schedule, options);
+ addOptionHash("titleFormat", schedule, options);
+ addOptionHash("timeFormat", schedule, options);
+ addOptionHash("columnFormat", schedule, options);
+ Map headerOptions = new HashMap(3);
+ addOptionIfSet("left", schedule.getHeaderLeft(), headerOptions);
+ addOptionIfSet("center", schedule.getHeaderCenter(), headerOptions);
+ addOptionIfSet("right", schedule.getHeaderRight(), headerOptions);
+ if (headerOptions.size() > 0) {
+ options.put("header", headerOptions);
+ }
+ addOptionIfSet("allDayDefault", schedule.getAllDayByDefault(), options);
+ addOptionIfSet("onItemSelected", schedule.getOnItemSelected(), options);
+ addOptionIfSet("onItemDrop", schedule.getOnItemDrop(), options);
+ addOptionIfSet("onItemResized", schedule.getOnItemResized(), options);
+ addOptionIfSet("onItemResizeStart", schedule.getOnItemResizeStart(), options);
+ addOptionIfSet("onItemResizeStop", schedule.getOnItemResizeStop(), options);
+ addOptionIfSet("onItemDragStart", schedule.getOnItemDragStart(), options);
+ addOptionIfSet("onItemDragStop", schedule.getOnItemDragStop(), options);
+ addOptionIfSet("onItemMouseover", schedule.getOnItemMouseover(), options);
+ addOptionIfSet("onItemMouseout", schedule.getOnItemMouseout(), options);
+ addOptionIfSet("onViewDisplay", schedule.getOnViewDisplay(), options);
+ addOptionIfSet("onDateSelected", schedule.getOnDateSelected(), options);
+ if (schedule.getDate() != null) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(schedule.getDate());
+ options.put("year", calendar.get(Calendar.YEAR));
+ options.put("month", calendar.get(Calendar.MONTH));
+ options.put("date", calendar.get(Calendar.DATE));
+ }
+ if (!isClientMode(schedule)) {
+ Map initialItems = new HashMap();
+ Date startDate = UISchedule.getFirstDisplayedDay(schedule);
+ Date endDate = UISchedule.getLastDisplayedDate(schedule);
+ initialItems.put("items", schedule.getScheduleData(startDate, endDate));
+ Map date = new HashMap();
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(startDate);
+ date.put("year", calendar.get(Calendar.YEAR));
+ date.put("month", calendar.get(Calendar.MONTH));
+ date.put("date", calendar.get(Calendar.DATE));
+ initialItems.put("startDate", date);
+ date = new HashMap();
+ calendar.setTime(endDate);
+ date.put("year", calendar.get(Calendar.YEAR));
+ date.put("month", calendar.get(Calendar.MONTH));
+ date.put("date", calendar.get(Calendar.DATE));
+ initialItems.put("endDate", date);
+ options.put("initialItems", initialItems);
+ } else {
+ options.put("events", schedule.getScheduleData(null, null));
+ }
+ return options;
+ }
+
+ protected void addOptionIfSet(String optionName, Object value, Map options) {
+ if (value != null && value != "") {
+ options.put(optionName, value);
+ }
+ }
+
+ public String getFieldId(FacesContext context, UISchedule component, String attribute) {
+ return getUtils().clientId(context, component) + NamingContainer.SEPARATOR_CHAR + attribute;
+ }
+
+ private void addOptionHash(String attribute, UIComponent source, Map options) {
+ Map hash = new HashMap(3);
+ Map attributes = source.getAttributes();
+ addOptionIfSet("month", attributes.get(attribute + "Month"), hash);
+ addOptionIfSet("basicWeek", attributes.get(attribute + "BasicWeek"), hash);
+ addOptionIfSet("agendaWeek", attributes.get(attribute + "AgendaWeek"), hash);
+ addOptionIfSet("basicDay", attributes.get(attribute + "BasicDay"), hash);
+ addOptionIfSet("agendaDay", attributes.get(attribute + "AgendaDay"), hash);
+ addOptionIfSet("", attributes.get(attribute), hash);
+ if (hash.size() > 0) {
+ options.put(attribute, hash);
+ }
+ }
+
+ private boolean isAjaxMode(UISchedule component) {
+ String mode = component.getSwitchType();
+ return AJAX_MODE.equals(mode) || "".equals(mode) || null == mode;
+ }
+
+ private boolean isClientMode(UISchedule component) {
+ String mode = component.getSwitchType();
+ return CLIENT_MODE.equals(mode);
+ }
+
+ private static void copyAttribute(String attribute, String suffix, UIComponent source, UIComponent target) {
+ Object value = source.getAttributes().get(attribute);
+ if (value != null) {
+ target.getAttributes().put(attribute + suffix, value);
+ }
+ }
+}
diff --git a/src/main/java/org/richfaces/renderkit/html/scripts/ScheduleMessages.java b/src/main/java/org/richfaces/renderkit/html/scripts/ScheduleMessages.java
new file mode 100644
index 0000000..7719455
--- /dev/null
+++ b/src/main/java/org/richfaces/renderkit/html/scripts/ScheduleMessages.java
@@ -0,0 +1,49 @@
+package org.richfaces.renderkit.html.scripts;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+import java.util.Locale;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import javax.faces.FactoryFinder;
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import org.ajax4jsf.resource.InternetResourceBase;
+import org.ajax4jsf.resource.ResourceContext;
+
+public class ScheduleMessages extends InternetResourceBase {
+
+ @Override
+ public InputStream getResourceAsStream(ResourceContext context) {
+//TODO how to access messages from here if user keeps them somewhere else?
+ String language = "pl";
+ Locale locale = new Locale(language);
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+//TODO load default locale if specific is null
+ ResourceBundle bundle = ResourceBundle.getBundle("org.richfaces.component.scheduleMessages", locale, loader);
+ StringBuilder out = new StringBuilder();
+ out.append("RichFaces.Schedule.prototype.messages=jQuery.extend(RichFaces.Schedule.prototype.messages,{").append("'").append(locale).append("':{").append("monthNames:[");
+ String[] months = new String[]{"JANUARY","FEBRUARY"};
+ for (int i = 0; i < months.length; i++) {
+ out.append("'");
+//TODO Handle MissingResourceException
+//TODO Escape message strings
+ try {
+ out.append(escape(bundle.getString("org.richfaces.component.UISchedule.monthNames." + months[i])));
+ } catch (MissingResourceException e) {
+ out.append(escape(months[i]));
+ }
+ out.append("'");
+ if (i + 1 < months.length) {
+ out.append(",");
+ }
+ }
+ out.append("]").append("}").append("})");
+ return new ByteArrayInputStream(out.toString().getBytes());
+ }
+
+ private String escape(String message) {
+ return message.replaceAll("'", "\\'");
+ }
+}
diff --git a/src/main/java/org/richfaces/taglib/ScheduleTagHandlerBase.java b/src/main/java/org/richfaces/taglib/ScheduleTagHandlerBase.java
new file mode 100644
index 0000000..1964387
--- /dev/null
+++ b/src/main/java/org/richfaces/taglib/ScheduleTagHandlerBase.java
@@ -0,0 +1,92 @@
+package org.richfaces.taglib;
+
+import com.sun.facelets.FaceletContext;
+import com.sun.facelets.tag.MetaRule;
+import com.sun.facelets.tag.MetaRuleset;
+import com.sun.facelets.tag.Metadata;
+import com.sun.facelets.tag.MetadataTarget;
+import com.sun.facelets.tag.TagAttribute;
+import com.sun.facelets.tag.jsf.ComponentConfig;
+import com.sun.facelets.tag.jsf.ComponentHandler;
+import javax.faces.component.UIComponent;
+import javax.faces.el.MethodBinding;
+import org.richfaces.event.NodeExpandedEvent;
+import org.richfaces.event.NodeSelectedEvent;
+
+public class ScheduleTagHandlerBase extends ComponentHandler {
+
+ private final static String DATE_RANGE_CHANGED_LISTENER = "dateRangeChangedListener";
+ private final static String DATE_SELECTED_LISTENER = "dateSelectedListener";
+ private final static String ITEM_RESIZE_LISTENER = "itemResizeListener";
+ private final static String ITEM_MOVE_LISTENER = "itemMoveListener";
+ private final static String ITEM_SELECTED_LISTENER = "itemSelectedListener";
+ private final static String VIEW_CHANGED_LISTENER = "viewChangedListener";
+
+ public ScheduleTagHandlerBase(ComponentConfig config) {
+ super(config);
+ }
+
+ @Override
+ protected MetaRuleset createMetaRuleset(Class clazz) {
+ MetaRuleset ruleset = super.createMetaRuleset(clazz);
+
+ ruleset.addRule(new MetaRule() {
+
+ public Metadata applyRule(String name, final TagAttribute attribute, MetadataTarget metadataTarget) {
+ if (DATE_RANGE_CHANGED_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeExpandedEvent.class});
+ ((UIComponent) object).getAttributes().put(DATE_RANGE_CHANGED_LISTENER, binding);
+ }
+ };
+ } else if (DATE_SELECTED_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeSelectedEvent.class});
+ ((UIComponent) object).getAttributes().put(DATE_SELECTED_LISTENER, binding);
+ }
+ };
+ } else if (ITEM_RESIZE_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeSelectedEvent.class});
+ ((UIComponent) object).getAttributes().put(ITEM_RESIZE_LISTENER, binding);
+ }
+ };
+ } else if (ITEM_MOVE_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeSelectedEvent.class});
+ ((UIComponent) object).getAttributes().put(ITEM_MOVE_LISTENER, binding);
+ }
+ };
+ } else if (ITEM_SELECTED_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeSelectedEvent.class});
+ ((UIComponent) object).getAttributes().put(ITEM_SELECTED_LISTENER, binding);
+ }
+ };
+ } else if (VIEW_CHANGED_LISTENER.equals(name)) {
+ return new Metadata() {
+
+ public void applyMetadata(FaceletContext context, Object object) {
+ MethodBinding binding = context.getFacesContext().getApplication().createMethodBinding(attribute.getValue(), new Class[]{NodeSelectedEvent.class});
+ ((UIComponent) object).getAttributes().put(VIEW_CHANGED_LISTENER, binding);
+ }
+ };
+ }
+
+ return null;
+ }
+ });
+
+ return ruleset;
+ }
+}
diff --git a/src/main/resources/org/richfaces/component/scheduleMessages.properties b/src/main/resources/org/richfaces/component/scheduleMessages.properties
new file mode 100644
index 0000000..47bed51
--- /dev/null
+++ b/src/main/resources/org/richfaces/component/scheduleMessages.properties
@@ -0,0 +1 @@
+org.richfaces.component.UISchedule.monthNames.JANUARY=January
\ No newline at end of file
diff --git a/src/main/resources/org/richfaces/renderkit/html/css/fullcalendar.css b/src/main/resources/org/richfaces/renderkit/html/css/fullcalendar.css
new file mode 100644
index 0000000..888f6ea
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/css/fullcalendar.css
@@ -0,0 +1,575 @@
+/*
+ * FullCalendar v1.4.5 Stylesheet
+ *
+ * Feel free to edit this file to customize the look of FullCalendar.
+ * When upgrading to newer versions, please upgrade this file as well,
+ * porting over any customizations afterwards.
+ *
+ * Date: Sun Feb 21 20:30:11 2010 -0800
+ *
+ * TODO adjust class names to richfaces naming conventions
+ */
+
+
+.fc,
+.fc .fc-header,
+.fc .fc-content {
+ font-size: 1em;
+ }
+
+.fc {
+ direction: ltr;
+ text-align: left;
+ }
+
+.fc table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+
+.fc td, .fc th {
+ padding: 0;
+ vertical-align: top;
+ }
+
+
+
+/* Header
+------------------------------------------------------------------------*/
+
+table.fc-header {
+ width: 100%;
+ }
+
+.fc-header-left {
+ width: 25%;
+ }
+
+.fc-header-left table {
+ float: left;
+ }
+
+.fc-header-center {
+ width: 50%;
+ text-align: center;
+ }
+
+.fc-header-center table {
+ margin: 0 auto;
+ }
+
+.fc-header-right {
+ width: 25%;
+ }
+
+.fc-header-right table {
+ float: right;
+ }
+
+.fc-header-title {
+ margin-top: 0;
+ white-space: nowrap;
+ }
+
+.fc-header-space {
+ padding-left: 10px;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-header-title {
+ direction: rtl;
+ }
+
+
+
+/* Buttons
+------------------------------------------------------------------------*/
+
+.fc-header .fc-state-default,
+.fc-header .ui-state-default {
+ margin-bottom: 1em;
+ cursor: pointer;
+ }
+
+.fc-header .fc-state-default {
+ border-width: 1px 0;
+ padding: 0 1px;
+ }
+
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+ border-style: solid;
+ }
+
+.fc-header .fc-state-default a {
+ display: block;
+ border-width: 0 1px;
+ margin: 0 -1px;
+ width: 100%;
+ text-decoration: none;
+ }
+
+.fc-header .fc-state-default span {
+ display: block;
+ border-style: solid;
+ border-width: 1px 0 1px 1px;
+ padding: 3px 5px;
+ }
+
+.fc-header .ui-state-default {
+ padding: 4px 6px;
+ }
+
+.fc-header .fc-state-default span,
+.fc-header .ui-state-default span {
+ white-space: nowrap;
+ }
+
+/* for adjacent buttons */
+
+.fc-header .fc-no-right {
+ padding-right: 0;
+ }
+
+.fc-header .fc-no-right a {
+ margin-right: 0;
+ border-right: 0;
+ }
+
+.fc-header .ui-no-right {
+ border-right: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-header .fc-corner-left {
+ margin-left: 1px;
+ padding-left: 0;
+ }
+
+.fc-header .fc-corner-right {
+ margin-right: 1px;
+ padding-right: 0;
+ }
+
+/* DEFAULT button COLORS */
+
+.fc-header .fc-state-default,
+.fc-header .fc-state-default a {
+ border-color: #777; /* outer border */
+ color: #333;
+ }
+
+.fc-header .fc-state-default span {
+ border-color: #fff #fff #d1d1d1; /* inner border */
+ background: #e8e8e8;
+ }
+
+/* PRESSED button COLORS (down and active) */
+
+.fc-header .fc-state-active a {
+ color: #fff;
+ }
+
+.fc-header .fc-state-down span,
+.fc-header .fc-state-active span {
+ background: #888;
+ border-color: #808080 #808080 #909090; /* inner border */
+ }
+
+/* DISABLED button COLORS */
+
+.fc-header .fc-state-disabled a {
+ color: #999;
+ }
+
+.fc-header .fc-state-disabled,
+.fc-header .fc-state-disabled a {
+ border-color: #ccc; /* outer border */
+ }
+
+.fc-header .fc-state-disabled span {
+ border-color: #fff #fff #f0f0f0; /* inner border */
+ background: #f0f0f0;
+ }
+
+
+
+/* Content Area & Global Cell Styles
+------------------------------------------------------------------------*/
+
+.fc-widget-content {
+ border: 1px solid #ccc; /* outer border color */
+ }
+
+.fc-content {
+ clear: both;
+ }
+
+.fc-content .fc-state-default {
+ border-style: solid;
+ border-color: #ccc; /* inner border color */
+ }
+
+.fc-content .fc-state-highlight { /* today */
+ background: #ffc;
+ }
+
+.fc-content .fc-not-today {
+ background: none;
+ }
+
+.fc-cell-overlay { /* semi-transparent rectangle while dragging */
+ background: #9cf;
+ opacity: .2;
+ filter: alpha(opacity=20); /* for IE */
+ }
+
+.fc-view { /* prevents dragging outside of widget */
+ width: 100%;
+ overflow: hidden;
+ }
+
+
+
+/* Global Event Styles
+------------------------------------------------------------------------*/
+
+.fc-event,
+.fc-agenda .fc-event-time,
+.fc-event a {
+ border-style: solid;
+ border-color: #36c; /* default BORDER color (probably the same as background-color) */
+ background-color: #36c; /* default BACKGROUND color */
+ color: #fff; /* default TEXT color */
+ }
+
+ /* Use the 'className' CalEvent property and the following
+ * example CSS to change event color on a per-event basis:
+ *
+ * .myclass,
+ * .fc-agenda .myclass .fc-event-time,
+ * .myclass a {
+ * background-color: black;
+ * border-color: black;
+ * color: red;
+ * }
+ */
+
+.fc-event {
+ text-align: left;
+ }
+
+.fc-event a {
+ overflow: hidden;
+ font-size: .85em;
+ text-decoration: none;
+ cursor: pointer;
+ }
+
+.fc-event-editable {
+ cursor: pointer;
+ }
+
+.fc-event-time,
+.fc-event-title {
+ padding: 0 1px;
+ }
+
+/* for fake rounded corners */
+
+.fc-event a {
+ display: block;
+ position: relative;
+ width: 100%;
+ height: 100%;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-event a {
+ text-align: right;
+ }
+
+/* resizable */
+
+.fc .ui-resizable-handle {
+ display: block;
+ position: absolute;
+ z-index: 99999;
+ border: 0 !important; /* important overrides pre jquery ui 1.7 styles */
+ background: url(data:image/gif;base64,AAAA) !important; /* hover fix for IE */
+ }
+
+
+
+/* Horizontal Events
+------------------------------------------------------------------------*/
+
+.fc-event-hori {
+ border-width: 1px 0;
+ margin-bottom: 1px;
+ }
+
+.fc-event-hori a {
+ border-width: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-content .fc-corner-left {
+ margin-left: 1px;
+ }
+
+.fc-content .fc-corner-left a {
+ margin-left: -1px;
+ border-left-width: 1px;
+ }
+
+.fc-content .fc-corner-right {
+ margin-right: 1px;
+ }
+
+.fc-content .fc-corner-right a {
+ margin-right: -1px;
+ border-right-width: 1px;
+ }
+
+/* resizable */
+
+.fc-event-hori .ui-resizable-e {
+ top: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ right: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: e-resize;
+ }
+
+.fc-event-hori .ui-resizable-w {
+ top: 0 !important;
+ left: -3px !important;
+ width: 7px !important;
+ height: 100% !important;
+ cursor: w-resize;
+ }
+
+.fc-event-hori .ui-resizable-handle {
+ _padding-bottom: 14px; /* IE6 had 0 height */
+ }
+
+
+
+/* Month View, Basic Week View, Basic Day View
+------------------------------------------------------------------------*/
+
+.fc-grid table {
+ width: 100%;
+ }
+
+.fc .fc-grid th {
+ border-width: 0 0 0 1px;
+ text-align: center;
+ }
+
+.fc .fc-grid td {
+ border-width: 1px 0 0 1px;
+ }
+
+.fc-grid th.fc-leftmost,
+.fc-grid td.fc-leftmost {
+ border-left: 0;
+ }
+
+.fc-grid .fc-day-number {
+ float: right;
+ padding: 0 2px;
+ }
+
+.fc-grid .fc-other-month .fc-day-number {
+ opacity: 0.3;
+ filter: alpha(opacity=30); /* for IE */
+ /* opacity with small font can sometimes look too faded
+ might want to set the 'color' property instead
+ making day-numbers bold also fixes the problem */
+ }
+
+.fc-grid .fc-day-content {
+ clear: both;
+ padding: 2px 2px 0; /* distance between events and day edges */
+ }
+
+/* event styles */
+
+.fc-grid .fc-event-time {
+ font-weight: bold;
+ }
+
+/* right-to-left */
+
+.fc-rtl .fc-grid {
+ direction: rtl;
+ }
+
+.fc-rtl .fc-grid .fc-day-number {
+ float: left;
+ }
+
+.fc-rtl .fc-grid .fc-event-time {
+ float: right;
+ }
+
+/* Agenda Week View, Agenda Day View
+------------------------------------------------------------------------*/
+
+.fc .fc-agenda th,
+.fc .fc-agenda td {
+ border-width: 1px 0 0 1px;
+ }
+
+.fc .fc-agenda .fc-leftmost {
+ border-left: 0;
+ }
+
+.fc-agenda tr.fc-first th,
+.fc-agenda tr.fc-first td {
+ border-top: 0;
+ }
+
+.fc-agenda-head tr.fc-last th {
+ border-bottom-width: 1px;
+ }
+
+.fc .fc-agenda-head td,
+.fc .fc-agenda-body td {
+ background: none;
+ }
+
+.fc-agenda-head th {
+ text-align: center;
+ }
+
+/* the time axis running down the left side */
+
+.fc-agenda .fc-axis {
+ width: 50px;
+ padding: 0 4px;
+ vertical-align: middle;
+ white-space: nowrap;
+ text-align: right;
+ font-weight: normal;
+ }
+
+/* all-day event cells at top */
+
+.fc-agenda-head tr.fc-all-day th {
+ height: 35px;
+ }
+
+.fc-agenda-head td {
+ padding-bottom: 10px;
+ }
+
+.fc .fc-divider div {
+ font-size: 1px; /* for IE6/7 */
+ height: 2px;
+ }
+
+.fc .fc-divider .fc-state-default {
+ background: #eee; /* color for divider between all-day and time-slot events */
+ }
+
+/* body styles */
+
+.fc .fc-agenda-body td div {
+ height: 20px; /* slot height */
+ }
+
+.fc .fc-agenda-body tr.fc-minor th,
+.fc .fc-agenda-body tr.fc-minor td {
+ border-top-style: dotted;
+ }
+
+.fc-agenda .fc-day-content {
+ padding: 2px 2px 0; /* distance between events and day edges */
+ }
+
+
+
+/* Vertical Events
+------------------------------------------------------------------------*/
+
+.fc-event-vert {
+ border-width: 0 1px;
+ }
+
+.fc-event-vert a {
+ border-width: 0;
+ }
+
+/* for fake rounded corners */
+
+.fc-content .fc-corner-top {
+ margin-top: 1px;
+ }
+
+.fc-content .fc-corner-top a {
+ margin-top: -1px;
+ border-top-width: 1px;
+ }
+
+.fc-content .fc-corner-bottom {
+ margin-bottom: 1px;
+ }
+
+.fc-content .fc-corner-bottom a {
+ margin-bottom: -1px;
+ border-bottom-width: 1px;
+ }
+
+/* event content */
+
+.fc-event-vert span {
+ display: block;
+ position: relative;
+ z-index: 2;
+ }
+
+.fc-event-vert span.fc-event-time {
+ white-space: nowrap;
+ _white-space: normal;
+ overflow: hidden;
+ border: 0;
+ font-size: 10px;
+ }
+
+.fc-event-vert span.fc-event-title {
+ line-height: 13px;
+ }
+
+.fc-event-vert span.fc-event-bg { /* makes the event lighter w/ a semi-transparent overlay */
+ position: absolute;
+ z-index: 1;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: #fff;
+ opacity: .3;
+ filter: alpha(opacity=30); /* for IE */
+ }
+
+/* resizable */
+
+.fc-event-vert .ui-resizable-s {
+ bottom: 0 !important; /* importants override pre jquery ui 1.7 styles */
+ width: 100% !important;
+ height: 8px !important;
+ line-height: 8px !important;
+ font-size: 11px !important;
+ font-family: monospace;
+ text-align: center;
+ cursor: s-resize;
+ }
+
+
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/fullcalendar.js b/src/main/resources/org/richfaces/renderkit/html/scripts/fullcalendar.js
new file mode 100644
index 0000000..644f4ad
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/fullcalendar.js
@@ -0,0 +1,3418 @@
+/*!
+ * FullCalendar v1.4.5
+ * http://arshaw.com/fullcalendar/
+ *
+ * Use fullcalendar.css for basic styling.
+ * For event drag & drop, required jQuery UI draggable.
+ * For event resizing, requires jQuery UI resizable.
+ *
+ * Copyright (c) 2009 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Date: Sun Feb 21 20:30:11 2010 -0800
+ *
+ */
+
+(function($) {
+
+
+var fc = $.fullCalendar = {};
+var views = fc.views = {};
+
+
+/* Defaults
+-----------------------------------------------------------------------------*/
+
+var defaults = {
+
+ // display
+ defaultView: 'month',
+ aspectRatio: 1.35,
+ header: {
+ left: 'title',
+ center: '',
+ right: 'today prev,next'
+ },
+ weekends: true,
+
+ // editing
+ //editable: false,
+ //disableDragging: false,
+ //disableResizing: false,
+
+ allDayDefault: true,
+
+ // event ajax
+ lazyFetching: true,
+ startParam: 'start',
+ endParam: 'end',
+
+ // time formats
+ titleFormat: {
+ month: 'MMMM yyyy',
+ week: "MMM d[ yyyy]{ '—'[ MMM] d yyyy}",
+ day: 'dddd, MMM d, yyyy'
+ },
+ columnFormat: {
+ month: 'ddd',
+ week: 'ddd M/d',
+ day: 'dddd M/d'
+ },
+ timeFormat: { // for event elements
+ '': 'h(:mm)t' // default
+ },
+
+ // locale
+ isRTL: false,
+ firstDay: 0,
+ monthNames: ['January','February','March','April','May','June','July','August','September','October','November','December'],
+ monthNamesShort: ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],
+ dayNames: ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
+ dayNamesShort: ['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],
+ buttonText: {
+ prev: ' ◄ ',
+ next: ' ► ',
+ prevYear: ' << ',
+ nextYear: ' >> ',
+ today: 'today',
+ month: 'month',
+ week: 'week',
+ day: 'day'
+ },
+
+ // jquery-ui theming
+ theme: false,
+ buttonIcons: {
+ prev: 'circle-triangle-w',
+ next: 'circle-triangle-e'
+ }
+
+};
+
+// right-to-left defaults
+var rtlDefaults = {
+ header: {
+ left: 'next,prev today',
+ center: '',
+ right: 'title'
+ },
+ buttonText: {
+ prev: ' ► ',
+ next: ' ◄ ',
+ prevYear: ' >> ',
+ nextYear: ' << '
+ },
+ buttonIcons: {
+ prev: 'circle-triangle-e',
+ next: 'circle-triangle-w'
+ }
+};
+
+// function for adding/overriding defaults
+var setDefaults = fc.setDefaults = function(d) {
+ $.extend(true, defaults, d);
+}
+
+
+
+/* .fullCalendar jQuery function
+-----------------------------------------------------------------------------*/
+
+$.fn.fullCalendar = function(options) {
+
+ // method calling
+ if (typeof options == 'string') {
+ var args = Array.prototype.slice.call(arguments, 1),
+ res;
+ this.each(function() {
+ var data = $.data(this, 'fullCalendar');
+ if (data) {
+ var r = data[options].apply(this, args);
+ if (res == undefined) {
+ res = r;
+ }
+ }
+ });
+ if (res != undefined) {
+ return res;
+ }
+ return this;
+ }
+
+ // pluck the 'events' and 'eventSources' options
+ var eventSources = options.eventSources || [];
+ delete options.eventSources;
+ if (options.events) {
+ eventSources.push(options.events);
+ delete options.events;
+ }
+
+ // first event source reserved for 'sticky' events
+ eventSources.unshift([]);
+
+ // initialize options
+ options = $.extend(true, {},
+ defaults,
+ (options.isRTL || options.isRTL==undefined && defaults.isRTL) ? rtlDefaults : {},
+ options
+ );
+ var tm = options.theme ? 'ui' : 'fc'; // for making theme classes
+
+
+ this.each(function() {
+
+
+ /* Instance Initialization
+ -----------------------------------------------------------------------------*/
+
+ // element
+ var _element = this,
+ element = $(_element).addClass('fc'),
+ elementOuterWidth,
+ content = $("
").prependTo(_element),
+ suggestedViewHeight,
+ resizeUID = 0,
+ ignoreWindowResize = 0,
+ date = new Date(),
+ viewName, // the current view name (TODO: look into getting rid of)
+ view, // the current view
+ viewInstances = {},
+ absoluteViewElement;
+
+
+
+ if (options.isRTL) {
+ element.addClass('fc-rtl');
+ }
+ if (options.theme) {
+ element.addClass('ui-widget');
+ }
+
+ if (options.year != undefined && options.year != date.getFullYear()) {
+ date.setDate(1);
+ date.setMonth(0);
+ date.setFullYear(options.year);
+ }
+ if (options.month != undefined && options.month != date.getMonth()) {
+ date.setDate(1);
+ date.setMonth(options.month);
+ }
+ if (options.date != undefined) {
+ date.setDate(options.date);
+ }
+
+
+
+ /* View Rendering
+ -----------------------------------------------------------------------------*/
+
+ function changeView(v) {
+ if (v != viewName) {
+ ignoreWindowResize++; // because setMinHeight might change the height before render (and subsequently setSize) is reached
+
+ var oldView = view,
+ newViewElement;
+
+ if (oldView) {
+ if (oldView.eventsChanged) {
+ eventsDirty();
+ oldView.eventDirty = oldView.eventsChanged = false;
+ }
+ if (oldView.beforeHide) {
+ oldView.beforeHide(); // called before changing min-height. if called after, scroll state is reset (in Opera)
+ }
+ setMinHeight(content, content.height());
+ oldView.element.hide();
+ }else{
+ setMinHeight(content, 1); // needs to be 1 (not 0) for IE7, or else view dimensions miscalculated
+ }
+ content.css('overflow', 'hidden');
+
+ if (viewInstances[v]) {
+ (view = viewInstances[v]).element.show();
+ }else{
+ view = viewInstances[v] = $.fullCalendar.views[v](
+ newViewElement = absoluteViewElement =
+ $("
")
+ .appendTo(content),
+ options
+ );
+ }
+
+ if (header) {
+ // update 'active' view button
+ header.find('div.fc-button-' + viewName).removeClass(tm + '-state-active');
+ header.find('div.fc-button-' + v).addClass(tm + '-state-active');
+ }
+
+ view.name = viewName = v;
+ render(); // after height has been set, will make absoluteViewElement's position=relative, then set to null
+ content.css('overflow', '');
+ if (oldView) {
+ setMinHeight(content, 1);
+ }
+ if (!newViewElement && view.afterShow) {
+ view.afterShow(); // called after setting min-height/overflow, so in final scroll state (for Opera)
+ }
+
+ ignoreWindowResize--;
+ }
+ }
+
+
+ function render(inc) {
+ if (elementVisible()) {
+ ignoreWindowResize++; // because view.renderEvents might temporarily change the height before setSize is reached
+
+ if (suggestedViewHeight == undefined) {
+ calcSize();
+ }
+
+ if (!view.start || inc || date < view.start || date >= view.end) {
+ view.render(date, inc || 0); // responsible for clearing events
+ setSize(true);
+ if (!eventStart || !options.lazyFetching || view.visStart < eventStart || view.visEnd > eventEnd) {
+ fetchAndRenderEvents();
+ }else{
+ view.renderEvents(events); // don't refetch
+ }
+ }
+ else if (view.sizeDirty || view.eventsDirty || !options.lazyFetching) {
+ view.clearEvents();
+ if (view.sizeDirty) {
+ setSize();
+ }
+ if (options.lazyFetching) {
+ view.renderEvents(events); // don't refetch
+ }else{
+ fetchAndRenderEvents();
+ }
+ }
+ elementOuterWidth = element.outerWidth();
+ view.sizeDirty = false;
+ view.eventsDirty = false;
+
+ if (header) {
+ // update title text
+ header.find('h2.fc-header-title').html(view.title);
+ // enable/disable 'today' button
+ var today = new Date();
+ if (today >= view.start && today < view.end) {
+ header.find('div.fc-button-today').addClass(tm + '-state-disabled');
+ }else{
+ header.find('div.fc-button-today').removeClass(tm + '-state-disabled');
+ }
+ }
+
+ ignoreWindowResize--;
+ view.trigger('viewDisplay', _element);
+ }
+ }
+
+
+ function elementVisible() {
+ return _element.offsetWidth !== 0;
+ }
+
+ function bodyVisible() {
+ return $('body')[0].offsetWidth !== 0;
+ }
+
+
+ // called when any event objects have been added/removed/changed, rerenders
+ function eventsChanged() {
+ eventsDirty();
+ if (elementVisible()) {
+ view.clearEvents();
+ view.renderEvents(events);
+ view.eventsDirty = false;
+ }
+ }
+
+ // marks other views' events as dirty
+ function eventsDirty() {
+ $.each(viewInstances, function() {
+ this.eventsDirty = true;
+ });
+ }
+
+ // called when we know the element size has changed
+ function sizeChanged() {
+ sizesDirty();
+ if (elementVisible()) {
+ calcSize();
+ setSize();
+ view.rerenderEvents();
+ view.sizeDirty = false;
+ }
+ }
+
+ // marks other views' sizes as dirty
+ function sizesDirty() {
+ $.each(viewInstances, function() {
+ this.sizeDirty = true;
+ });
+ }
+
+
+
+
+ /* Event Sources and Fetching
+ -----------------------------------------------------------------------------*/
+
+ var events = [],
+ eventStart, eventEnd;
+
+ // Fetch from ALL sources. Clear 'events' array and populate
+ function fetchEvents(callback) {
+ events = [];
+ eventStart = cloneDate(view.visStart);
+ eventEnd = cloneDate(view.visEnd);
+ var queued = eventSources.length,
+ sourceDone = function() {
+ if (--queued == 0) {
+ if (callback) {
+ callback(events);
+ }
+ }
+ }, i=0;
+ for (; i")
+ .append($(" ")
+ .append($("").append(buildSection(sections.left)))
+ .append($("").append(buildSection(sections.center)))
+ .append($("").append(buildSection(sections.right))))
+ .prependTo(element);
+ }
+ function buildSection(buttonStr) {
+ if (buttonStr) {
+ var tr = $(" ");
+ $.each(buttonStr.split(' '), function(i) {
+ if (i > 0) {
+ tr.append(" ");
+ }
+ var prevButton;
+ $.each(this.split(','), function(j, buttonName) {
+ if (buttonName == 'title') {
+ tr.append(" ");
+ if (prevButton) {
+ prevButton.addClass(tm + '-corner-right');
+ }
+ prevButton = null;
+ }else{
+ var buttonClick;
+ if (publicMethods[buttonName]) {
+ buttonClick = publicMethods[buttonName];
+ }
+ else if (views[buttonName]) {
+ buttonClick = function() {
+ button.removeClass(tm + '-state-hover');
+ changeView(buttonName)
+ };
+ }
+ if (buttonClick) {
+ if (prevButton) {
+ prevButton.addClass(tm + '-no-right');
+ }
+ var button,
+ icon = options.theme ? smartProperty(options.buttonIcons, buttonName) : null,
+ text = smartProperty(options.buttonText, buttonName);
+ if (icon) {
+ button = $("");
+ }
+ else if (text) {
+ button = $("");
+ }
+ if (button) {
+ button
+ .click(function() {
+ if (!button.hasClass(tm + '-state-disabled')) {
+ buttonClick();
+ }
+ })
+ .mousedown(function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-down');
+ })
+ .mouseup(function() {
+ button.removeClass(tm + '-state-down');
+ })
+ .hover(
+ function() {
+ button
+ .not('.' + tm + '-state-active')
+ .not('.' + tm + '-state-disabled')
+ .addClass(tm + '-state-hover');
+ },
+ function() {
+ button
+ .removeClass(tm + '-state-hover')
+ .removeClass(tm + '-state-down');
+ }
+ )
+ .appendTo($(" ").appendTo(tr));
+ if (prevButton) {
+ prevButton.addClass(tm + '-no-right');
+ }else{
+ button.addClass(tm + '-corner-left');
+ }
+ prevButton = button;
+ }
+ }
+ }
+ });
+ if (prevButton) {
+ prevButton.addClass(tm + '-corner-right');
+ }
+ });
+ return $("").append(tr);
+ }
+ }
+
+
+
+ /* Resizing
+ -----------------------------------------------------------------------------*/
+
+
+ function calcSize() {
+ if (options.contentHeight) {
+ suggestedViewHeight = options.contentHeight;
+ }
+ else if (options.height) {
+ suggestedViewHeight = options.height - (header ? header.height() : 0) - vsides(content[0]);
+ }
+ else {
+ suggestedViewHeight = Math.round(content.width() / Math.max(options.aspectRatio, .5));
+ }
+ }
+
+
+ function setSize(dateChanged) {
+ ignoreWindowResize++;
+ view.setHeight(suggestedViewHeight, dateChanged);
+ if (absoluteViewElement) {
+ absoluteViewElement.css('position', 'relative');
+ absoluteViewElement = null;
+ }
+ view.setWidth(content.width(), dateChanged);
+ ignoreWindowResize--;
+ }
+
+
+ function windowResize() {
+ if (!ignoreWindowResize) {
+ if (view.start) { // view has already been rendered
+ var uid = ++resizeUID;
+ setTimeout(function() { // add a delay
+ if (uid == resizeUID && !ignoreWindowResize && elementVisible()) {
+ if (elementOuterWidth != (elementOuterWidth = element.outerWidth())) {
+ ignoreWindowResize++; // in case the windowResize callback changes the height
+ sizeChanged();
+ view.trigger('windowResize', _element);
+ ignoreWindowResize--;
+ }
+ }
+ }, 200);
+ }else{
+ // calendar must have been initialized in a 0x0 iframe that has just been resized
+ lateRender();
+ }
+ }
+ };
+ $(window).resize(windowResize);
+
+
+ // let's begin...
+ changeView(options.defaultView);
+
+
+ // needed for IE in a 0x0 iframe, b/c when it is resized, never triggers a windowResize
+ if (!bodyVisible()) {
+ lateRender();
+ }
+
+
+ // called when we know the calendar couldn't be rendered when it was initialized,
+ // but we think it's ready now
+ function lateRender() {
+ setTimeout(function() { // IE7 needs this so dimensions are calculated correctly
+ if (!view.start && bodyVisible()) { // !view.start makes sure this never happens more than once
+ render();
+ }
+ },0);
+ }
+
+
+ });
+
+ return this;
+
+};
+
+
+
+/* Important Event Utilities
+-----------------------------------------------------------------------------*/
+
+var fakeID = 0;
+
+function normalizeEvent(event, options) {
+ event._id = event._id || (event.id == undefined ? '_fc' + fakeID++ : event.id + '');
+ if (event.date) {
+ if (!event.start) {
+ event.start = event.date;
+ }
+ delete event.date;
+ }
+ event._start = cloneDate(event.start = parseDate(event.start));
+ event.end = parseDate(event.end);
+ if (event.end && event.end <= event.start) {
+ event.end = null;
+ }
+ event._end = event.end ? cloneDate(event.end) : null;
+ if (event.allDay == undefined) {
+ event.allDay = options.allDayDefault;
+ }
+ if (event.className) {
+ if (typeof event.className == 'string') {
+ event.className = event.className.split(/\s+/);
+ }
+ }else{
+ event.className = [];
+ }
+}
+// TODO: if there is no title or start date, return false to indicate an invalid event
+
+
+/* Grid-based Views: month, basicWeek, basicDay
+-----------------------------------------------------------------------------*/
+
+setDefaults({
+ weekMode: 'fixed'
+});
+
+views.month = function(element, options) {
+ return new Grid(element, options, {
+ render: function(date, delta) {
+ if (delta) {
+ addMonths(date, delta);
+ date.setDate(1);
+ }
+ // start/end
+ var start = this.start = cloneDate(date, true);
+ start.setDate(1);
+ this.end = addMonths(cloneDate(start), 1);
+ // visStart/visEnd
+ var visStart = this.visStart = cloneDate(start),
+ visEnd = this.visEnd = cloneDate(this.end),
+ nwe = options.weekends ? 0 : 1;
+ if (nwe) {
+ skipWeekend(visStart);
+ skipWeekend(visEnd, -1, true);
+ }
+ addDays(visStart, -((visStart.getDay() - Math.max(options.firstDay, nwe) + 7) % 7));
+ addDays(visEnd, (7 - visEnd.getDay() + Math.max(options.firstDay, nwe)) % 7);
+ // row count
+ var rowCnt = Math.round((visEnd - visStart) / (DAY_MS * 7));
+ if (options.weekMode == 'fixed') {
+ addDays(visEnd, (6 - rowCnt) * 7);
+ rowCnt = 6;
+ }
+ // title
+ this.title = formatDate(
+ start,
+ this.option('titleFormat'),
+ options
+ );
+ // render
+ this.renderGrid(
+ rowCnt, options.weekends ? 7 : 5,
+ this.option('columnFormat'),
+ true
+ );
+ }
+ });
+}
+
+views.basicWeek = function(element, options) {
+ return new Grid(element, options, {
+ render: function(date, delta) {
+ if (delta) {
+ addDays(date, delta * 7);
+ }
+ var visStart = this.visStart = cloneDate(
+ this.start = addDays(cloneDate(date), -((date.getDay() - options.firstDay + 7) % 7))
+ ),
+ visEnd = this.visEnd = cloneDate(
+ this.end = addDays(cloneDate(visStart), 7)
+ );
+ if (!options.weekends) {
+ skipWeekend(visStart);
+ skipWeekend(visEnd, -1, true);
+ }
+ this.title = formatDates(
+ visStart,
+ addDays(cloneDate(visEnd), -1),
+ this.option('titleFormat'),
+ options
+ );
+ this.renderGrid(
+ 1, options.weekends ? 7 : 5,
+ this.option('columnFormat'),
+ false
+ );
+ }
+ });
+};
+
+views.basicDay = function(element, options) {
+ return new Grid(element, options, {
+ render: function(date, delta) {
+ if (delta) {
+ addDays(date, delta);
+ if (!options.weekends) {
+ skipWeekend(date, delta < 0 ? -1 : 1);
+ }
+ }
+ this.title = formatDate(date, this.option('titleFormat'), options);
+ this.start = this.visStart = cloneDate(date, true);
+ this.end = this.visEnd = addDays(cloneDate(this.start), 1);
+ this.renderGrid(
+ 1, 1,
+ this.option('columnFormat'),
+ false
+ );
+ }
+ });
+}
+
+
+// rendering bugs
+
+var tdHeightBug;
+
+
+function Grid(element, options, methods) {
+
+ var tm, firstDay,
+ nwe, // no weekends (int)
+ rtl, dis, dit, // day index sign / translate
+ viewWidth, viewHeight,
+ rowCnt, colCnt,
+ colWidth,
+ thead, tbody,
+ cachedEvents=[],
+ segmentContainer,
+ dayContentPositions = new HorizontalPositionCache(function(dayOfWeek) {
+ return tbody.find('td:eq(' + ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt) + ') div div')
+ }),
+ // ...
+
+ // initialize superclass
+ view = $.extend(this, viewMethods, methods, {
+ renderGrid: renderGrid,
+ renderEvents: renderEvents,
+ rerenderEvents: rerenderEvents,
+ clearEvents: clearEvents,
+ setHeight: setHeight,
+ setWidth: setWidth,
+ defaultEventEnd: function(event) { // calculates an end if event doesnt have one, mostly for resizing
+ return cloneDate(event.start);
+ }
+ });
+ view.init(element, options);
+
+
+
+ /* Grid Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ element.addClass('fc-grid');
+ if (element.disableSelection) {
+ element.disableSelection();
+ }
+
+ function renderGrid(r, c, colFormat, showNumbers) {
+ rowCnt = r;
+ colCnt = c;
+
+ // update option-derived variables
+ tm = options.theme ? 'ui' : 'fc';
+ nwe = options.weekends ? 0 : 1;
+ firstDay = options.firstDay;
+ if (rtl = options.isRTL) {
+ dis = -1;
+ dit = colCnt - 1;
+ }else{
+ dis = 1;
+ dit = 0;
+ }
+
+ var month = view.start.getMonth(),
+ today = clearTime(new Date()),
+ s, i, j, d = cloneDate(view.visStart);
+
+ if (!tbody) { // first time, build all cells from scratch
+
+ var table = $("").appendTo(element);
+
+ s = "";
+ for (i=0; i" + formatDate(d, colFormat, options) + "";
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ }
+ thead = $(s + " ").appendTo(table);
+
+ s = "";
+ d = cloneDate(view.visStart);
+ for (i=0; i";
+ for (j=0; j1 && d.getMonth() != month ? ' fc-other-month' : '') +
+ (+d == +today ?
+ ' fc-today '+tm+'-state-highlight' :
+ ' fc-not-today') + "'>" +
+ (showNumbers ? "" + d.getDate() + "
" : '') +
+ "";
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ }
+ s += "";
+ }
+ tbody = $(s + " ").appendTo(table);
+ tbody.find('td').click(dayClick);
+
+ segmentContainer = $("
").appendTo(element);
+
+ }else{ // NOT first time, reuse as many cells as possible
+
+ clearEvents();
+
+ var prevRowCnt = tbody.find('tr').length;
+ if (rowCnt < prevRowCnt) {
+ tbody.find('tr:gt(' + (rowCnt-1) + ')').remove(); // remove extra rows
+ }
+ else if (rowCnt > prevRowCnt) { // needs to create new rows...
+ s = '';
+ for (i=prevRowCnt; i";
+ for (j=0; j" +
+ (showNumbers ? "
" : '') +
+ "" +
+ "";
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ }
+ s += "";
+ }
+ tbody.append(s);
+ }
+ tbody.find('td.fc-new').removeClass('fc-new').click(dayClick);
+
+ // re-label and re-class existing cells
+ d = cloneDate(view.visStart);
+ tbody.find('td').each(function() {
+ var td = $(this);
+ if (rowCnt > 1) {
+ if (d.getMonth() == month) {
+ td.removeClass('fc-other-month');
+ }else{
+ td.addClass('fc-other-month');
+ }
+ }
+ if (+d == +today) {
+ td.removeClass('fc-not-today')
+ .addClass('fc-today')
+ .addClass(tm + '-state-highlight');
+ }else{
+ td.addClass('fc-not-today')
+ .removeClass('fc-today')
+ .removeClass(tm + '-state-highlight');
+ }
+ td.find('div.fc-day-number').text(d.getDate());
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ });
+
+ if (rowCnt == 1) { // more changes likely (week or day view)
+
+ // redo column header text and class
+ d = cloneDate(view.visStart);
+ thead.find('th').each(function() {
+ $(this).text(formatDate(d, colFormat, options));
+ this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ });
+
+ // redo cell day-of-weeks
+ d = cloneDate(view.visStart);
+ tbody.find('td').each(function() {
+ this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
+ addDays(d, 1);
+ if (nwe) {
+ skipWeekend(d);
+ }
+ });
+
+ }
+
+ }
+
+ };
+
+
+ function dayClick(ev) {
+ var n = parseInt(this.className.match(/fc\-day(\d+)/)[1]),
+ date = addDays(
+ cloneDate(view.visStart),
+ Math.floor(n/colCnt) * 7 + n % colCnt
+ );
+ view.trigger('dayClick', this, date, true, ev);
+ }
+
+
+
+ function setHeight(height) {
+ viewHeight = height;
+ var leftTDs = tbody.find('tr td:first-child'),
+ tbodyHeight = viewHeight - thead.height(),
+ rowHeight1, rowHeight2;
+ if (options.weekMode == 'variable') {
+ rowHeight1 = rowHeight2 = Math.floor(tbodyHeight / (rowCnt==1 ? 2 : 6));
+ }else{
+ rowHeight1 = Math.floor(tbodyHeight / rowCnt);
+ rowHeight2 = tbodyHeight - rowHeight1*(rowCnt-1);
+ }
+ if (tdHeightBug == undefined) {
+ // bug in firefox where cell height includes padding
+ var tr = tbody.find('tr:first'),
+ td = tr.find('td:first');
+ td.height(rowHeight1);
+ tdHeightBug = rowHeight1 != td.height();
+ }
+ if (tdHeightBug) {
+ leftTDs.slice(0, -1).height(rowHeight1);
+ leftTDs.slice(-1).height(rowHeight2);
+ }else{
+ setOuterHeight(leftTDs.slice(0, -1), rowHeight1);
+ setOuterHeight(leftTDs.slice(-1), rowHeight2);
+ }
+ }
+
+
+ function setWidth(width) {
+ viewWidth = width;
+ dayContentPositions.clear();
+ setOuterWidth(
+ thead.find('th').slice(0, -1),
+ colWidth = Math.floor(viewWidth / colCnt)
+ );
+ }
+
+
+
+ /* Event Rendering
+ -----------------------------------------------------------------------------*/
+
+
+ function renderEvents(events) {
+ view.reportEvents(cachedEvents = events);
+ renderSegs(compileSegs(events));
+ }
+
+
+ function rerenderEvents(modifiedEventId) {
+ clearEvents();
+ renderSegs(compileSegs(cachedEvents), modifiedEventId);
+ }
+
+
+ function clearEvents() {
+ view._clearEvents(); // only clears the hashes
+ segmentContainer.empty();
+ }
+
+
+ function compileSegs(events) {
+ var d1 = cloneDate(view.visStart),
+ d2 = addDays(cloneDate(d1), colCnt),
+ visEventsEnds = $.map(events, visEventEnd),
+ i, row,
+ j, level,
+ k, seg,
+ segs=[];
+ for (i=0; i" +
+ "" +
+ (!event.allDay && seg.isStart ?
+ "" +
+ htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'), options)) +
+ " "
+ :'') +
+ "" + htmlEscape(event.title) + " " +
+ " " +
+ ((event.editable || event.editable == undefined && options.editable) && !options.disableResizing && $.fn.resizable ?
+ "
"
+ : '') +
+ "";
+ seg.left = left;
+ seg.outerWidth = right - left;
+ }
+ segmentContainer[0].innerHTML = html; // faster than html()
+ eventElements = segmentContainer.children();
+
+ // retrieve elements, run through eventRender callback, bind handlers
+ for (i=0; i div') // optimal selector?
+ .height(top + levelHeight);
+ }
+
+ // calculate row tops
+ for (rowI=0; rowI" +
+ "" +
+ " ";
+ for (i=0; i" + formatDate(d, colFormat, options) + "";
+ addDays(d, dis);
+ if (nwe) {
+ skipWeekend(d, dis);
+ }
+ }
+ s += " ";
+ if (options.allDaySlot) {
+ s += "" +
+ "" + options.allDayText + " " +
+ "" +
+ " " +
+ " " +
+ "
";
+ }
+ s+= "";
+ head = $(s).appendTo(element);
+ head.find('td').click(slotClick);
+
+ // all-day event container
+ daySegmentContainer = $("
").appendTo(head);
+
+ // body
+ d = zeroDate();
+ var maxd = addMinutes(cloneDate(d), maxMinute);
+ addMinutes(d, minMinute);
+ s = "";
+ for (i=0; d < maxd; i++) {
+ minutes = d.getMinutes();
+ s += "" +
+ ((!slotNormal || minutes==0) ? formatDate(d, options.axisFormat) : ' ') +
+ "
";
+ addMinutes(d, options.slotMinutes);
+ }
+ s += "
";
+ body = $("
")
+ .append(bodyContent = $("
")
+ .append(bodyTable = $(s)))
+ .appendTo(element);
+ body.find('td').click(slotClick);
+
+ // slot event container
+ slotSegmentContainer = $("
").appendTo(bodyContent);
+
+ // background stripes
+ d = cloneDate(d0);
+ s = "" +
+ "
";
+ for (i=0; i";
+ addDays(d, dis);
+ if (nwe) {
+ skipWeekend(d, dis);
+ }
+ }
+ s += "
";
+ bg = $(s).appendTo(element);
+
+ }else{ // skeleton already built, just modify it
+
+ clearEvents();
+
+ // redo column header text and class
+ head.find('tr:first th').slice(1, -1).each(function() {
+ $(this).text(formatDate(d, colFormat, options));
+ this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
+ addDays(d, dis);
+ if (nwe) {
+ skipWeekend(d, dis);
+ }
+ });
+
+ // change classes of background stripes
+ d = cloneDate(d0);
+ bg.find('td').each(function() {
+ this.className = this.className.replace(/^fc-\w+(?= )/, 'fc-' + dayIDs[d.getDay()]);
+ if (+d == +today) {
+ $(this)
+ .removeClass('fc-not-today')
+ .addClass('fc-today')
+ .addClass(tm + '-state-highlight');
+ }else{
+ $(this)
+ .addClass('fc-not-today')
+ .removeClass('fc-today')
+ .removeClass(tm + '-state-highlight');
+ }
+ addDays(d, dis);
+ if (nwe) {
+ skipWeekend(d, dis);
+ }
+ });
+
+ }
+
+ };
+
+
+ function resetScroll() {
+ var d0 = zeroDate(),
+ scrollDate = cloneDate(d0);
+ scrollDate.setHours(options.firstHour);
+ var top = timePosition(d0, scrollDate) + 1, // +1 for the border
+ scroll = function() {
+ body.scrollTop(top);
+ };
+ scroll();
+ setTimeout(scroll, 0); // overrides any previous scroll state made by the browser
+ }
+
+
+ function setHeight(height, dateChanged) {
+ viewHeight = height;
+ slotTopCache = {};
+
+ body.height(height - head.height());
+
+ slotHeight = body.find('tr:first div').height() + 1;
+
+ bg.css({
+ top: head.find('tr').height(),
+ height: height
+ });
+
+ if (dateChanged) {
+ resetScroll();
+ }
+ }
+
+
+ function setWidth(width) {
+ viewWidth = width;
+ colContentPositions.clear();
+
+ body.width(width);
+ bodyTable.width('');
+
+ var topTDs = head.find('tr:first th'),
+ stripeTDs = bg.find('td'),
+ clientWidth = body[0].clientWidth;
+
+ bodyTable.width(clientWidth);
+
+ // time-axis width
+ axisWidth = 0;
+ setOuterWidth(
+ head.find('tr:lt(2) th:first').add(body.find('tr:first th'))
+ .width('')
+ .each(function() {
+ axisWidth = Math.max(axisWidth, $(this).outerWidth());
+ }),
+ axisWidth
+ );
+
+ // column width
+ colWidth = Math.floor((clientWidth - axisWidth) / colCnt);
+ setOuterWidth(stripeTDs.slice(0, -1), colWidth);
+ setOuterWidth(topTDs.slice(1, -2), colWidth);
+ setOuterWidth(topTDs.slice(-2, -1), clientWidth - axisWidth - colWidth*(colCnt-1));
+
+ bg.css({
+ left: axisWidth,
+ width: clientWidth - axisWidth
+ });
+ }
+
+
+
+
+ function slotClick(ev) {
+ var col = Math.floor((ev.pageX - bg.offset().left) / colWidth),
+ date = addDays(cloneDate(view.visStart), dit + dis*col),
+ rowMatch = this.className.match(/fc-slot(\d+)/);
+ if (rowMatch) {
+ var mins = parseInt(rowMatch[1]) * options.slotMinutes,
+ hours = Math.floor(mins/60);
+ date.setHours(hours);
+ date.setMinutes(mins%60 + minMinute);
+ view.trigger('dayClick', this, date, false, ev);
+ }else{
+ view.trigger('dayClick', this, date, true, ev);
+ }
+ }
+
+
+
+ /* Event Rendering
+ -----------------------------------------------------------------------------*/
+
+ function renderEvents(events, modifiedEventId) {
+ view.reportEvents(cachedEvents = events);
+ var i, len=events.length,
+ dayEvents=[],
+ slotEvents=[];
+ for (i=0; i" +
+ "" +
+ " " +
+ "" + htmlEscape(formatDates(event.start, event.end, view.option('timeFormat'))) + " " +
+ "" + htmlEscape(event.title) + " " +
+ " " +
+ ((event.editable || event.editable == undefined && options.editable) && !options.disableResizing && $.fn.resizable ?
+ "=
"
+ : '') +
+ "";
+ }
+ slotSegmentContainer[0].innerHTML = html; // faster than html()
+ eventElements = slotSegmentContainer.children();
+
+ // retrieve elements, run through eventRender callback, bind event handlers
+ for (i=0; i= addMinutes(cloneDate(day), maxMinute)) {
+ return bodyContent.height();
+ }
+ var slotMinutes = options.slotMinutes,
+ minutes = time.getHours()*60 + time.getMinutes() - minMinute,
+ slotI = Math.floor(minutes / slotMinutes),
+ slotTop = slotTopCache[slotI];
+ if (slotTop == undefined) {
+ slotTop = slotTopCache[slotI] = body.find('tr:eq(' + slotI + ') td div')[0].offsetTop;
+ }
+ return Math.max(0, Math.round(
+ slotTop - 1 + slotHeight * ((minutes % slotMinutes) / slotMinutes)
+ ));
+ }
+
+
+
+
+ function day2col(dayOfWeek) {
+ return ((dayOfWeek - Math.max(firstDay,nwe)+colCnt) % colCnt)*dis+dit;
+ }
+
+
+}
+
+
+// count the number of colliding, higher-level segments (for event squishing)
+
+function countForwardSegs(levels) {
+ var i, j, k, level, segForward, segBack;
+ for (i=levels.length-1; i>0; i--) {
+ level = levels[i];
+ for (j=0; j ")
+ .appendTo(this.element);
+ }
+ var o = this.element.offset();
+ this.dayOverlay
+ .css({
+ top: props.top - o.top,
+ left: props.left - o.left,
+ width: props.width,
+ height: props.height
+ })
+ .show();
+ },
+
+ hideOverlay: function() {
+ if (this.dayOverlay) {
+ this.dayOverlay.hide();
+ }
+ },
+
+
+
+ // common horizontal event resizing
+
+ resizableDayEvent: function(event, eventElement, colWidth) {
+ var view = this;
+ if (!view.options.disableResizing && eventElement.resizable) {
+ eventElement.resizable({
+ handles: view.options.isRTL ? {w:'div.ui-resizable-w'} : {e:'div.ui-resizable-e'},
+ grid: colWidth,
+ minWidth: colWidth/2, // need this or else IE throws errors when too small
+ containment: view.element.parent().parent(), // the main element...
+ // ... a fix. wouldn't allow extending to last column in agenda views (jq ui bug?)
+ start: function(ev, ui) {
+ eventElement.css('z-index', 9);
+ view.hideEvents(event, eventElement);
+ view.trigger('eventResizeStart', this, event, ev, ui);
+ },
+ stop: function(ev, ui) {
+ view.trigger('eventResizeStop', this, event, ev, ui);
+ // ui.size.width wasn't working with grid correctly, use .width()
+ var dayDelta = Math.round((eventElement.width() - ui.originalSize.width) / colWidth);
+ if (dayDelta) {
+ view.eventResize(this, event, dayDelta, 0, ev, ui);
+ }else{
+ eventElement.css('z-index', 8);
+ view.showEvents(event, eventElement);
+ }
+ }
+ });
+ }
+ },
+
+
+
+ // attaches eventClick, eventMouseover, eventMouseout
+
+ eventElementHandlers: function(event, eventElement) {
+ var view = this;
+ eventElement
+ .click(function(ev) {
+ if (!eventElement.hasClass('ui-draggable-dragging') &&
+ !eventElement.hasClass('ui-resizable-resizing')) {
+ return view.trigger('eventClick', this, event, ev);
+ }
+ })
+ .hover(
+ function(ev) {
+ view.trigger('eventMouseover', this, event, ev);
+ },
+ function(ev) {
+ view.trigger('eventMouseout', this, event, ev);
+ }
+ );
+ },
+
+
+
+ // get a property from the 'options' object, using smart view naming
+
+ option: function(name, viewName) {
+ var v = this.options[name];
+ if (typeof v == 'object') {
+ return smartProperty(v, viewName || this.name);
+ }
+ return v;
+ },
+
+
+
+ // event rendering utilities
+
+ sliceSegs: function(events, visEventEnds, start, end) {
+ var segs = [],
+ i, len=events.length, event,
+ eventStart, eventEnd,
+ segStart, segEnd,
+ isStart, isEnd;
+ for (i=0; i start && eventStart < end) {
+ if (eventStart < start) {
+ segStart = cloneDate(start);
+ isStart = false;
+ }else{
+ segStart = eventStart;
+ isStart = true;
+ }
+ if (eventEnd > end) {
+ segEnd = cloneDate(end);
+ isEnd = false;
+ }else{
+ segEnd = eventEnd;
+ isEnd = true;
+ }
+ segs.push({
+ event: event,
+ start: segStart,
+ end: segEnd,
+ isStart: isStart,
+ isEnd: isEnd,
+ msLength: segEnd - segStart
+ });
+ }
+ }
+ return segs.sort(segCmp);
+ }
+
+
+};
+
+
+
+function lazySegBind(container, segs, bindHandlers) {
+ container.unbind('mouseover').mouseover(function(ev) {
+ var parent=ev.target, e,
+ i, seg;
+ while (parent != this) {
+ e = parent;
+ parent = parent.parentNode;
+ }
+ if ((i = e._fci) != undefined) {
+ e._fci = undefined;
+ seg = segs[i];
+ bindHandlers(seg.event, seg.element, seg);
+ $(ev.target).trigger(ev);
+ }
+ ev.stopPropagation();
+ });
+}
+
+
+
+// event rendering calculation utilities
+
+function stackSegs(segs) {
+ var levels = [],
+ i, len = segs.length, seg,
+ j, collide, k;
+ for (i=0; i seg2.start && seg1.start < seg2.end;
+}
+
+
+
+
+/* Date Math
+-----------------------------------------------------------------------------*/
+
+var DAY_MS = 86400000,
+ HOUR_MS = 3600000,
+ MINUTE_MS = 60000;
+
+function addYears(d, n, keepTime) {
+ d.setFullYear(d.getFullYear() + n);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ return d;
+}
+
+function addMonths(d, n, keepTime) { // prevents day overflow/underflow
+ if (+d) { // prevent infinite looping on invalid dates
+ var m = d.getMonth() + n,
+ check = cloneDate(d);
+ check.setDate(1);
+ check.setMonth(m);
+ d.setMonth(m);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ while (d.getMonth() != check.getMonth()) {
+ d.setDate(d.getDate() + (d < check ? 1 : -1));
+ }
+ }
+ return d;
+}
+
+function addDays(d, n, keepTime) { // deals with daylight savings
+ if (+d) {
+ var dd = d.getDate() + n,
+ check = cloneDate(d);
+ check.setHours(9); // set to middle of day
+ check.setDate(dd);
+ d.setDate(dd);
+ if (!keepTime) {
+ clearTime(d);
+ }
+ fixDate(d, check);
+ }
+ return d;
+}
+fc.addDays = addDays;
+
+function fixDate(d, check) { // force d to be on check's YMD, for daylight savings purposes
+ if (+d) { // prevent infinite looping on invalid dates
+ while (d.getDate() != check.getDate()) {
+ d.setTime(+d + (d < check ? 1 : -1) * HOUR_MS);
+ }
+ }
+}
+
+function addMinutes(d, n) {
+ d.setMinutes(d.getMinutes() + n);
+ return d;
+}
+
+function clearTime(d) {
+ d.setHours(0);
+ d.setMinutes(0);
+ d.setSeconds(0);
+ d.setMilliseconds(0);
+ return d;
+}
+
+function cloneDate(d, dontKeepTime) {
+ if (dontKeepTime) {
+ return clearTime(new Date(+d));
+ }
+ return new Date(+d);
+}
+
+function zeroDate() { // returns a Date with time 00:00:00 and dateOfMonth=1
+ var i=0, d;
+ do {
+ d = new Date(1970, i++, 1);
+ } while (d.getHours() != 0);
+ return d;
+}
+
+function skipWeekend(date, inc, excl) {
+ inc = inc || 1;
+ while (date.getDay()==0 || (excl && date.getDay()==1 || !excl && date.getDay()==6)) {
+ addDays(date, inc);
+ }
+ return date;
+}
+
+
+
+/* Date Parsing
+-----------------------------------------------------------------------------*/
+
+var parseDate = fc.parseDate = function(s) {
+ if (typeof s == 'object') { // already a Date object
+ return s;
+ }
+ if (typeof s == 'number') { // a UNIX timestamp
+ return new Date(s * 1000);
+ }
+ if (typeof s == 'string') {
+ if (s.match(/^\d+$/)) { // a UNIX timestamp
+ return new Date(parseInt(s) * 1000);
+ }
+ return parseISO8601(s, true) || (s ? new Date(s) : null);
+ }
+ // TODO: never return invalid dates (like from new Date()), return null instead
+ return null;
+}
+
+var parseISO8601 = fc.parseISO8601 = function(s, ignoreTimezone) {
+ // derived from http://delete.me.uk/2005/03/iso8601.html
+ // TODO: for a know glitch/feature, read tests/issue_206_parseDate_dst.html
+ var m = s.match(/^([0-9]{4})(-([0-9]{2})(-([0-9]{2})([T ]([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?$/);
+ if (!m) {
+ return null;
+ }
+ var date = new Date(m[1], 0, 1),
+ check = new Date(m[1], 0, 1, 9, 0),
+ offset = 0;
+ if (m[3]) {
+ date.setMonth(m[3] - 1);
+ check.setMonth(m[3] - 1);
+ }
+ if (m[5]) {
+ date.setDate(m[5]);
+ check.setDate(m[5]);
+ }
+ fixDate(date, check);
+ if (m[7]) {
+ date.setHours(m[7]);
+ }
+ if (m[8]) {
+ date.setMinutes(m[8]);
+ }
+ if (m[10]) {
+ date.setSeconds(m[10]);
+ }
+ if (m[12]) {
+ date.setMilliseconds(Number("0." + m[12]) * 1000);
+ }
+ fixDate(date, check);
+ if (!ignoreTimezone) {
+ if (m[14]) {
+ offset = Number(m[16]) * 60 + Number(m[17]);
+ offset *= m[15] == '-' ? 1 : -1;
+ }
+ offset -= date.getTimezoneOffset();
+ }
+ return new Date(+date + (offset * 60 * 1000));
+}
+
+var parseTime = fc.parseTime = function(s) { // returns minutes since start of day
+ if (typeof s == 'number') { // an hour
+ return s * 60;
+ }
+ if (typeof s == 'object') { // a Date object
+ return s.getHours() * 60 + s.getMinutes();
+ }
+ var m = s.match(/(\d+)(?::(\d+))?\s*(\w+)?/);
+ if (m) {
+ var h = parseInt(m[1]);
+ if (m[3]) {
+ h %= 12;
+ if (m[3].toLowerCase().charAt(0) == 'p') {
+ h += 12;
+ }
+ }
+ return h * 60 + (m[2] ? parseInt(m[2]) : 0);
+ }
+};
+
+
+
+/* Date Formatting
+-----------------------------------------------------------------------------*/
+
+var formatDate = fc.formatDate = function(date, format, options) {
+ return formatDates(date, null, format, options);
+}
+
+var formatDates = fc.formatDates = function(date1, date2, format, options) {
+ options = options || defaults;
+ var date = date1,
+ otherDate = date2,
+ i, len = format.length, c,
+ i2, formatter,
+ res = '';
+ for (i=0; ii; i2--) {
+ if (formatter = dateFormatters[format.substring(i, i2)]) {
+ if (date) {
+ res += formatter(date, options);
+ }
+ i = i2 - 1;
+ break;
+ }
+ }
+ if (i2 == i) {
+ if (date) {
+ res += c;
+ }
+ }
+ }
+ }
+ return res;
+}
+
+var dateFormatters = {
+ s : function(d) { return d.getSeconds() },
+ ss : function(d) { return zeroPad(d.getSeconds()) },
+ m : function(d) { return d.getMinutes() },
+ mm : function(d) { return zeroPad(d.getMinutes()) },
+ h : function(d) { return d.getHours() % 12 || 12 },
+ hh : function(d) { return zeroPad(d.getHours() % 12 || 12) },
+ H : function(d) { return d.getHours() },
+ HH : function(d) { return zeroPad(d.getHours()) },
+ d : function(d) { return d.getDate() },
+ dd : function(d) { return zeroPad(d.getDate()) },
+ ddd : function(d,o) { return o.dayNamesShort[d.getDay()] },
+ dddd: function(d,o) { return o.dayNames[d.getDay()] },
+ M : function(d) { return d.getMonth() + 1 },
+ MM : function(d) { return zeroPad(d.getMonth() + 1) },
+ MMM : function(d,o) { return o.monthNamesShort[d.getMonth()] },
+ MMMM: function(d,o) { return o.monthNames[d.getMonth()] },
+ yy : function(d) { return (d.getFullYear()+'').substring(2) },
+ yyyy: function(d) { return d.getFullYear() },
+ t : function(d) { return d.getHours() < 12 ? 'a' : 'p' },
+ tt : function(d) { return d.getHours() < 12 ? 'am' : 'pm' },
+ T : function(d) { return d.getHours() < 12 ? 'A' : 'P' },
+ TT : function(d) { return d.getHours() < 12 ? 'AM' : 'PM' },
+ u : function(d) { return formatDate(d, "yyyy-MM-dd'T'HH:mm:ss'Z'") },
+ S : function(d) {
+ var date = d.getDate();
+ if (date > 10 && date < 20) return 'th';
+ return ['st', 'nd', 'rd'][date%10-1] || 'th';
+ }
+};
+
+
+
+/* Element Dimensions
+-----------------------------------------------------------------------------*/
+
+function setOuterWidth(element, width, includeMargins) {
+ element.each(function(i, _element) {
+ _element.style.width = width - hsides(_element, includeMargins) + 'px';
+ });
+}
+
+function setOuterHeight(element, height, includeMargins) {
+ element.each(function(i, _element) {
+ _element.style.height = height - vsides(_element, includeMargins) + 'px';
+ });
+}
+
+
+function hsides(_element, includeMargins) {
+ return (parseFloat(jQuery.curCSS(_element, 'paddingLeft', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'paddingRight', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'borderLeftWidth', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'borderRightWidth', true)) || 0) +
+ (includeMargins ? hmargins(_element) : 0);
+}
+
+function hmargins(_element) {
+ return (parseFloat(jQuery.curCSS(_element, 'marginLeft', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'marginRight', true)) || 0);
+}
+
+function vsides(_element, includeMargins) {
+ return (parseFloat(jQuery.curCSS(_element, 'paddingTop', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'paddingBottom', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'borderTopWidth', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'borderBottomWidth', true)) || 0) +
+ (includeMargins ? vmargins(_element) : 0);
+}
+
+function vmargins(_element) {
+ return (parseFloat(jQuery.curCSS(_element, 'marginTop', true)) || 0) +
+ (parseFloat(jQuery.curCSS(_element, 'marginBottom', true)) || 0);
+}
+
+
+
+
+function setMinHeight(element, h) {
+ h = typeof h == 'number' ? h + 'px' : h;
+ element[0].style.cssText += ';min-height:' + h + ';_height:' + h;
+}
+
+
+
+/* Position Calculation
+-----------------------------------------------------------------------------*/
+// nasty bugs in opera 9.25
+// position()'s top returning incorrectly with TR/TD or elements within TD
+
+var topBug;
+
+function topCorrect(tr) { // tr/th/td or anything else
+ if (topBug !== false) {
+ var cell;
+ if (tr.is('th,td')) {
+ tr = (cell = tr).parent();
+ }
+ if (topBug == undefined && tr.is('tr')) {
+ topBug = tr.position().top != tr.children().position().top;
+ }
+ if (topBug) {
+ return tr.parent().position().top + (cell ? tr.position().top - cell.position().top : 0);
+ }
+ }
+ return 0;
+}
+
+
+
+/* Hover Matrix
+-----------------------------------------------------------------------------*/
+
+function HoverMatrix(changeCallback) {
+
+ var t=this,
+ tops=[], lefts=[],
+ prevRowE, prevColE,
+ origRow, origCol,
+ currRow, currCol;
+
+ t.row = function(e) {
+ prevRowE = $(e);
+ tops.push(prevRowE.offset().top + topCorrect(prevRowE));
+ };
+
+ t.col = function(e) {
+ prevColE = $(e);
+ lefts.push(prevColE.offset().left);
+ };
+
+ t.mouse = function(x, y) {
+ if (origRow == undefined) {
+ tops.push(tops[tops.length-1] + prevRowE.outerHeight());
+ lefts.push(lefts[lefts.length-1] + prevColE.outerWidth());
+ currRow = currCol = -1;
+ }
+ var r, c;
+ for (r=0; r=tops[r]; r++) ;
+ for (c=0; c=lefts[c]; c++) ;
+ r = r >= tops.length ? -1 : r - 1;
+ c = c >= lefts.length ? -1 : c - 1;
+ if (r != currRow || c != currCol) {
+ currRow = r;
+ currCol = c;
+ if (r == -1 || c == -1) {
+ t.cell = null;
+ }else{
+ if (origRow == undefined) {
+ origRow = r;
+ origCol = c;
+ }
+ t.cell = {
+ row: r,
+ col: c,
+ top: tops[r],
+ left: lefts[c],
+ width: lefts[c+1] - lefts[c],
+ height: tops[r+1] - tops[r],
+ isOrig: r==origRow && c==origCol,
+ rowDelta: r-origRow,
+ colDelta: c-origCol
+ };
+ }
+ changeCallback(t.cell);
+ }
+ };
+
+}
+
+
+
+/* Misc Utils
+-----------------------------------------------------------------------------*/
+
+var undefined,
+ dayIDs = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'],
+ arrayPop = Array.prototype.pop;
+
+function zeroPad(n) {
+ return (n < 10 ? '0' : '') + n;
+}
+
+function smartProperty(obj, name) { // get a camel-cased/namespaced property of an object
+ if (obj[name] != undefined) {
+ return obj[name];
+ }
+ var parts = name.split(/(?=[A-Z])/),
+ i=parts.length-1, res;
+ for (; i>=0; i--) {
+ res = obj[parts[i].toLowerCase()];
+ if (res != undefined) {
+ return res;
+ }
+ }
+ return obj[''];
+}
+
+function htmlEscape(s) {
+ return s
+ .replace(/&/g, '&')
+ .replace(//g, '>')
+ .replace(/'/g, ''')
+ .replace(/"/g, '"')
+}
+
+
+
+function HorizontalPositionCache(getElement) {
+
+ var t = this,
+ elements = {},
+ lefts = {},
+ rights = {};
+
+ function e(i) {
+ return elements[i] =
+ elements[i] || getElement(i);
+ }
+
+ t.left = function(i) {
+ return lefts[i] =
+ lefts[i] == undefined ? e(i).position().left : lefts[i];
+ };
+
+ t.right = function(i) {
+ return rights[i] =
+ rights[i] == undefined ? t.left(i) + e(i).width() : rights[i];
+ };
+
+ t.clear = function() {
+ elements = {};
+ lefts = {};
+ rights = {};
+ };
+
+}
+
+
+
+function cssKey(_element) {
+ return _element.id + '/' + _element.className + '/' + _element.style.cssText.replace(/(^|;)\s*(top|left|width|height)\s*:[^;]*/ig, '');
+}
+
+
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/gcal.js b/src/main/resources/org/richfaces/renderkit/html/scripts/gcal.js
new file mode 100644
index 0000000..773d326
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/gcal.js
@@ -0,0 +1,71 @@
+/*
+ * FullCalendar v1.4.5 Google Calendar Extension
+ *
+ * Copyright (c) 2009 Adam Shaw
+ * Dual licensed under the MIT and GPL licenses:
+ * http://www.opensource.org/licenses/mit-license.php
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Date: Sun Feb 21 20:30:11 2010 -0800
+ *
+ */
+
+(function($) {
+
+ $.fullCalendar.gcalFeed = function(feedUrl, options) {
+
+ feedUrl = feedUrl.replace(/\/basic$/, '/full');
+ options = options || {};
+
+ return function(start, end, callback) {
+ var params = {
+ 'start-min': $.fullCalendar.formatDate(start, 'u'),
+ 'start-max': $.fullCalendar.formatDate(end, 'u'),
+ 'singleevents': true,
+ 'max-results': 9999
+ };
+ var ctz = options.currentTimezone;
+ if (ctz) {
+ params.ctz = ctz = ctz.replace(' ', '_');
+ }
+ $.getJSON(feedUrl + "?alt=json-in-script&callback=?", params, function(data) {
+ var events = [];
+ if (data.feed.entry) {
+ $.each(data.feed.entry, function(i, entry) {
+ var startStr = entry['gd$when'][0]['startTime'],
+ start = $.fullCalendar.parseISO8601(startStr, true),
+ end = $.fullCalendar.parseISO8601(entry['gd$when'][0]['endTime'], true),
+ allDay = startStr.indexOf('T') == -1,
+ url;
+ $.each(entry.link, function() {
+ if (this.type == 'text/html') {
+ url = this.href;
+ if (ctz) {
+ url += (url.indexOf('?') == -1 ? '?' : '&') + 'ctz=' + ctz;
+ }
+ }
+ });
+ if (allDay) {
+ $.fullCalendar.addDays(end, -1); // make inclusive
+ }
+ events.push({
+ id: entry['gCal$uid']['value'],
+ title: entry['title']['$t'],
+ url: url,
+ start: start,
+ end: end,
+ allDay: allDay,
+ location: entry['gd$where'][0]['valueString'],
+ description: entry['content']['$t'],
+ className: options.className,
+ editable: options.editable || false
+ });
+ });
+ }
+ callback(events);
+ });
+ }
+
+ }
+
+})(jQuery);
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/richfaces.schedule.js b/src/main/resources/org/richfaces/renderkit/html/scripts/richfaces.schedule.js
new file mode 100644
index 0000000..c08b637
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/richfaces.schedule.js
@@ -0,0 +1,212 @@
+window.RichFaces = window.RichFaces || {};
+window.RichFaces.Schedule = (function() {
+ var formatDateParam = function(date) {
+ return Math.round(date.getTime() / 1000);
+ };
+
+ return function(id, locale, options, loadItemsEventName, itemSelectedEventName, itemMovedEventName, itemResizedEventName, viewChangedEventName, daySelectedEventName, submitEventFunction) {
+ this.id = id;
+ /**
+ * submitEventFunction should have following params:
+ * event,view,eventType,itemId,startDate,endDate,dayDelta,minuteDelta,allDay,callback
+ */
+ this.submitEventFunction = submitEventFunction;
+ options = jQuery.extend(options, this.messages[locale]);
+ var elt = document.getElementById(id);
+ if (!elt) {
+ throw "No element with id '" + id + "' found.";
+ }
+ var _this = this;
+ var isSameDay = function(a, b) {
+ if (!a instanceof Date || !b instanceof Date) {
+ throw "Both params must be Date objects";
+ }
+ return a.getYear() == b.getYear()
+ && a.getMonth() == b.getMonth()
+ && a.getDate() == b.getDate();
+ };
+ var fillCalendarFunction = function(startDate, endDate, callback) {
+ if (options.initialItems != null) {
+ var startDateData = options.initialItems.startDate;
+ var endDateData = options.initialItems.endDate;
+ var initialStartDate = new Date(startDateData.year, startDateData.month, startDateData.date);
+ var initialEndDate = new Date(endDateData.year, endDateData.month, endDateData.date);
+ if (isSameDay(startDate, initialStartDate) && isSameDay(endDate, initialEndDate)) {
+ callback(options.initialItems.items);
+ /**
+ * After initial load this should be cleaned so items are not cached.
+ */
+ options.initialItems = null;
+ return;
+ }
+ }
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({} /* stub event */,
+ null,
+ loadItemsEventName,
+ null,
+ formatDateParam(startDate),
+ formatDateParam(endDate),
+ null, null, null,
+ function(request, event, data) {
+ var scheduleData = request.getJSON('_ajax:scheduleData')
+ if (scheduleData != undefined) {
+ callback(scheduleData);
+ }
+ }
+ );
+ }
+ };
+ var itemDragStart = function(item, event) {
+ if (options.onItemDragStart != null) {
+ eval("(function(){" + options.onItemDragStart + "})()");
+ }
+ };
+ var itemDragStop = function(item, event) {
+ if (options.onItemDragStop != null) {
+ eval("(function(){" + options.onItemDragStop + "})()");
+ }
+ };
+ var itemDrop = function(item, dayDelta, minuteDelta, allDay, revertFunc, event) {
+ if (options.onItemDrop != null) {
+ var result = eval("(function(){" + options.onItemDrop + "})()");
+ if (result != null) {
+ if (result === false) {
+ revertFunc();
+ }
+ return;
+ }
+ }
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({} /* stub event */,
+ null,
+ itemMovedEventName,
+ item.id,
+ null,
+ null,
+ dayDelta, minuteDelta, allDay,
+ function(request, event, data) {
+ if (data != undefined && data !== true) {
+ revertFunc();
+ }
+ }
+ );
+ }
+ };
+ var itemResized = function(item, dayDelta, minuteDelta, revertFunc, event) {
+ if (options.onItemResized != null) {
+ var result = eval("(function(){" + options.onItemResized + "})()");
+ if (result != null) {
+ if (result === false) {
+ revertFunc();
+ }
+ return;
+ }
+ }
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({} /* stub event */,
+ null,
+ itemResizedEventName,
+ item.id,
+ null,
+ null,
+ dayDelta, minuteDelta, null,
+ function(request, event, data) {
+ if (data != undefined && data !== true) {
+ revertFunc();
+ }
+ }
+ );
+ }
+ };
+ var itemResizeStart = function(item, event) {
+ if (options.onItemResizeStart != null) {
+ eval("(function(){" + options.onItemResizeStart + "})()");
+ }
+ };
+ var itemResizeStop = function(item, event) {
+ if (options.onItemResizeStop != null) {
+ eval("(function(){" + options.onItemResizeStop + "})()");
+ }
+ };
+ var itemMouseover = function(item) {
+ if (options.onItemMouseover != null) {
+ eval("(function(){" + options.onItemMouseover + "})()");
+ }
+ };
+ var itemMouseout = function(item) {
+ if (options.onItemMouseout != null) {
+ eval("(function(){" + options.onItemMouseout + "})()");
+ }
+ };
+ var itemClick = function(item, event) {
+ if (options.onItemSelected != null) {
+ var result = eval("(function(){" + options.onItemSelected + "})()");
+ if (result != null) {
+ return;
+ }
+ }
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({},
+ null,
+ itemSelectedEventName,
+ item.id,
+ null, null, null, null, null, null
+ );
+ }
+ };
+ var dayClick = function(date, allDay, event) {
+ if (options.onDateSelected != null) {
+ var result = eval("(function(){" + options.onDateSelected + "})()");
+ if (result != null) {
+ throw "return not allowed in onDaySelect";
+ }
+ }
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({},
+ null,
+ daySelectedEventName,
+ null, formatDateParam(date), null, null, null, allDay, null
+ );
+ }
+ };
+ var selectedView;
+ //TODO how to hide all (except for view param) scopeChain from code in options.onViewDisplay?
+ var viewDisplay = function(view) {
+ if (options.onViewDisplay != null) {
+ var result = eval("(function(){" + options.onViewDisplay + "})()");
+ if (result != null) {
+ throw "return not allowed in onViewDisplay";
+ }
+ }
+ if (selectedView != view && selectedView != undefined) {
+ if (_this.submitEventFunction != null) {
+ _this.submitEventFunction({},
+ view.name,
+ viewChangedEventName,
+ null, null, null, null, null, null, null
+ );
+ }
+ }
+ selectedView = view;
+ };
+ options = jQuery.extend({
+ events: fillCalendarFunction,
+ eventDragStart: itemDragStart,
+ eventDragStop: itemDragStop,
+ eventDrop: itemDrop,
+ eventResizeStart: itemResizeStart,
+ eventResizeStop: itemResizeStop,
+ eventResize: itemResized,
+ eventClick: itemClick,
+ eventMouseover: itemMouseover,
+ eventMouseout: itemMouseout,
+ viewDisplay: viewDisplay,
+ dayClick: dayClick
+ }, options);
+ jQuery(document).ready(function() {
+ jQuery(elt).fullCalendar(options);
+ });
+ };
+
+}());
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/ui.core.js b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.core.js
new file mode 100644
index 0000000..5493e0a
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.core.js
@@ -0,0 +1,519 @@
+/*
+ * jQuery UI 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI
+ */
+;jQuery.ui || (function($) {
+
+var _remove = $.fn.remove,
+ isFF2 = $.browser.mozilla && (parseFloat($.browser.version) < 1.9);
+
+//Helper functions and ui object
+$.ui = {
+ version: "1.7.2",
+
+ // $.ui.plugin is deprecated. Use the proxy pattern instead.
+ plugin: {
+ add: function(module, option, set) {
+ var proto = $.ui[module].prototype;
+ for(var i in set) {
+ proto.plugins[i] = proto.plugins[i] || [];
+ proto.plugins[i].push([option, set[i]]);
+ }
+ },
+ call: function(instance, name, args) {
+ var set = instance.plugins[name];
+ if(!set || !instance.element[0].parentNode) { return; }
+
+ for (var i = 0; i < set.length; i++) {
+ if (instance.options[set[i][0]]) {
+ set[i][1].apply(instance.element, args);
+ }
+ }
+ }
+ },
+
+ contains: function(a, b) {
+ return document.compareDocumentPosition
+ ? a.compareDocumentPosition(b) & 16
+ : a !== b && a.contains(b);
+ },
+
+ hasScroll: function(el, a) {
+
+ //If overflow is hidden, the element might have extra content, but the user wants to hide it
+ if ($(el).css('overflow') == 'hidden') { return false; }
+
+ var scroll = (a && a == 'left') ? 'scrollLeft' : 'scrollTop',
+ has = false;
+
+ if (el[scroll] > 0) { return true; }
+
+ // TODO: determine which cases actually cause this to happen
+ // if the element doesn't have the scroll set, see if it's possible to
+ // set the scroll
+ el[scroll] = 1;
+ has = (el[scroll] > 0);
+ el[scroll] = 0;
+ return has;
+ },
+
+ isOverAxis: function(x, reference, size) {
+ //Determines when x coordinate is over "b" element axis
+ return (x > reference) && (x < (reference + size));
+ },
+
+ isOver: function(y, x, top, left, height, width) {
+ //Determines when x, y coordinates is over "b" element
+ return $.ui.isOverAxis(y, top, height) && $.ui.isOverAxis(x, left, width);
+ },
+
+ keyCode: {
+ BACKSPACE: 8,
+ CAPS_LOCK: 20,
+ COMMA: 188,
+ CONTROL: 17,
+ DELETE: 46,
+ DOWN: 40,
+ END: 35,
+ ENTER: 13,
+ ESCAPE: 27,
+ HOME: 36,
+ INSERT: 45,
+ LEFT: 37,
+ NUMPAD_ADD: 107,
+ NUMPAD_DECIMAL: 110,
+ NUMPAD_DIVIDE: 111,
+ NUMPAD_ENTER: 108,
+ NUMPAD_MULTIPLY: 106,
+ NUMPAD_SUBTRACT: 109,
+ PAGE_DOWN: 34,
+ PAGE_UP: 33,
+ PERIOD: 190,
+ RIGHT: 39,
+ SHIFT: 16,
+ SPACE: 32,
+ TAB: 9,
+ UP: 38
+ }
+};
+
+// WAI-ARIA normalization
+if (isFF2) {
+ var attr = $.attr,
+ removeAttr = $.fn.removeAttr,
+ ariaNS = "http://www.w3.org/2005/07/aaa",
+ ariaState = /^aria-/,
+ ariaRole = /^wairole:/;
+
+ $.attr = function(elem, name, value) {
+ var set = value !== undefined;
+
+ return (name == 'role'
+ ? (set
+ ? attr.call(this, elem, name, "wairole:" + value)
+ : (attr.apply(this, arguments) || "").replace(ariaRole, ""))
+ : (ariaState.test(name)
+ ? (set
+ ? elem.setAttributeNS(ariaNS,
+ name.replace(ariaState, "aaa:"), value)
+ : attr.call(this, elem, name.replace(ariaState, "aaa:")))
+ : attr.apply(this, arguments)));
+ };
+
+ $.fn.removeAttr = function(name) {
+ return (ariaState.test(name)
+ ? this.each(function() {
+ this.removeAttributeNS(ariaNS, name.replace(ariaState, ""));
+ }) : removeAttr.call(this, name));
+ };
+}
+
+//jQuery plugins
+$.fn.extend({
+ remove: function() {
+ // Safari has a native remove event which actually removes DOM elements,
+ // so we have to use triggerHandler instead of trigger (#3037).
+ $("*", this).add(this).each(function() {
+ $(this).triggerHandler("remove");
+ });
+ return _remove.apply(this, arguments );
+ },
+
+ enableSelection: function() {
+ return this
+ .attr('unselectable', 'off')
+ .css('MozUserSelect', '')
+ .unbind('selectstart.ui');
+ },
+
+ disableSelection: function() {
+ return this
+ .attr('unselectable', 'on')
+ .css('MozUserSelect', 'none')
+ .bind('selectstart.ui', function() { return false; });
+ },
+
+ scrollParent: function() {
+ var scrollParent;
+ if(($.browser.msie && (/(static|relative)/).test(this.css('position'))) || (/absolute/).test(this.css('position'))) {
+ scrollParent = this.parents().filter(function() {
+ return (/(relative|absolute|fixed)/).test($.curCSS(this,'position',1)) && (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ } else {
+ scrollParent = this.parents().filter(function() {
+ return (/(auto|scroll)/).test($.curCSS(this,'overflow',1)+$.curCSS(this,'overflow-y',1)+$.curCSS(this,'overflow-x',1));
+ }).eq(0);
+ }
+
+ return (/fixed/).test(this.css('position')) || !scrollParent.length ? $(document) : scrollParent;
+ }
+});
+
+
+//Additional selectors
+$.extend($.expr[':'], {
+ data: function(elem, i, match) {
+ return !!$.data(elem, match[3]);
+ },
+
+ focusable: function(element) {
+ var nodeName = element.nodeName.toLowerCase(),
+ tabIndex = $.attr(element, 'tabindex');
+ return (/input|select|textarea|button|object/.test(nodeName)
+ ? !element.disabled
+ : 'a' == nodeName || 'area' == nodeName
+ ? element.href || !isNaN(tabIndex)
+ : !isNaN(tabIndex))
+ // the element and all of its ancestors must be visible
+ // the browser may report that the area is hidden
+ && !$(element)['area' == nodeName ? 'parents' : 'closest'](':hidden').length;
+ },
+
+ tabbable: function(element) {
+ var tabIndex = $.attr(element, 'tabindex');
+ return (isNaN(tabIndex) || tabIndex >= 0) && $(element).is(':focusable');
+ }
+});
+
+
+// $.widget is a factory to create jQuery plugins
+// taking some boilerplate code out of the plugin code
+function getter(namespace, plugin, method, args) {
+ function getMethods(type) {
+ var methods = $[namespace][plugin][type] || [];
+ return (typeof methods == 'string' ? methods.split(/,?\s+/) : methods);
+ }
+
+ var methods = getMethods('getter');
+ if (args.length == 1 && typeof args[0] == 'string') {
+ methods = methods.concat(getMethods('getterSetter'));
+ }
+ return ($.inArray(method, methods) != -1);
+}
+
+$.widget = function(name, prototype) {
+ var namespace = name.split(".")[0];
+ name = name.split(".")[1];
+
+ // create plugin method
+ $.fn[name] = function(options) {
+ var isMethodCall = (typeof options == 'string'),
+ args = Array.prototype.slice.call(arguments, 1);
+
+ // prevent calls to internal methods
+ if (isMethodCall && options.substring(0, 1) == '_') {
+ return this;
+ }
+
+ // handle getter methods
+ if (isMethodCall && getter(namespace, name, options, args)) {
+ var instance = $.data(this[0], name);
+ return (instance ? instance[options].apply(instance, args)
+ : undefined);
+ }
+
+ // handle initialization and non-getter methods
+ return this.each(function() {
+ var instance = $.data(this, name);
+
+ // constructor
+ (!instance && !isMethodCall &&
+ $.data(this, name, new $[namespace][name](this, options))._init());
+
+ // method call
+ (instance && isMethodCall && $.isFunction(instance[options]) &&
+ instance[options].apply(instance, args));
+ });
+ };
+
+ // create widget constructor
+ $[namespace] = $[namespace] || {};
+ $[namespace][name] = function(element, options) {
+ var self = this;
+
+ this.namespace = namespace;
+ this.widgetName = name;
+ this.widgetEventPrefix = $[namespace][name].eventPrefix || name;
+ this.widgetBaseClass = namespace + '-' + name;
+
+ this.options = $.extend({},
+ $.widget.defaults,
+ $[namespace][name].defaults,
+ $.metadata && $.metadata.get(element)[name],
+ options);
+
+ this.element = $(element)
+ .bind('setData.' + name, function(event, key, value) {
+ if (event.target == element) {
+ return self._setData(key, value);
+ }
+ })
+ .bind('getData.' + name, function(event, key) {
+ if (event.target == element) {
+ return self._getData(key);
+ }
+ })
+ .bind('remove', function() {
+ return self.destroy();
+ });
+ };
+
+ // add widget prototype
+ $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
+
+ // TODO: merge getter and getterSetter properties from widget prototype
+ // and plugin prototype
+ $[namespace][name].getterSetter = 'option';
+};
+
+$.widget.prototype = {
+ _init: function() {},
+ destroy: function() {
+ this.element.removeData(this.widgetName)
+ .removeClass(this.widgetBaseClass + '-disabled' + ' ' + this.namespace + '-state-disabled')
+ .removeAttr('aria-disabled');
+ },
+
+ option: function(key, value) {
+ var options = key,
+ self = this;
+
+ if (typeof key == "string") {
+ if (value === undefined) {
+ return this._getData(key);
+ }
+ options = {};
+ options[key] = value;
+ }
+
+ $.each(options, function(key, value) {
+ self._setData(key, value);
+ });
+ },
+ _getData: function(key) {
+ return this.options[key];
+ },
+ _setData: function(key, value) {
+ this.options[key] = value;
+
+ if (key == 'disabled') {
+ this.element
+ [value ? 'addClass' : 'removeClass'](
+ this.widgetBaseClass + '-disabled' + ' ' +
+ this.namespace + '-state-disabled')
+ .attr("aria-disabled", value);
+ }
+ },
+
+ enable: function() {
+ this._setData('disabled', false);
+ },
+ disable: function() {
+ this._setData('disabled', true);
+ },
+
+ _trigger: function(type, event, data) {
+ var callback = this.options[type],
+ eventName = (type == this.widgetEventPrefix
+ ? type : this.widgetEventPrefix + type);
+
+ event = $.Event(event);
+ event.type = eventName;
+
+ // copy original event properties over to the new event
+ // this would happen if we could call $.event.fix instead of $.Event
+ // but we don't have a way to force an event to be fixed multiple times
+ if (event.originalEvent) {
+ for (var i = $.event.props.length, prop; i;) {
+ prop = $.event.props[--i];
+ event[prop] = event.originalEvent[prop];
+ }
+ }
+
+ this.element.trigger(event, data);
+
+ return !($.isFunction(callback) && callback.call(this.element[0], event, data) === false
+ || event.isDefaultPrevented());
+ }
+};
+
+$.widget.defaults = {
+ disabled: false
+};
+
+
+/** Mouse Interaction Plugin **/
+
+$.ui.mouse = {
+ _mouseInit: function() {
+ var self = this;
+
+ this.element
+ .bind('mousedown.'+this.widgetName, function(event) {
+ return self._mouseDown(event);
+ })
+ .bind('click.'+this.widgetName, function(event) {
+ if(self._preventClickEvent) {
+ self._preventClickEvent = false;
+ event.stopImmediatePropagation();
+ return false;
+ }
+ });
+
+ // Prevent text selection in IE
+ if ($.browser.msie) {
+ this._mouseUnselectable = this.element.attr('unselectable');
+ this.element.attr('unselectable', 'on');
+ }
+
+ this.started = false;
+ },
+
+ // TODO: make sure destroying one instance of mouse doesn't mess with
+ // other instances of mouse
+ _mouseDestroy: function() {
+ this.element.unbind('.'+this.widgetName);
+
+ // Restore text selection in IE
+ ($.browser.msie
+ && this.element.attr('unselectable', this._mouseUnselectable));
+ },
+
+ _mouseDown: function(event) {
+ // don't let more than one widget handle mouseStart
+ // TODO: figure out why we have to use originalEvent
+ event.originalEvent = event.originalEvent || {};
+ if (event.originalEvent.mouseHandled) { return; }
+
+ // we may have missed mouseup (out of window)
+ (this._mouseStarted && this._mouseUp(event));
+
+ this._mouseDownEvent = event;
+
+ var self = this,
+ btnIsLeft = (event.which == 1),
+ elIsCancel = (typeof this.options.cancel == "string" ? $(event.target).parents().add(event.target).filter(this.options.cancel).length : false);
+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {
+ return true;
+ }
+
+ this.mouseDelayMet = !this.options.delay;
+ if (!this.mouseDelayMet) {
+ this._mouseDelayTimer = setTimeout(function() {
+ self.mouseDelayMet = true;
+ }, this.options.delay);
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted = (this._mouseStart(event) !== false);
+ if (!this._mouseStarted) {
+ event.preventDefault();
+ return true;
+ }
+ }
+
+ // these delegates are required to keep context
+ this._mouseMoveDelegate = function(event) {
+ return self._mouseMove(event);
+ };
+ this._mouseUpDelegate = function(event) {
+ return self._mouseUp(event);
+ };
+ $(document)
+ .bind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .bind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ // preventDefault() is used to prevent the selection of text here -
+ // however, in Safari, this causes select boxes not to be selectable
+ // anymore, so this fix is needed
+ ($.browser.safari || event.preventDefault());
+
+ event.originalEvent.mouseHandled = true;
+ return true;
+ },
+
+ _mouseMove: function(event) {
+ // IE mouseup check - mouseup happened when mouse was out of window
+ if ($.browser.msie && !event.button) {
+ return this._mouseUp(event);
+ }
+
+ if (this._mouseStarted) {
+ this._mouseDrag(event);
+ return event.preventDefault();
+ }
+
+ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {
+ this._mouseStarted =
+ (this._mouseStart(this._mouseDownEvent, event) !== false);
+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));
+ }
+
+ return !this._mouseStarted;
+ },
+
+ _mouseUp: function(event) {
+ $(document)
+ .unbind('mousemove.'+this.widgetName, this._mouseMoveDelegate)
+ .unbind('mouseup.'+this.widgetName, this._mouseUpDelegate);
+
+ if (this._mouseStarted) {
+ this._mouseStarted = false;
+ this._preventClickEvent = (event.target == this._mouseDownEvent.target);
+ this._mouseStop(event);
+ }
+
+ return false;
+ },
+
+ _mouseDistanceMet: function(event) {
+ return (Math.max(
+ Math.abs(this._mouseDownEvent.pageX - event.pageX),
+ Math.abs(this._mouseDownEvent.pageY - event.pageY)
+ ) >= this.options.distance
+ );
+ },
+
+ _mouseDelayMet: function(event) {
+ return this.mouseDelayMet;
+ },
+
+ // These are placeholder methods, to be overriden by extending plugin
+ _mouseStart: function(event) {},
+ _mouseDrag: function(event) {},
+ _mouseStop: function(event) {},
+ _mouseCapture: function(event) { return true; }
+};
+
+$.ui.mouse.defaults = {
+ cancel: null,
+ distance: 1,
+ delay: 0
+};
+
+})(jQuery);
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/ui.draggable.js b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.draggable.js
new file mode 100644
index 0000000..0402f0e
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.draggable.js
@@ -0,0 +1,766 @@
+/*
+ * jQuery UI Draggable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Draggables
+ *
+ * Depends:
+ * ui.core.js
+ */
+(function($) {
+
+$.widget("ui.draggable", $.extend({}, $.ui.mouse, {
+
+ _init: function() {
+
+ if (this.options.helper == 'original' && !(/^(?:r|a|f)/).test(this.element.css("position")))
+ this.element[0].style.position = 'relative';
+
+ (this.options.addClasses && this.element.addClass("ui-draggable"));
+ (this.options.disabled && this.element.addClass("ui-draggable-disabled"));
+
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+ if(!this.element.data('draggable')) return;
+ this.element
+ .removeData("draggable")
+ .unbind(".draggable")
+ .removeClass("ui-draggable"
+ + " ui-draggable-dragging"
+ + " ui-draggable-disabled");
+ this._mouseDestroy();
+ },
+
+ _mouseCapture: function(event) {
+
+ var o = this.options;
+
+ if (this.helper || o.disabled || $(event.target).is('.ui-resizable-handle'))
+ return false;
+
+ //Quit if we're not on a valid handle
+ this.handle = this._getHandle(event);
+ if (!this.handle)
+ return false;
+
+ return true;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options;
+
+ //Create and append the visible helper
+ this.helper = this._createHelper(event);
+
+ //Cache the helper size
+ this._cacheHelperProportions();
+
+ //If ddmanager is used for droppables, set the global draggable
+ if($.ui.ddmanager)
+ $.ui.ddmanager.current = this;
+
+ /*
+ * - Position generation -
+ * This block generates everything position related - it's the core of draggables.
+ */
+
+ //Cache the margins of the original element
+ this._cacheMargins();
+
+ //Store the helper's css position
+ this.cssPosition = this.helper.css("position");
+ this.scrollParent = this.helper.scrollParent();
+
+ //The element's absolute position on the page minus margins
+ this.offset = this.element.offset();
+ this.offset = {
+ top: this.offset.top - this.margins.top,
+ left: this.offset.left - this.margins.left
+ };
+
+ $.extend(this.offset, {
+ click: { //Where the click happened, relative to the element
+ left: event.pageX - this.offset.left,
+ top: event.pageY - this.offset.top
+ },
+ parent: this._getParentOffset(),
+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper
+ });
+
+ //Generate the original position
+ this.originalPosition = this._generatePosition(event);
+ this.originalPageX = event.pageX;
+ this.originalPageY = event.pageY;
+
+ //Adjust the mouse offset relative to the helper if 'cursorAt' is supplied
+ if(o.cursorAt)
+ this._adjustOffsetFromHelper(o.cursorAt);
+
+ //Set a containment if given in the options
+ if(o.containment)
+ this._setContainment();
+
+ //Call plugins and callbacks
+ this._trigger("start", event);
+
+ //Recache the helper size
+ this._cacheHelperProportions();
+
+ //Prepare the droppable offsets
+ if ($.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(this, event);
+
+ this.helper.addClass("ui-draggable-dragging");
+ this._mouseDrag(event, true); //Execute the drag once - this causes the helper not to be visible before getting its correct position
+ return true;
+ },
+
+ _mouseDrag: function(event, noPropagation) {
+
+ //Compute the helpers position
+ this.position = this._generatePosition(event);
+ this.positionAbs = this._convertPositionTo("absolute");
+
+ //Call plugins and callbacks and use the resulting position if something is returned
+ if (!noPropagation) {
+ var ui = this._uiHash();
+ this._trigger('drag', event, ui);
+ this.position = ui.position;
+ }
+
+ if(!this.options.axis || this.options.axis != "y") this.helper[0].style.left = this.position.left+'px';
+ if(!this.options.axis || this.options.axis != "x") this.helper[0].style.top = this.position.top+'px';
+ if($.ui.ddmanager) $.ui.ddmanager.drag(this, event);
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ //If we are using droppables, inform the manager about the drop
+ var dropped = false;
+ if ($.ui.ddmanager && !this.options.dropBehaviour)
+ dropped = $.ui.ddmanager.drop(this, event);
+
+ //if a drop comes from outside (a sortable)
+ if(this.dropped) {
+ dropped = this.dropped;
+ this.dropped = false;
+ }
+
+ if((this.options.revert == "invalid" && !dropped) || (this.options.revert == "valid" && dropped) || this.options.revert === true || ($.isFunction(this.options.revert) && this.options.revert.call(this.element, dropped))) {
+ var self = this;
+ $(this.helper).animate(this.originalPosition, parseInt(this.options.revertDuration, 10), function() {
+ self._trigger("stop", event);
+ self._clear();
+ });
+ } else {
+ this._trigger("stop", event);
+ this._clear();
+ }
+
+ return false;
+ },
+
+ _getHandle: function(event) {
+
+ var handle = !this.options.handle || !$(this.options.handle, this.element).length ? true : false;
+ $(this.options.handle, this.element)
+ .find("*")
+ .andSelf()
+ .each(function() {
+ if(this == event.target) handle = true;
+ });
+
+ return handle;
+
+ },
+
+ _createHelper: function(event) {
+
+ var o = this.options;
+ var helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event])) : (o.helper == 'clone' ? this.element.clone() : this.element);
+
+ if(!helper.parents('body').length)
+ helper.appendTo((o.appendTo == 'parent' ? this.element[0].parentNode : o.appendTo));
+
+ if(helper[0] != this.element[0] && !(/(fixed|absolute)/).test(helper.css("position")))
+ helper.css("position", "absolute");
+
+ return helper;
+
+ },
+
+ _adjustOffsetFromHelper: function(obj) {
+ if(obj.left != undefined) this.offset.click.left = obj.left + this.margins.left;
+ if(obj.right != undefined) this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;
+ if(obj.top != undefined) this.offset.click.top = obj.top + this.margins.top;
+ if(obj.bottom != undefined) this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;
+ },
+
+ _getParentOffset: function() {
+
+ //Get the offsetParent and cache its position
+ this.offsetParent = this.helper.offsetParent();
+ var po = this.offsetParent.offset();
+
+ // This is a special case where we need to modify a offset calculated on start, since the following happened:
+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent
+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that
+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag
+ if(this.cssPosition == 'absolute' && this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) {
+ po.left += this.scrollParent.scrollLeft();
+ po.top += this.scrollParent.scrollTop();
+ }
+
+ if((this.offsetParent[0] == document.body) //This needs to be actually done for all browsers, since pageX/pageY includes this information
+ || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() == 'html' && $.browser.msie)) //Ugly IE fix
+ po = { top: 0, left: 0 };
+
+ return {
+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),
+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)
+ };
+
+ },
+
+ _getRelativeOffset: function() {
+
+ if(this.cssPosition == "relative") {
+ var p = this.element.position();
+ return {
+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),
+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()
+ };
+ } else {
+ return { top: 0, left: 0 };
+ }
+
+ },
+
+ _cacheMargins: function() {
+ this.margins = {
+ left: (parseInt(this.element.css("marginLeft"),10) || 0),
+ top: (parseInt(this.element.css("marginTop"),10) || 0)
+ };
+ },
+
+ _cacheHelperProportions: function() {
+ this.helperProportions = {
+ width: this.helper.outerWidth(),
+ height: this.helper.outerHeight()
+ };
+ },
+
+ _setContainment: function() {
+
+ var o = this.options;
+ if(o.containment == 'parent') o.containment = this.helper[0].parentNode;
+ if(o.containment == 'document' || o.containment == 'window') this.containment = [
+ 0 - this.offset.relative.left - this.offset.parent.left,
+ 0 - this.offset.relative.top - this.offset.parent.top,
+ $(o.containment == 'document' ? document : window).width() - this.helperProportions.width - this.margins.left,
+ ($(o.containment == 'document' ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top
+ ];
+
+ if(!(/^(document|window|parent)$/).test(o.containment) && o.containment.constructor != Array) {
+ var ce = $(o.containment)[0]; if(!ce) return;
+ var co = $(o.containment).offset();
+ var over = ($(ce).css("overflow") != 'hidden');
+
+ this.containment = [
+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,
+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,
+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,
+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top
+ ];
+ } else if(o.containment.constructor == Array) {
+ this.containment = o.containment;
+ }
+
+ },
+
+ _convertPositionTo: function(d, pos) {
+
+ if(!pos) pos = this.position;
+ var mod = d == "absolute" ? 1 : -1;
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ return {
+ top: (
+ pos.top // The absolute mouse position
+ + this.offset.relative.top * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.top * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)
+ ),
+ left: (
+ pos.left // The absolute mouse position
+ + this.offset.relative.left * mod // Only for relative positioned nodes: Relative offset from element to offset parent
+ + this.offset.parent.left * mod // The offsetParent's offset without borders (offset + border)
+ - ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)
+ )
+ };
+
+ },
+
+ _generatePosition: function(event) {
+
+ var o = this.options, scroll = this.cssPosition == 'absolute' && !(this.scrollParent[0] != document && $.ui.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);
+
+ // This is another very weird special case that only happens for relative elements:
+ // 1. If the css position is relative
+ // 2. and the scroll parent is the document or similar to the offset parent
+ // we have to refresh the relative offset during the scroll so there are no jumps
+ if(this.cssPosition == 'relative' && !(this.scrollParent[0] != document && this.scrollParent[0] != this.offsetParent[0])) {
+ this.offset.relative = this._getRelativeOffset();
+ }
+
+ var pageX = event.pageX;
+ var pageY = event.pageY;
+
+ /*
+ * - Position constraining -
+ * Constrain the position to a mix of grid, containment.
+ */
+
+ if(this.originalPosition) { //If we are not dragging yet, we won't check for options
+
+ if(this.containment) {
+ if(event.pageX - this.offset.click.left < this.containment[0]) pageX = this.containment[0] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top < this.containment[1]) pageY = this.containment[1] + this.offset.click.top;
+ if(event.pageX - this.offset.click.left > this.containment[2]) pageX = this.containment[2] + this.offset.click.left;
+ if(event.pageY - this.offset.click.top > this.containment[3]) pageY = this.containment[3] + this.offset.click.top;
+ }
+
+ if(o.grid) {
+ var top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];
+ pageY = this.containment ? (!(top - this.offset.click.top < this.containment[1] || top - this.offset.click.top > this.containment[3]) ? top : (!(top - this.offset.click.top < this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;
+
+ var left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];
+ pageX = this.containment ? (!(left - this.offset.click.left < this.containment[0] || left - this.offset.click.left > this.containment[2]) ? left : (!(left - this.offset.click.left < this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;
+ }
+
+ }
+
+ return {
+ top: (
+ pageY // The absolute mouse position
+ - this.offset.click.top // Click offset (relative to the element)
+ - this.offset.relative.top // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.top // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))
+ ),
+ left: (
+ pageX // The absolute mouse position
+ - this.offset.click.left // Click offset (relative to the element)
+ - this.offset.relative.left // Only for relative positioned nodes: Relative offset from element to offset parent
+ - this.offset.parent.left // The offsetParent's offset without borders (offset + border)
+ + ($.browser.safari && this.cssPosition == 'fixed' ? 0 : ( this.cssPosition == 'fixed' ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))
+ )
+ };
+
+ },
+
+ _clear: function() {
+ this.helper.removeClass("ui-draggable-dragging");
+ if(this.helper[0] != this.element[0] && !this.cancelHelperRemoval) this.helper.remove();
+ //if($.ui.ddmanager) $.ui.ddmanager.current = null;
+ this.helper = null;
+ this.cancelHelperRemoval = false;
+ },
+
+ // From now on bulk stuff - mainly helpers
+
+ _trigger: function(type, event, ui) {
+ ui = ui || this._uiHash();
+ $.ui.plugin.call(this, type, [event, ui]);
+ if(type == "drag") this.positionAbs = this._convertPositionTo("absolute"); //The absolute position has to be recalculated after plugins
+ return $.widget.prototype._trigger.call(this, type, event, ui);
+ },
+
+ plugins: {},
+
+ _uiHash: function(event) {
+ return {
+ helper: this.helper,
+ position: this.position,
+ absolutePosition: this.positionAbs, //deprecated
+ offset: this.positionAbs
+ };
+ }
+
+}));
+
+$.extend($.ui.draggable, {
+ version: "1.7.2",
+ eventPrefix: "drag",
+ defaults: {
+ addClasses: true,
+ appendTo: "parent",
+ axis: false,
+ cancel: ":input,option",
+ connectToSortable: false,
+ containment: false,
+ cursor: "auto",
+ cursorAt: false,
+ delay: 0,
+ distance: 1,
+ grid: false,
+ handle: false,
+ helper: "original",
+ iframeFix: false,
+ opacity: false,
+ refreshPositions: false,
+ revert: false,
+ revertDuration: 500,
+ scope: "default",
+ scroll: true,
+ scrollSensitivity: 20,
+ scrollSpeed: 20,
+ snap: false,
+ snapMode: "both",
+ snapTolerance: 20,
+ stack: false,
+ zIndex: false
+ }
+});
+
+$.ui.plugin.add("draggable", "connectToSortable", {
+ start: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options,
+ uiSortable = $.extend({}, ui, { item: inst.element });
+ inst.sortables = [];
+ $(o.connectToSortable).each(function() {
+ var sortable = $.data(this, 'sortable');
+ if (sortable && !sortable.options.disabled) {
+ inst.sortables.push({
+ instance: sortable,
+ shouldRevert: sortable.options.revert
+ });
+ sortable._refreshItems(); //Do a one-time refresh at start to refresh the containerCache
+ sortable._trigger("activate", event, uiSortable);
+ }
+ });
+
+ },
+ stop: function(event, ui) {
+
+ //If we are still over the sortable, we fake the stop event of the sortable, but also remove helper
+ var inst = $(this).data("draggable"),
+ uiSortable = $.extend({}, ui, { item: inst.element });
+
+ $.each(inst.sortables, function() {
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+
+ inst.cancelHelperRemoval = true; //Don't remove the helper in the draggable instance
+ this.instance.cancelHelperRemoval = false; //Remove it in the sortable instance (so sortable plugins like revert still work)
+
+ //The sortable revert is supported, and we have to set a temporary dropped variable on the draggable to support revert: 'valid/invalid'
+ if(this.shouldRevert) this.instance.options.revert = true;
+
+ //Trigger the stop of the sortable
+ this.instance._mouseStop(event);
+
+ this.instance.options.helper = this.instance.options._helper;
+
+ //If the helper has been the original item, restore properties in the sortable
+ if(inst.options.helper == 'original')
+ this.instance.currentItem.css({ top: 'auto', left: 'auto' });
+
+ } else {
+ this.instance.cancelHelperRemoval = false; //Remove the helper in the sortable instance
+ this.instance._trigger("deactivate", event, uiSortable);
+ }
+
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), self = this;
+
+ var checkPos = function(o) {
+ var dyClick = this.offset.click.top, dxClick = this.offset.click.left;
+ var helperTop = this.positionAbs.top, helperLeft = this.positionAbs.left;
+ var itemHeight = o.height, itemWidth = o.width;
+ var itemTop = o.top, itemLeft = o.left;
+
+ return $.ui.isOver(helperTop + dyClick, helperLeft + dxClick, itemTop, itemLeft, itemHeight, itemWidth);
+ };
+
+ $.each(inst.sortables, function(i) {
+
+ //Copy over some variables to allow calling the sortable's native _intersectsWith
+ this.instance.positionAbs = inst.positionAbs;
+ this.instance.helperProportions = inst.helperProportions;
+ this.instance.offset.click = inst.offset.click;
+
+ if(this.instance._intersectsWith(this.instance.containerCache)) {
+
+ //If it intersects, we use a little isOver variable and set it once, so our move-in stuff gets fired only once
+ if(!this.instance.isOver) {
+
+ this.instance.isOver = 1;
+ //Now we fake the start of dragging for the sortable instance,
+ //by cloning the list group item, appending it to the sortable and using it as inst.currentItem
+ //We can then fire the start event of the sortable with our passed browser event, and our own helper (so it doesn't create a new one)
+ this.instance.currentItem = $(self).clone().appendTo(this.instance.element).data("sortable-item", true);
+ this.instance.options._helper = this.instance.options.helper; //Store helper option to later restore it
+ this.instance.options.helper = function() { return ui.helper[0]; };
+
+ event.target = this.instance.currentItem[0];
+ this.instance._mouseCapture(event, true);
+ this.instance._mouseStart(event, true, true);
+
+ //Because the browser event is way off the new appended portlet, we modify a couple of variables to reflect the changes
+ this.instance.offset.click.top = inst.offset.click.top;
+ this.instance.offset.click.left = inst.offset.click.left;
+ this.instance.offset.parent.left -= inst.offset.parent.left - this.instance.offset.parent.left;
+ this.instance.offset.parent.top -= inst.offset.parent.top - this.instance.offset.parent.top;
+
+ inst._trigger("toSortable", event);
+ inst.dropped = this.instance.element; //draggable revert needs that
+ //hack so receive/update callbacks work (mostly)
+ inst.currentItem = inst.element;
+ this.instance.fromOutside = inst;
+
+ }
+
+ //Provided we did all the previous steps, we can fire the drag event of the sortable on every draggable drag, when it intersects with the sortable
+ if(this.instance.currentItem) this.instance._mouseDrag(event);
+
+ } else {
+
+ //If it doesn't intersect with the sortable, and it intersected before,
+ //we fake the drag stop of the sortable, but make sure it doesn't remove the helper by using cancelHelperRemoval
+ if(this.instance.isOver) {
+
+ this.instance.isOver = 0;
+ this.instance.cancelHelperRemoval = true;
+
+ //Prevent reverting on this forced stop
+ this.instance.options.revert = false;
+
+ // The out event needs to be triggered independently
+ this.instance._trigger('out', event, this.instance._uiHash(this.instance));
+
+ this.instance._mouseStop(event, true);
+ this.instance.options.helper = this.instance.options._helper;
+
+ //Now we remove our currentItem, the list group clone again, and the placeholder, and animate the helper back to it's original size
+ this.instance.currentItem.remove();
+ if(this.instance.placeholder) this.instance.placeholder.remove();
+
+ inst._trigger("fromSortable", event);
+ inst.dropped = false; //draggable revert needs that
+ }
+
+ };
+
+ });
+
+ }
+});
+
+$.ui.plugin.add("draggable", "cursor", {
+ start: function(event, ui) {
+ var t = $('body'), o = $(this).data('draggable').options;
+ if (t.css("cursor")) o._cursor = t.css("cursor");
+ t.css("cursor", o.cursor);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if (o._cursor) $('body').css("cursor", o._cursor);
+ }
+});
+
+$.ui.plugin.add("draggable", "iframeFix", {
+ start: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ $(o.iframeFix === true ? "iframe" : o.iframeFix).each(function() {
+ $('
')
+ .css({
+ width: this.offsetWidth+"px", height: this.offsetHeight+"px",
+ position: "absolute", opacity: "0.001", zIndex: 1000
+ })
+ .css($(this).offset())
+ .appendTo("body");
+ });
+ },
+ stop: function(event, ui) {
+ $("div.ui-draggable-iframeFix").each(function() { this.parentNode.removeChild(this); }); //Remove frame helpers
+ }
+});
+
+$.ui.plugin.add("draggable", "opacity", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data('draggable').options;
+ if(t.css("opacity")) o._opacity = t.css("opacity");
+ t.css('opacity', o.opacity);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data('draggable').options;
+ if(o._opacity) $(ui.helper).css('opacity', o._opacity);
+ }
+});
+
+$.ui.plugin.add("draggable", "scroll", {
+ start: function(event, ui) {
+ var i = $(this).data("draggable");
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') i.overflowOffset = i.scrollParent.offset();
+ },
+ drag: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options, scrolled = false;
+
+ if(i.scrollParent[0] != document && i.scrollParent[0].tagName != 'HTML') {
+
+ if(!o.axis || o.axis != 'x') {
+ if((i.overflowOffset.top + i.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop + o.scrollSpeed;
+ else if(event.pageY - i.overflowOffset.top < o.scrollSensitivity)
+ i.scrollParent[0].scrollTop = scrolled = i.scrollParent[0].scrollTop - o.scrollSpeed;
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if((i.overflowOffset.left + i.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft + o.scrollSpeed;
+ else if(event.pageX - i.overflowOffset.left < o.scrollSensitivity)
+ i.scrollParent[0].scrollLeft = scrolled = i.scrollParent[0].scrollLeft - o.scrollSpeed;
+ }
+
+ } else {
+
+ if(!o.axis || o.axis != 'x') {
+ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);
+ else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity)
+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);
+ }
+
+ if(!o.axis || o.axis != 'y') {
+ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);
+ else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity)
+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);
+ }
+
+ }
+
+ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour)
+ $.ui.ddmanager.prepareOffsets(i, event);
+
+ }
+});
+
+$.ui.plugin.add("draggable", "snap", {
+ start: function(event, ui) {
+
+ var i = $(this).data("draggable"), o = i.options;
+ i.snapElements = [];
+
+ $(o.snap.constructor != String ? ( o.snap.items || ':data(draggable)' ) : o.snap).each(function() {
+ var $t = $(this); var $o = $t.offset();
+ if(this != i.element[0]) i.snapElements.push({
+ item: this,
+ width: $t.outerWidth(), height: $t.outerHeight(),
+ top: $o.top, left: $o.left
+ });
+ });
+
+ },
+ drag: function(event, ui) {
+
+ var inst = $(this).data("draggable"), o = inst.options;
+ var d = o.snapTolerance;
+
+ var x1 = ui.offset.left, x2 = x1 + inst.helperProportions.width,
+ y1 = ui.offset.top, y2 = y1 + inst.helperProportions.height;
+
+ for (var i = inst.snapElements.length - 1; i >= 0; i--){
+
+ var l = inst.snapElements[i].left, r = l + inst.snapElements[i].width,
+ t = inst.snapElements[i].top, b = t + inst.snapElements[i].height;
+
+ //Yes, I know, this is insane ;)
+ if(!((l-d < x1 && x1 < r+d && t-d < y1 && y1 < b+d) || (l-d < x1 && x1 < r+d && t-d < y2 && y2 < b+d) || (l-d < x2 && x2 < r+d && t-d < y1 && y1 < b+d) || (l-d < x2 && x2 < r+d && t-d < y2 && y2 < b+d))) {
+ if(inst.snapElements[i].snapping) (inst.options.snap.release && inst.options.snap.release.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = false;
+ continue;
+ }
+
+ if(o.snapMode != 'inner') {
+ var ts = Math.abs(t - y2) <= d;
+ var bs = Math.abs(b - y1) <= d;
+ var ls = Math.abs(l - x2) <= d;
+ var rs = Math.abs(r - x1) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l - inst.helperProportions.width }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r }).left - inst.margins.left;
+ }
+
+ var first = (ts || bs || ls || rs);
+
+ if(o.snapMode != 'outer') {
+ var ts = Math.abs(t - y1) <= d;
+ var bs = Math.abs(b - y2) <= d;
+ var ls = Math.abs(l - x1) <= d;
+ var rs = Math.abs(r - x2) <= d;
+ if(ts) ui.position.top = inst._convertPositionTo("relative", { top: t, left: 0 }).top - inst.margins.top;
+ if(bs) ui.position.top = inst._convertPositionTo("relative", { top: b - inst.helperProportions.height, left: 0 }).top - inst.margins.top;
+ if(ls) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: l }).left - inst.margins.left;
+ if(rs) ui.position.left = inst._convertPositionTo("relative", { top: 0, left: r - inst.helperProportions.width }).left - inst.margins.left;
+ }
+
+ if(!inst.snapElements[i].snapping && (ts || bs || ls || rs || first))
+ (inst.options.snap.snap && inst.options.snap.snap.call(inst.element, event, $.extend(inst._uiHash(), { snapItem: inst.snapElements[i].item })));
+ inst.snapElements[i].snapping = (ts || bs || ls || rs || first);
+
+ };
+
+ }
+});
+
+$.ui.plugin.add("draggable", "stack", {
+ start: function(event, ui) {
+
+ var o = $(this).data("draggable").options;
+
+ var group = $.makeArray($(o.stack.group)).sort(function(a,b) {
+ return (parseInt($(a).css("zIndex"),10) || o.stack.min) - (parseInt($(b).css("zIndex"),10) || o.stack.min);
+ });
+
+ $(group).each(function(i) {
+ this.style.zIndex = o.stack.min + i;
+ });
+
+ this[0].style.zIndex = o.stack.min + group.length;
+
+ }
+});
+
+$.ui.plugin.add("draggable", "zIndex", {
+ start: function(event, ui) {
+ var t = $(ui.helper), o = $(this).data("draggable").options;
+ if(t.css("zIndex")) o._zIndex = t.css("zIndex");
+ t.css('zIndex', o.zIndex);
+ },
+ stop: function(event, ui) {
+ var o = $(this).data("draggable").options;
+ if(o._zIndex) $(ui.helper).css('zIndex', o._zIndex);
+ }
+});
+
+})(jQuery);
diff --git a/src/main/resources/org/richfaces/renderkit/html/scripts/ui.resizable.js b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.resizable.js
new file mode 100644
index 0000000..6172d6c
--- /dev/null
+++ b/src/main/resources/org/richfaces/renderkit/html/scripts/ui.resizable.js
@@ -0,0 +1,800 @@
+/*
+ * jQuery UI Resizable 1.7.2
+ *
+ * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * http://docs.jquery.com/UI/Resizables
+ *
+ * Depends:
+ * ui.core.js
+ */
+(function($) {
+
+$.widget("ui.resizable", $.extend({}, $.ui.mouse, {
+
+ _init: function() {
+
+ var self = this, o = this.options;
+ this.element.addClass("ui-resizable");
+
+ $.extend(this, {
+ _aspectRatio: !!(o.aspectRatio),
+ aspectRatio: o.aspectRatio,
+ originalElement: this.element,
+ _proportionallyResizeElements: [],
+ _helper: o.helper || o.ghost || o.animate ? o.helper || 'ui-resizable-helper' : null
+ });
+
+ //Wrap the element if it cannot hold child nodes
+ if(this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)) {
+
+ //Opera fix for relative positioning
+ if (/relative/.test(this.element.css('position')) && $.browser.opera)
+ this.element.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ //Create a wrapper element and set the wrapper to the new current internal element
+ this.element.wrap(
+ $('
').css({
+ position: this.element.css('position'),
+ width: this.element.outerWidth(),
+ height: this.element.outerHeight(),
+ top: this.element.css('top'),
+ left: this.element.css('left')
+ })
+ );
+
+ //Overwrite the original this.element
+ this.element = this.element.parent().data(
+ "resizable", this.element.data('resizable')
+ );
+
+ this.elementIsWrapper = true;
+
+ //Move margins to the wrapper
+ this.element.css({ marginLeft: this.originalElement.css("marginLeft"), marginTop: this.originalElement.css("marginTop"), marginRight: this.originalElement.css("marginRight"), marginBottom: this.originalElement.css("marginBottom") });
+ this.originalElement.css({ marginLeft: 0, marginTop: 0, marginRight: 0, marginBottom: 0});
+
+ //Prevent Safari textarea resize
+ this.originalResizeStyle = this.originalElement.css('resize');
+ this.originalElement.css('resize', 'none');
+
+ //Push the actual element to our proportionallyResize internal array
+ this._proportionallyResizeElements.push(this.originalElement.css({ position: 'static', zoom: 1, display: 'block' }));
+
+ // avoid IE jump (hard set the margin)
+ this.originalElement.css({ margin: this.originalElement.css('margin') });
+
+ // fix handlers offset
+ this._proportionallyResize();
+
+ }
+
+ this.handles = o.handles || (!$('.ui-resizable-handle', this.element).length ? "e,s,se" : { n: '.ui-resizable-n', e: '.ui-resizable-e', s: '.ui-resizable-s', w: '.ui-resizable-w', se: '.ui-resizable-se', sw: '.ui-resizable-sw', ne: '.ui-resizable-ne', nw: '.ui-resizable-nw' });
+ if(this.handles.constructor == String) {
+
+ if(this.handles == 'all') this.handles = 'n,e,s,w,se,sw,ne,nw';
+ var n = this.handles.split(","); this.handles = {};
+
+ for(var i = 0; i < n.length; i++) {
+
+ var handle = $.trim(n[i]), hname = 'ui-resizable-'+handle;
+ var axis = $('
');
+
+ // increase zIndex of sw, se, ne, nw axis
+ //TODO : this modifies original option
+ if(/sw|se|ne|nw/.test(handle)) axis.css({ zIndex: ++o.zIndex });
+
+ //TODO : What's going on here?
+ if ('se' == handle) {
+ axis.addClass('ui-icon ui-icon-gripsmall-diagonal-se');
+ };
+
+ //Insert into internal handles object and append to element
+ this.handles[handle] = '.ui-resizable-'+handle;
+ this.element.append(axis);
+ }
+
+ }
+
+ this._renderAxis = function(target) {
+
+ target = target || this.element;
+
+ for(var i in this.handles) {
+
+ if(this.handles[i].constructor == String)
+ this.handles[i] = $(this.handles[i], this.element).show();
+
+ //Apply pad to wrapper element, needed to fix axis position (textarea, inputs, scrolls)
+ if (this.elementIsWrapper && this.originalElement[0].nodeName.match(/textarea|input|select|button/i)) {
+
+ var axis = $(this.handles[i], this.element), padWrapper = 0;
+
+ //Checking the correct pad and border
+ padWrapper = /sw|ne|nw|se|n|s/.test(i) ? axis.outerHeight() : axis.outerWidth();
+
+ //The padding type i have to apply...
+ var padPos = [ 'padding',
+ /ne|nw|n/.test(i) ? 'Top' :
+ /se|sw|s/.test(i) ? 'Bottom' :
+ /^e$/.test(i) ? 'Right' : 'Left' ].join("");
+
+ target.css(padPos, padWrapper);
+
+ this._proportionallyResize();
+
+ }
+
+ //TODO: What's that good for? There's not anything to be executed left
+ if(!$(this.handles[i]).length)
+ continue;
+
+ }
+ };
+
+ //TODO: make renderAxis a prototype function
+ this._renderAxis(this.element);
+
+ this._handles = $('.ui-resizable-handle', this.element)
+ .disableSelection();
+
+ //Matching axis name
+ this._handles.mouseover(function() {
+ if (!self.resizing) {
+ if (this.className)
+ var axis = this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);
+ //Axis, default = se
+ self.axis = axis && axis[1] ? axis[1] : 'se';
+ }
+ });
+
+ //If we want to auto hide the elements
+ if (o.autoHide) {
+ this._handles.hide();
+ $(this.element)
+ .addClass("ui-resizable-autohide")
+ .hover(function() {
+ $(this).removeClass("ui-resizable-autohide");
+ self._handles.show();
+ },
+ function(){
+ if (!self.resizing) {
+ $(this).addClass("ui-resizable-autohide");
+ self._handles.hide();
+ }
+ });
+ }
+
+ //Initialize the mouse interaction
+ this._mouseInit();
+
+ },
+
+ destroy: function() {
+
+ this._mouseDestroy();
+
+ var _destroy = function(exp) {
+ $(exp).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing")
+ .removeData("resizable").unbind(".resizable").find('.ui-resizable-handle').remove();
+ };
+
+ //TODO: Unwrap at same DOM position
+ if (this.elementIsWrapper) {
+ _destroy(this.element);
+ var wrapper = this.element;
+ wrapper.parent().append(
+ this.originalElement.css({
+ position: wrapper.css('position'),
+ width: wrapper.outerWidth(),
+ height: wrapper.outerHeight(),
+ top: wrapper.css('top'),
+ left: wrapper.css('left')
+ })
+ ).end().remove();
+ }
+
+ this.originalElement.css('resize', this.originalResizeStyle);
+ _destroy(this.originalElement);
+
+ },
+
+ _mouseCapture: function(event) {
+
+ var handle = false;
+ for(var i in this.handles) {
+ if($(this.handles[i])[0] == event.target) handle = true;
+ }
+
+ return this.options.disabled || !!handle;
+
+ },
+
+ _mouseStart: function(event) {
+
+ var o = this.options, iniPos = this.element.position(), el = this.element;
+
+ this.resizing = true;
+ this.documentScroll = { top: $(document).scrollTop(), left: $(document).scrollLeft() };
+
+ // bugfix for http://dev.jquery.com/ticket/1749
+ if (el.is('.ui-draggable') || (/absolute/).test(el.css('position'))) {
+ el.css({ position: 'absolute', top: iniPos.top, left: iniPos.left });
+ }
+
+ //Opera fixing relative position
+ if ($.browser.opera && (/relative/).test(el.css('position')))
+ el.css({ position: 'relative', top: 'auto', left: 'auto' });
+
+ this._renderProxy();
+
+ var curleft = num(this.helper.css('left')), curtop = num(this.helper.css('top'));
+
+ if (o.containment) {
+ curleft += $(o.containment).scrollLeft() || 0;
+ curtop += $(o.containment).scrollTop() || 0;
+ }
+
+ //Store needed variables
+ this.offset = this.helper.offset();
+ this.position = { left: curleft, top: curtop };
+ this.size = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalSize = this._helper ? { width: el.outerWidth(), height: el.outerHeight() } : { width: el.width(), height: el.height() };
+ this.originalPosition = { left: curleft, top: curtop };
+ this.sizeDiff = { width: el.outerWidth() - el.width(), height: el.outerHeight() - el.height() };
+ this.originalMousePosition = { left: event.pageX, top: event.pageY };
+
+ //Aspect Ratio
+ this.aspectRatio = (typeof o.aspectRatio == 'number') ? o.aspectRatio : ((this.originalSize.width / this.originalSize.height) || 1);
+
+ var cursor = $('.ui-resizable-' + this.axis).css('cursor');
+ $('body').css('cursor', cursor == 'auto' ? this.axis + '-resize' : cursor);
+
+ el.addClass("ui-resizable-resizing");
+ this._propagate("start", event);
+ return true;
+ },
+
+ _mouseDrag: function(event) {
+
+ //Increase performance, avoid regex
+ var el = this.helper, o = this.options, props = {},
+ self = this, smp = this.originalMousePosition, a = this.axis;
+
+ var dx = (event.pageX-smp.left)||0, dy = (event.pageY-smp.top)||0;
+ var trigger = this._change[a];
+ if (!trigger) return false;
+
+ // Calculate the attrs that will be change
+ var data = trigger.apply(this, [event, dx, dy]), ie6 = $.browser.msie && $.browser.version < 7, csdif = this.sizeDiff;
+
+ if (this._aspectRatio || event.shiftKey)
+ data = this._updateRatio(data, event);
+
+ data = this._respectSize(data, event);
+
+ // plugins callbacks need to be called first
+ this._propagate("resize", event);
+
+ el.css({
+ top: this.position.top + "px", left: this.position.left + "px",
+ width: this.size.width + "px", height: this.size.height + "px"
+ });
+
+ if (!this._helper && this._proportionallyResizeElements.length)
+ this._proportionallyResize();
+
+ this._updateCache(data);
+
+ // calling the user callback at the end
+ this._trigger('resize', event, this.ui());
+
+ return false;
+ },
+
+ _mouseStop: function(event) {
+
+ this.resizing = false;
+ var o = this.options, self = this;
+
+ if(this._helper) {
+ var pr = this._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var s = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ if (!o.animate)
+ this.element.css($.extend(s, { top: top, left: left }));
+
+ self.helper.height(self.size.height);
+ self.helper.width(self.size.width);
+
+ if (this._helper && !o.animate) this._proportionallyResize();
+ }
+
+ $('body').css('cursor', 'auto');
+
+ this.element.removeClass("ui-resizable-resizing");
+
+ this._propagate("stop", event);
+
+ if (this._helper) this.helper.remove();
+ return false;
+
+ },
+
+ _updateCache: function(data) {
+ var o = this.options;
+ this.offset = this.helper.offset();
+ if (isNumber(data.left)) this.position.left = data.left;
+ if (isNumber(data.top)) this.position.top = data.top;
+ if (isNumber(data.height)) this.size.height = data.height;
+ if (isNumber(data.width)) this.size.width = data.width;
+ },
+
+ _updateRatio: function(data, event) {
+
+ var o = this.options, cpos = this.position, csize = this.size, a = this.axis;
+
+ if (data.height) data.width = (csize.height * this.aspectRatio);
+ else if (data.width) data.height = (csize.width / this.aspectRatio);
+
+ if (a == 'sw') {
+ data.left = cpos.left + (csize.width - data.width);
+ data.top = null;
+ }
+ if (a == 'nw') {
+ data.top = cpos.top + (csize.height - data.height);
+ data.left = cpos.left + (csize.width - data.width);
+ }
+
+ return data;
+ },
+
+ _respectSize: function(data, event) {
+
+ var el = this.helper, o = this.options, pRatio = this._aspectRatio || event.shiftKey, a = this.axis,
+ ismaxw = isNumber(data.width) && o.maxWidth && (o.maxWidth < data.width), ismaxh = isNumber(data.height) && o.maxHeight && (o.maxHeight < data.height),
+ isminw = isNumber(data.width) && o.minWidth && (o.minWidth > data.width), isminh = isNumber(data.height) && o.minHeight && (o.minHeight > data.height);
+
+ if (isminw) data.width = o.minWidth;
+ if (isminh) data.height = o.minHeight;
+ if (ismaxw) data.width = o.maxWidth;
+ if (ismaxh) data.height = o.maxHeight;
+
+ var dw = this.originalPosition.left + this.originalSize.width, dh = this.position.top + this.size.height;
+ var cw = /sw|nw|w/.test(a), ch = /nw|ne|n/.test(a);
+
+ if (isminw && cw) data.left = dw - o.minWidth;
+ if (ismaxw && cw) data.left = dw - o.maxWidth;
+ if (isminh && ch) data.top = dh - o.minHeight;
+ if (ismaxh && ch) data.top = dh - o.maxHeight;
+
+ // fixing jump error on top/left - bug #2330
+ var isNotwh = !data.width && !data.height;
+ if (isNotwh && !data.left && data.top) data.top = null;
+ else if (isNotwh && !data.top && data.left) data.left = null;
+
+ return data;
+ },
+
+ _proportionallyResize: function() {
+
+ var o = this.options;
+ if (!this._proportionallyResizeElements.length) return;
+ var element = this.helper || this.element;
+
+ for (var i=0; i < this._proportionallyResizeElements.length; i++) {
+
+ var prel = this._proportionallyResizeElements[i];
+
+ if (!this.borderDif) {
+ var b = [prel.css('borderTopWidth'), prel.css('borderRightWidth'), prel.css('borderBottomWidth'), prel.css('borderLeftWidth')],
+ p = [prel.css('paddingTop'), prel.css('paddingRight'), prel.css('paddingBottom'), prel.css('paddingLeft')];
+
+ this.borderDif = $.map(b, function(v, i) {
+ var border = parseInt(v,10)||0, padding = parseInt(p[i],10)||0;
+ return border + padding;
+ });
+ }
+
+ if ($.browser.msie && !(!($(element).is(':hidden') || $(element).parents(':hidden').length)))
+ continue;
+
+ prel.css({
+ height: (element.height() - this.borderDif[0] - this.borderDif[2]) || 0,
+ width: (element.width() - this.borderDif[1] - this.borderDif[3]) || 0
+ });
+
+ };
+
+ },
+
+ _renderProxy: function() {
+
+ var el = this.element, o = this.options;
+ this.elementOffset = el.offset();
+
+ if(this._helper) {
+
+ this.helper = this.helper || $('
');
+
+ // fix ie6 offset TODO: This seems broken
+ var ie6 = $.browser.msie && $.browser.version < 7, ie6offset = (ie6 ? 1 : 0),
+ pxyoffset = ( ie6 ? 2 : -1 );
+
+ this.helper.addClass(this._helper).css({
+ width: this.element.outerWidth() + pxyoffset,
+ height: this.element.outerHeight() + pxyoffset,
+ position: 'absolute',
+ left: this.elementOffset.left - ie6offset +'px',
+ top: this.elementOffset.top - ie6offset +'px',
+ zIndex: ++o.zIndex //TODO: Don't modify option
+ });
+
+ this.helper
+ .appendTo("body")
+ .disableSelection();
+
+ } else {
+ this.helper = this.element;
+ }
+
+ },
+
+ _change: {
+ e: function(event, dx, dy) {
+ return { width: this.originalSize.width + dx };
+ },
+ w: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { left: sp.left + dx, width: cs.width - dx };
+ },
+ n: function(event, dx, dy) {
+ var o = this.options, cs = this.originalSize, sp = this.originalPosition;
+ return { top: sp.top + dy, height: cs.height - dy };
+ },
+ s: function(event, dx, dy) {
+ return { height: this.originalSize.height + dy };
+ },
+ se: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ sw: function(event, dx, dy) {
+ return $.extend(this._change.s.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ },
+ ne: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.e.apply(this, [event, dx, dy]));
+ },
+ nw: function(event, dx, dy) {
+ return $.extend(this._change.n.apply(this, arguments), this._change.w.apply(this, [event, dx, dy]));
+ }
+ },
+
+ _propagate: function(n, event) {
+ $.ui.plugin.call(this, n, [event, this.ui()]);
+ (n != "resize" && this._trigger(n, event, this.ui()));
+ },
+
+ plugins: {},
+
+ ui: function() {
+ return {
+ originalElement: this.originalElement,
+ element: this.element,
+ helper: this.helper,
+ position: this.position,
+ size: this.size,
+ originalSize: this.originalSize,
+ originalPosition: this.originalPosition
+ };
+ }
+
+}));
+
+$.extend($.ui.resizable, {
+ version: "1.7.2",
+ eventPrefix: "resize",
+ defaults: {
+ alsoResize: false,
+ animate: false,
+ animateDuration: "slow",
+ animateEasing: "swing",
+ aspectRatio: false,
+ autoHide: false,
+ cancel: ":input,option",
+ containment: false,
+ delay: 0,
+ distance: 1,
+ ghost: false,
+ grid: false,
+ handles: "e,s,se",
+ helper: false,
+ maxHeight: null,
+ maxWidth: null,
+ minHeight: 10,
+ minWidth: 10,
+ zIndex: 1000
+ }
+});
+
+/*
+ * Resizable Extensions
+ */
+
+$.ui.plugin.add("resizable", "alsoResize", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options;
+
+ _store = function(exp) {
+ $(exp).each(function() {
+ $(this).data("resizable-alsoresize", {
+ width: parseInt($(this).width(), 10), height: parseInt($(this).height(), 10),
+ left: parseInt($(this).css('left'), 10), top: parseInt($(this).css('top'), 10)
+ });
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.parentNode) {
+ if (o.alsoResize.length) { o.alsoResize = o.alsoResize[0]; _store(o.alsoResize); }
+ else { $.each(o.alsoResize, function(exp, c) { _store(exp); }); }
+ }else{
+ _store(o.alsoResize);
+ }
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, os = self.originalSize, op = self.originalPosition;
+
+ var delta = {
+ height: (self.size.height - os.height) || 0, width: (self.size.width - os.width) || 0,
+ top: (self.position.top - op.top) || 0, left: (self.position.left - op.left) || 0
+ },
+
+ _alsoResize = function(exp, c) {
+ $(exp).each(function() {
+ var el = $(this), start = $(this).data("resizable-alsoresize"), style = {}, css = c && c.length ? c : ['width', 'height', 'top', 'left'];
+
+ $.each(css || ['width', 'height', 'top', 'left'], function(i, prop) {
+ var sum = (start[prop]||0) + (delta[prop]||0);
+ if (sum && sum >= 0)
+ style[prop] = sum || null;
+ });
+
+ //Opera fixing relative position
+ if (/relative/.test(el.css('position')) && $.browser.opera) {
+ self._revertToRelativePosition = true;
+ el.css({ position: 'absolute', top: 'auto', left: 'auto' });
+ }
+
+ el.css(style);
+ });
+ };
+
+ if (typeof(o.alsoResize) == 'object' && !o.alsoResize.nodeType) {
+ $.each(o.alsoResize, function(exp, c) { _alsoResize(exp, c); });
+ }else{
+ _alsoResize(o.alsoResize);
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable");
+
+ //Opera fixing relative position
+ if (self._revertToRelativePosition && $.browser.opera) {
+ self._revertToRelativePosition = false;
+ el.css({ position: 'relative' });
+ }
+
+ $(this).removeData("resizable-alsoresize-start");
+ }
+});
+
+$.ui.plugin.add("resizable", "animate", {
+
+ stop: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options;
+
+ var pr = self._proportionallyResizeElements, ista = pr.length && (/textarea/i).test(pr[0].nodeName),
+ soffseth = ista && $.ui.hasScroll(pr[0], 'left') /* TODO - jump height */ ? 0 : self.sizeDiff.height,
+ soffsetw = ista ? 0 : self.sizeDiff.width;
+
+ var style = { width: (self.size.width - soffsetw), height: (self.size.height - soffseth) },
+ left = (parseInt(self.element.css('left'), 10) + (self.position.left - self.originalPosition.left)) || null,
+ top = (parseInt(self.element.css('top'), 10) + (self.position.top - self.originalPosition.top)) || null;
+
+ self.element.animate(
+ $.extend(style, top && left ? { top: top, left: left } : {}), {
+ duration: o.animateDuration,
+ easing: o.animateEasing,
+ step: function() {
+
+ var data = {
+ width: parseInt(self.element.css('width'), 10),
+ height: parseInt(self.element.css('height'), 10),
+ top: parseInt(self.element.css('top'), 10),
+ left: parseInt(self.element.css('left'), 10)
+ };
+
+ if (pr && pr.length) $(pr[0]).css({ width: data.width, height: data.height });
+
+ // propagating resize, and updating values for each animation step
+ self._updateCache(data);
+ self._propagate("resize", event);
+
+ }
+ }
+ );
+ }
+
+});
+
+$.ui.plugin.add("resizable", "containment", {
+
+ start: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, el = self.element;
+ var oc = o.containment, ce = (oc instanceof $) ? oc.get(0) : (/parent/.test(oc)) ? el.parent().get(0) : oc;
+ if (!ce) return;
+
+ self.containerElement = $(ce);
+
+ if (/document/.test(oc) || oc == document) {
+ self.containerOffset = { left: 0, top: 0 };
+ self.containerPosition = { left: 0, top: 0 };
+
+ self.parentData = {
+ element: $(document), left: 0, top: 0,
+ width: $(document).width(), height: $(document).height() || document.body.parentNode.scrollHeight
+ };
+ }
+
+ // i'm a node, so compute top, left, right, bottom
+ else {
+ var element = $(ce), p = [];
+ $([ "Top", "Right", "Left", "Bottom" ]).each(function(i, name) { p[i] = num(element.css("padding" + name)); });
+
+ self.containerOffset = element.offset();
+ self.containerPosition = element.position();
+ self.containerSize = { height: (element.innerHeight() - p[3]), width: (element.innerWidth() - p[1]) };
+
+ var co = self.containerOffset, ch = self.containerSize.height, cw = self.containerSize.width,
+ width = ($.ui.hasScroll(ce, "left") ? ce.scrollWidth : cw ), height = ($.ui.hasScroll(ce) ? ce.scrollHeight : ch);
+
+ self.parentData = {
+ element: ce, left: co.left, top: co.top, width: width, height: height
+ };
+ }
+ },
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options,
+ ps = self.containerSize, co = self.containerOffset, cs = self.size, cp = self.position,
+ pRatio = self._aspectRatio || event.shiftKey, cop = { top:0, left:0 }, ce = self.containerElement;
+
+ if (ce[0] != document && (/static/).test(ce.css('position'))) cop = co;
+
+ if (cp.left < (self._helper ? co.left : 0)) {
+ self.size.width = self.size.width + (self._helper ? (self.position.left - co.left) : (self.position.left - cop.left));
+ if (pRatio) self.size.height = self.size.width / o.aspectRatio;
+ self.position.left = o.helper ? co.left : 0;
+ }
+
+ if (cp.top < (self._helper ? co.top : 0)) {
+ self.size.height = self.size.height + (self._helper ? (self.position.top - co.top) : self.position.top);
+ if (pRatio) self.size.width = self.size.height * o.aspectRatio;
+ self.position.top = self._helper ? co.top : 0;
+ }
+
+ self.offset.left = self.parentData.left+self.position.left;
+ self.offset.top = self.parentData.top+self.position.top;
+
+ var woset = Math.abs( (self._helper ? self.offset.left - cop.left : (self.offset.left - cop.left)) + self.sizeDiff.width ),
+ hoset = Math.abs( (self._helper ? self.offset.top - cop.top : (self.offset.top - co.top)) + self.sizeDiff.height );
+
+ var isParent = self.containerElement.get(0) == self.element.parent().get(0),
+ isOffsetRelative = /relative|absolute/.test(self.containerElement.css('position'));
+
+ if(isParent && isOffsetRelative) woset -= self.parentData.left;
+
+ if (woset + self.size.width >= self.parentData.width) {
+ self.size.width = self.parentData.width - woset;
+ if (pRatio) self.size.height = self.size.width / self.aspectRatio;
+ }
+
+ if (hoset + self.size.height >= self.parentData.height) {
+ self.size.height = self.parentData.height - hoset;
+ if (pRatio) self.size.width = self.size.height * self.aspectRatio;
+ }
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options, cp = self.position,
+ co = self.containerOffset, cop = self.containerPosition, ce = self.containerElement;
+
+ var helper = $(self.helper), ho = helper.offset(), w = helper.outerWidth() - self.sizeDiff.width, h = helper.outerHeight() - self.sizeDiff.height;
+
+ if (self._helper && !o.animate && (/relative/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ if (self._helper && !o.animate && (/static/).test(ce.css('position')))
+ $(this).css({ left: ho.left - cop.left - co.left, width: w, height: h });
+
+ }
+});
+
+$.ui.plugin.add("resizable", "ghost", {
+
+ start: function(event, ui) {
+
+ var self = $(this).data("resizable"), o = self.options, cs = self.size;
+
+ self.ghost = self.originalElement.clone();
+ self.ghost
+ .css({ opacity: .25, display: 'block', position: 'relative', height: cs.height, width: cs.width, margin: 0, left: 0, top: 0 })
+ .addClass('ui-resizable-ghost')
+ .addClass(typeof o.ghost == 'string' ? o.ghost : '');
+
+ self.ghost.appendTo(self.helper);
+
+ },
+
+ resize: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost) self.ghost.css({ position: 'relative', height: self.size.height, width: self.size.width });
+ },
+
+ stop: function(event, ui){
+ var self = $(this).data("resizable"), o = self.options;
+ if (self.ghost && self.helper) self.helper.get(0).removeChild(self.ghost.get(0));
+ }
+
+});
+
+$.ui.plugin.add("resizable", "grid", {
+
+ resize: function(event, ui) {
+ var self = $(this).data("resizable"), o = self.options, cs = self.size, os = self.originalSize, op = self.originalPosition, a = self.axis, ratio = o._aspectRatio || event.shiftKey;
+ o.grid = typeof o.grid == "number" ? [o.grid, o.grid] : o.grid;
+ var ox = Math.round((cs.width - os.width) / (o.grid[0]||1)) * (o.grid[0]||1), oy = Math.round((cs.height - os.height) / (o.grid[1]||1)) * (o.grid[1]||1);
+
+ if (/^(se|s|e)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ }
+ else if (/^(ne)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ }
+ else if (/^(sw)$/.test(a)) {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.left = op.left - ox;
+ }
+ else {
+ self.size.width = os.width + ox;
+ self.size.height = os.height + oy;
+ self.position.top = op.top - oy;
+ self.position.left = op.left - ox;
+ }
+ }
+
+});
+
+var num = function(v) {
+ return parseInt(v, 10) || 0;
+};
+
+var isNumber = function(value) {
+ return !isNaN(parseInt(value, 10));
+};
+
+})(jQuery);
diff --git a/src/main/templates/README b/src/main/templates/README
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/main/templates/README
diff --git a/src/main/templates/org/richfaces/htmlSchedule.jspx b/src/main/templates/org/richfaces/htmlSchedule.jspx
new file mode 100644
index 0000000..6406fb3
--- /dev/null
+++ b/src/main/templates/org/richfaces/htmlSchedule.jspx
@@ -0,0 +1,38 @@
+
+
+
+ /org/richfaces/renderkit/html/css/fullcalendar.css
+ org.ajax4jsf.javascript.AjaxScript,
+ /org/ajax4jsf/javascript/scripts/form.js,
+ /org/richfaces/renderkit/html/scripts/form.js,
+ /org/richfaces/renderkit/html/scripts/jquery/jquery.js,
+ /org/richfaces/renderkit/html/scripts/ui.core.js,
+ /org/richfaces/renderkit/html/scripts/ui.draggable.js,
+ /org/richfaces/renderkit/html/scripts/ui.resizable.js,
+ /org/richfaces/renderkit/html/scripts/fullcalendar.js,
+ /org/richfaces/renderkit/html/scripts/richfaces.schedule.js
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/test/java/org/richfaces/component/JSFComponentTest.java b/src/test/java/org/richfaces/component/JSFComponentTest.java
new file mode 100644
index 0000000..dbf5e49
--- /dev/null
+++ b/src/test/java/org/richfaces/component/JSFComponentTest.java
@@ -0,0 +1,120 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+package org.richfaces.component;
+
+import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.StringTokenizer;
+
+/**
+ * Unit test for simple Component.
+ */
+public class JSFComponentTest
+ extends AbstractAjax4JsfTestCase {
+ /**
+ * Create the test case
+ *
+ * @param testName name of the test case
+ */
+ public JSFComponentTest(String testName) {
+ super(testName);
+ }
+//TODO add test data for week and day
+
+ public void testDisplayedDaysForMonthViewCalculation() throws IOException {
+ doTestDisplayedDays("displayedDaysForMonthViewCalculationTestData", UISchedule.VIEW_MONTH);
+ }
+
+ public void testDisplayedDaysForWeekViewCalculation() throws IOException {
+ doTestDisplayedDays("displayedDaysForWeekViewCalculationTestData", UISchedule.VIEW_AGENDA_WEEK);
+ doTestDisplayedDays("displayedDaysForWeekViewCalculationTestData", UISchedule.VIEW_BASIC_WEEK);
+ }
+
+ public void testDisplayedDaysForDayViewCalculation() throws IOException {
+ doTestDisplayedDays("displayedDaysForDayViewCalculationTestData", UISchedule.VIEW_AGENDA_DAY);
+ doTestDisplayedDays("displayedDaysForDayViewCalculationTestData", UISchedule.VIEW_BASIC_DAY);
+ }
+
+ private void doTestDisplayedDays(String fileNameProperty, String view) throws IOException {
+ Calendar calendar = Calendar.getInstance();
+ UISchedule schedule = (UISchedule) application.createComponent(UISchedule.COMPONENT_TYPE);
+ Calendar expectedFirstDisplayedDay, expectedLastDisplayedDay;
+
+ final String fileName = System.getProperty(fileNameProperty);
+ System.out.println("filename:" + fileName);
+ BufferedReader reader = new BufferedReader(new FileReader(fileName));
+ String line;
+ int lineNr = 0;
+ int firstDay;
+ boolean showWeekends;
+ StringTokenizer tokenizer;
+ try {
+ while ((line = reader.readLine()) != null) {
+ lineNr++;
+ System.out.print("line " + lineNr + ": " + line);
+ try {
+ tokenizer = new StringTokenizer(line, ",");
+ firstDay = Integer.parseInt(tokenizer.nextToken());
+ showWeekends = Integer.parseInt(tokenizer.nextToken()) == 1;
+ calendar.set(Calendar.YEAR, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.MONTH, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.DATE, Integer.parseInt(tokenizer.nextToken()));
+ Date initialDate = calendar.getTime();
+ calendar.set(Calendar.YEAR, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.MONTH, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.DATE, Integer.parseInt(tokenizer.nextToken()));
+ expectedFirstDisplayedDay = (Calendar) calendar.clone();
+ calendar.set(Calendar.YEAR, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.MONTH, Integer.parseInt(tokenizer.nextToken()));
+ calendar.set(Calendar.DATE, Integer.parseInt(tokenizer.nextToken()));
+ expectedLastDisplayedDay = (Calendar) calendar.clone();
+ schedule.setShowWeekends(showWeekends);
+ schedule.setFirstDay(firstDay);
+ schedule.setDate(initialDate);
+ schedule.setView(view);
+ calendar.setTime(UISchedule.getFirstDisplayedDay(schedule));
+ System.out.print(" result: " + calendar.get(Calendar.YEAR) + "," + calendar.get(Calendar.MONTH) + "," + calendar.get(Calendar.DATE));
+ assert expectedFirstDisplayedDay.get(Calendar.YEAR) == calendar.get(Calendar.YEAR);
+ assert expectedFirstDisplayedDay.get(Calendar.MONTH) == calendar.get(Calendar.MONTH);
+ assert expectedFirstDisplayedDay.get(Calendar.DATE) == calendar.get(Calendar.DATE);
+ calendar.setTime(UISchedule.getLastDisplayedDate(schedule));
+ System.out.print("," + calendar.get(Calendar.YEAR) + "," + calendar.get(Calendar.MONTH) + "," + calendar.get(Calendar.DATE));
+ assert expectedLastDisplayedDay.get(Calendar.YEAR) == calendar.get(Calendar.YEAR);
+ assert expectedLastDisplayedDay.get(Calendar.MONTH) == calendar.get(Calendar.MONTH);
+ assert expectedLastDisplayedDay.get(Calendar.DATE) == calendar.get(Calendar.DATE);
+ } catch (Exception e) {
+ throw new RuntimeException("Exception during processing of line " + lineNr + " of test data. Line: " + line, e);
+ } finally {
+ System.out.println("");
+ }
+ }
+ } finally {
+ reader.close();
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/test/resources/README b/src/test/resources/README
new file mode 100644
index 0000000..f072dad
--- /dev/null
+++ b/src/test/resources/README
@@ -0,0 +1,47 @@
+Files named displayedDaysFor*CalculationTestData hold data for testing if UISchedule caluclates dates that javascript
+widget will need for initial date range.
+Here is the format:
+a,b,c,d,e,f,g,h,i,i,j,k
+where
+a - day of week from which week starts (1-sunday,2-monday,etc.)
+b - show weekends (1-true,0-false)
+c - initial date year
+d - initial date month
+e - initial date day
+f - expected start year
+g - expected start month
+h - expected start day
+i - expected end year
+j - expected end month
+k - expected end day
+
+displayedDaysForDayViewCalculationTestData is not fully ready yet
+displayedDaysForMonthViewCalculationTestData lacks expected end date !!!
+
+If anything in algorithm changes and test data will become invalid, they can be easily recreated by putting following
+code into UISchedule.getCalendarData method
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(startDate);
+// calendar.add(Calendar.DATE, 3); //for generating data for week view
+// calendar.add(Calendar.DATE, 9); //for generating data for month view
+ //for generating data for day view no incrementing is required
+ setDate(calendar.getTime());
+ final Date firstDisplayedDay = getFirstDisplayedDay(this);
+ Calendar firstDayCalendar = Calendar.getInstance();
+ firstDayCalendar.setTime(firstDisplayedDay);
+ Calendar startDateCalendar = Calendar.getInstance();
+ startDateCalendar.setTime(startDate);
+ Calendar endDateCalendar = Calendar.getInstance();
+ endDateCalendar.setTime(endDate);
+ Calendar lastDayCalendar = Calendar.getInstance();
+ lastDayCalendar.setTime(getLastDisplayedDate(this));
+ System.out.println("" + getFirstDay() + "," + (isShowWeekends(this) ? 1 : 0) +
+ "," + calendar.get(Calendar.YEAR) + "," + calendar.get(Calendar.MONTH) + "," + calendar.get(Calendar.DATE)
+ + "," + startDateCalendar.get(Calendar.YEAR) + "," + startDateCalendar.get(Calendar.MONTH) + "," + startDateCalendar.get(Calendar.DATE)
+ + "," + endDateCalendar.get(Calendar.YEAR) + "," + endDateCalendar.get(Calendar.MONTH) + "," + endDateCalendar.get(Calendar.DATE)
+// + "," + firstDayCalendar.get(Calendar.YEAR) + "," + firstDayCalendar.get(Calendar.MONTH) + "," + firstDayCalendar.get(Calendar.DATE)
+// + "," + lastDayCalendar.get(Calendar.YEAR) + "," + lastDayCalendar.get(Calendar.MONTH) + "," + lastDayCalendar.get(Calendar.DATE)
+ );
+
+Just remember to avoid blank lines, especially at the end of file.
\ No newline at end of file
diff --git a/src/test/resources/displayedDaysForDayViewCalculationTestData.txt b/src/test/resources/displayedDaysForDayViewCalculationTestData.txt
new file mode 100644
index 0000000..81a8594
--- /dev/null
+++ b/src/test/resources/displayedDaysForDayViewCalculationTestData.txt
@@ -0,0 +1,63 @@
+1,0,2010,0,1,2010,0,1,2010,0,2
+1,0,2010,0,4,2010,0,4,2010,0,5
+1,0,2010,0,5,2010,0,5,2010,0,6
+1,0,2010,0,6,2010,0,6,2010,0,7
+1,0,2010,0,7,2010,0,7,2010,0,8
+1,0,2010,0,8,2010,0,8,2010,0,9
+1,0,2010,0,11,2010,0,11,2010,0,12
+1,0,2010,0,12,2010,0,12,2010,0,13
+1,0,2010,0,13,2010,0,13,2010,0,14
+1,0,2010,0,14,2010,0,14,2010,0,15
+1,0,2010,0,15,2010,0,15,2010,0,16
+1,0,2010,0,18,2010,0,18,2010,0,19
+1,0,2010,0,19,2010,0,19,2010,0,20
+1,0,2010,0,20,2010,0,20,2010,0,21
+1,0,2010,0,21,2010,0,21,2010,0,22
+1,0,2010,0,22,2010,0,22,2010,0,23
+1,0,2010,0,25,2010,0,25,2010,0,26
+1,0,2010,0,26,2010,0,26,2010,0,27
+1,0,2010,0,27,2010,0,27,2010,0,28
+1,0,2010,0,28,2010,0,28,2010,0,29
+1,0,2010,0,29,2010,0,29,2010,0,30
+1,0,2010,1,1,2010,1,1,2010,1,2
+1,0,2010,1,2,2010,1,2,2010,1,3
+1,0,2010,1,3,2010,1,3,2010,1,4
+1,0,2010,1,4,2010,1,4,2010,1,5
+1,0,2010,1,5,2010,1,5,2010,1,6
+1,0,2010,1,8,2010,1,8,2010,1,9
+1,0,2010,1,9,2010,1,9,2010,1,10
+1,0,2010,1,10,2010,1,10,2010,1,11
+1,0,2010,1,11,2010,1,11,2010,1,12
+1,0,2010,1,12,2010,1,12,2010,1,13
+1,0,2010,1,15,2010,1,15,2010,1,16
+1,0,2010,1,16,2010,1,16,2010,1,17
+1,0,2010,1,17,2010,1,17,2010,1,18
+1,0,2010,1,18,2010,1,18,2010,1,19
+1,0,2010,1,19,2010,1,19,2010,1,20
+1,0,2010,1,22,2010,1,22,2010,1,23
+1,0,2010,1,23,2010,1,23,2010,1,24
+1,0,2010,1,24,2010,1,24,2010,1,25
+1,0,2010,1,25,2010,1,25,2010,1,26
+1,0,2010,1,26,2010,1,26,2010,1,27
+1,0,2010,2,1,2010,2,1,2010,2,2
+1,0,2010,2,2,2010,2,2,2010,2,3
+1,0,2010,2,3,2010,2,3,2010,2,4
+1,0,2010,2,4,2010,2,4,2010,2,5
+1,0,2010,2,5,2010,2,5,2010,2,6
+1,0,2010,2,8,2010,2,8,2010,2,9
+1,0,2010,2,9,2010,2,9,2010,2,10
+1,0,2010,2,10,2010,2,10,2010,2,11
+1,0,2010,2,11,2010,2,11,2010,2,12
+1,0,2010,2,12,2010,2,12,2010,2,13
+1,0,2010,2,15,2010,2,15,2010,2,16
+1,0,2010,2,16,2010,2,16,2010,2,17
+1,0,2010,2,17,2010,2,17,2010,2,18
+1,0,2010,2,18,2010,2,18,2010,2,19
+1,0,2010,2,19,2010,2,19,2010,2,20
+1,0,2010,2,22,2010,2,22,2010,2,23
+1,0,2010,2,23,2010,2,23,2010,2,24
+1,0,2010,2,24,2010,2,24,2010,2,25
+1,0,2010,2,25,2010,2,25,2010,2,26
+1,0,2010,2,26,2010,2,26,2010,2,27
+1,0,2010,2,29,2010,2,29,2010,2,30
+1,0,2010,2,30,2010,2,30,2010,2,31
\ No newline at end of file
diff --git a/src/test/resources/displayedDaysForMonthViewCalculationTestData.txt b/src/test/resources/displayedDaysForMonthViewCalculationTestData.txt
new file mode 100644
index 0000000..d4d8d6c
--- /dev/null
+++ b/src/test/resources/displayedDaysForMonthViewCalculationTestData.txt
@@ -0,0 +1,3547 @@
+1,0,2000,0,12,2000,0,3
+1,0,2000,1,9,2000,0,31
+1,0,2000,2,8,2000,1,28
+1,0,2000,3,12,2000,3,3
+1,0,2000,4,10,2000,4,1
+1,0,2000,5,7,2000,4,29
+1,0,2000,6,12,2000,6,3
+1,0,2000,7,9,2000,6,31
+1,0,2000,8,6,2000,7,28
+1,0,2000,9,11,2000,9,2
+1,0,2000,10,8,2000,9,30
+1,0,2000,11,6,2000,10,27
+1,0,2001,0,10,2001,0,1
+1,0,2001,1,7,2001,0,29
+1,0,2001,2,7,2001,1,26
+1,0,2001,3,11,2001,3,2
+1,0,2001,4,9,2001,3,30
+1,0,2001,5,6,2001,4,28
+1,0,2001,6,11,2001,6,2
+1,0,2001,7,8,2001,6,30
+1,0,2001,8,12,2001,8,3
+1,0,2001,9,10,2001,9,1
+1,0,2001,10,7,2001,9,29
+1,0,2001,11,12,2001,11,3
+1,0,2002,0,9,2001,11,31
+1,0,2002,1,6,2002,0,28
+1,0,2002,2,6,2002,1,25
+1,0,2002,3,10,2002,3,1
+1,0,2002,4,8,2002,3,29
+1,0,2002,5,12,2002,5,3
+1,0,2002,6,10,2002,6,1
+1,0,2002,7,7,2002,6,29
+1,0,2002,8,11,2002,8,2
+1,0,2002,9,9,2002,8,30
+1,0,2002,10,6,2002,9,28
+1,0,2002,11,11,2002,11,2
+1,0,2003,0,8,2002,11,30
+1,0,2003,1,12,2003,1,3
+1,0,2003,2,12,2003,2,3
+1,0,2003,3,9,2003,2,31
+1,0,2003,4,7,2003,3,28
+1,0,2003,5,11,2003,5,2
+1,0,2003,6,9,2003,5,30
+1,0,2003,7,6,2003,6,28
+1,0,2003,8,10,2003,8,1
+1,0,2003,9,8,2003,8,29
+1,0,2003,10,12,2003,10,3
+1,0,2003,11,10,2003,11,1
+1,0,2004,0,7,2003,11,29
+1,0,2004,1,11,2004,1,2
+1,0,2004,2,10,2004,2,1
+1,0,2004,3,7,2004,2,29
+1,0,2004,4,12,2004,4,3
+1,0,2004,5,9,2004,4,31
+1,0,2004,6,7,2004,5,28
+1,0,2004,7,11,2004,7,2
+1,0,2004,8,8,2004,7,30
+1,0,2004,9,6,2004,8,27
+1,0,2004,10,10,2004,10,1
+1,0,2004,11,8,2004,10,29
+1,0,2005,0,12,2005,0,3
+1,0,2005,1,9,2005,0,31
+1,0,2005,2,9,2005,1,28
+1,0,2005,3,6,2005,2,28
+1,0,2005,4,11,2005,4,2
+1,0,2005,5,8,2005,4,30
+1,0,2005,6,6,2005,5,27
+1,0,2005,7,10,2005,7,1
+1,0,2005,8,7,2005,7,29
+1,0,2005,9,12,2005,9,3
+1,0,2005,10,9,2005,9,31
+1,0,2005,11,7,2005,10,28
+1,0,2006,0,11,2006,0,2
+1,0,2006,1,8,2006,0,30
+1,0,2006,2,8,2006,1,27
+1,0,2006,3,12,2006,3,3
+1,0,2006,4,10,2006,4,1
+1,0,2006,5,7,2006,4,29
+1,0,2006,6,12,2006,6,3
+1,0,2006,7,9,2006,6,31
+1,0,2006,8,6,2006,7,28
+1,0,2006,9,11,2006,9,2
+1,0,2006,10,8,2006,9,30
+1,0,2006,11,6,2006,10,27
+1,0,2007,0,10,2007,0,1
+1,0,2007,1,7,2007,0,29
+1,0,2007,2,7,2007,1,26
+1,0,2007,3,11,2007,3,2
+1,0,2007,4,9,2007,3,30
+1,0,2007,5,6,2007,4,28
+1,0,2007,6,11,2007,6,2
+1,0,2007,7,8,2007,6,30
+1,0,2007,8,12,2007,8,3
+1,0,2007,9,10,2007,9,1
+1,0,2007,10,7,2007,9,29
+1,0,2007,11,12,2007,11,3
+1,0,2008,0,9,2007,11,31
+1,0,2008,1,6,2008,0,28
+1,0,2008,2,12,2008,2,3
+1,0,2008,3,9,2008,2,31
+1,0,2008,4,7,2008,3,28
+1,0,2008,5,11,2008,5,2
+1,0,2008,6,9,2008,5,30
+1,0,2008,7,6,2008,6,28
+1,0,2008,8,10,2008,8,1
+1,0,2008,9,8,2008,8,29
+1,0,2008,10,12,2008,10,3
+1,0,2008,11,10,2008,11,1
+1,0,2009,0,7,2008,11,29
+1,0,2009,1,11,2009,1,2
+1,0,2009,2,11,2009,2,2
+1,0,2009,3,8,2009,2,30
+1,0,2009,4,6,2009,3,27
+1,0,2009,5,10,2009,5,1
+1,0,2009,6,8,2009,5,29
+1,0,2009,7,12,2009,7,3
+1,0,2009,8,9,2009,7,31
+1,0,2009,9,7,2009,8,28
+1,0,2009,10,11,2009,10,2
+1,0,2009,11,9,2009,10,30
+1,0,2010,0,6,2009,11,28
+1,0,2010,1,10,2010,1,1
+1,0,2010,2,10,2010,2,1
+1,0,2010,3,7,2010,2,29
+1,0,2010,4,12,2010,4,3
+1,0,2010,5,9,2010,4,31
+1,0,2010,6,7,2010,5,28
+1,0,2010,7,11,2010,7,2
+1,0,2010,8,8,2010,7,30
+1,0,2010,9,6,2010,8,27
+1,0,2010,10,10,2010,10,1
+1,0,2010,11,8,2010,10,29
+1,0,2011,0,12,2011,0,3
+1,0,2011,1,9,2011,0,31
+1,0,2011,2,9,2011,1,28
+1,0,2011,3,6,2011,2,28
+1,0,2011,4,11,2011,4,2
+1,0,2011,5,8,2011,4,30
+1,0,2011,6,6,2011,5,27
+1,0,2011,7,10,2011,7,1
+1,0,2011,8,7,2011,7,29
+1,0,2011,9,12,2011,9,3
+1,0,2011,10,9,2011,9,31
+1,0,2011,11,7,2011,10,28
+1,0,2012,0,11,2012,0,2
+1,0,2012,1,8,2012,0,30
+1,0,2012,2,7,2012,1,27
+1,0,2012,3,11,2012,3,2
+1,0,2012,4,9,2012,3,30
+1,0,2012,5,6,2012,4,28
+1,0,2012,6,11,2012,6,2
+1,0,2012,7,8,2012,6,30
+1,0,2012,8,12,2012,8,3
+1,0,2012,9,10,2012,9,1
+1,0,2012,10,7,2012,9,29
+1,0,2012,11,12,2012,11,3
+1,0,2013,0,9,2012,11,31
+1,0,2013,1,6,2013,0,28
+1,0,2013,2,6,2013,1,25
+1,0,2013,3,10,2013,3,1
+1,0,2013,4,8,2013,3,29
+1,0,2013,5,12,2013,5,3
+1,0,2013,6,10,2013,6,1
+1,0,2013,7,7,2013,6,29
+1,0,2013,8,11,2013,8,2
+1,0,2013,9,9,2013,8,30
+1,0,2013,10,6,2013,9,28
+1,0,2013,11,11,2013,11,2
+1,0,2014,0,8,2013,11,30
+1,0,2014,1,12,2014,1,3
+1,0,2014,2,12,2014,2,3
+1,0,2014,3,9,2014,2,31
+1,0,2014,4,7,2014,3,28
+1,0,2014,5,11,2014,5,2
+1,0,2014,6,9,2014,5,30
+1,0,2014,7,6,2014,6,28
+1,0,2014,8,10,2014,8,1
+1,0,2014,9,8,2014,8,29
+1,0,2014,10,12,2014,10,3
+1,0,2014,11,10,2014,11,1
+1,0,2015,0,7,2014,11,29
+1,0,2015,1,11,2015,1,2
+1,0,2015,2,11,2015,2,2
+1,0,2015,3,8,2015,2,30
+1,0,2015,4,6,2015,3,27
+1,0,2015,5,10,2015,5,1
+1,0,2015,6,8,2015,5,29
+1,0,2015,7,12,2015,7,3
+1,0,2015,8,9,2015,7,31
+1,0,2015,9,7,2015,8,28
+1,0,2015,10,11,2015,10,2
+1,0,2015,11,9,2015,10,30
+1,0,2016,0,6,2015,11,28
+1,0,2016,1,10,2016,1,1
+1,0,2016,2,9,2016,1,29
+1,0,2016,3,6,2016,2,28
+1,0,2016,4,11,2016,4,2
+1,0,2016,5,8,2016,4,30
+1,0,2016,6,6,2016,5,27
+1,0,2016,7,10,2016,7,1
+1,0,2016,8,7,2016,7,29
+1,0,2016,9,12,2016,9,3
+1,0,2016,10,9,2016,9,31
+1,0,2016,11,7,2016,10,28
+1,0,2017,0,11,2017,0,2
+1,0,2017,1,8,2017,0,30
+1,0,2017,2,8,2017,1,27
+1,0,2017,3,12,2017,3,3
+1,0,2017,4,10,2017,4,1
+1,0,2017,5,7,2017,4,29
+1,0,2017,6,12,2017,6,3
+1,0,2017,7,9,2017,6,31
+1,0,2017,8,6,2017,7,28
+1,0,2017,9,11,2017,9,2
+1,0,2017,10,8,2017,9,30
+1,0,2017,11,6,2017,10,27
+1,0,2018,0,10,2018,0,1
+1,0,2018,1,7,2018,0,29
+1,0,2018,2,7,2018,1,26
+1,0,2018,3,11,2018,3,2
+1,0,2018,4,9,2018,3,30
+1,0,2018,5,6,2018,4,28
+1,0,2018,6,11,2018,6,2
+1,0,2018,7,8,2018,6,30
+1,0,2018,8,12,2018,8,3
+1,0,2018,9,10,2018,9,1
+1,0,2018,10,7,2018,9,29
+1,0,2018,11,12,2018,11,3
+1,0,2019,0,9,2018,11,31
+1,0,2019,1,6,2019,0,28
+1,0,2019,2,6,2019,1,25
+1,0,2019,3,10,2019,3,1
+1,0,2019,4,8,2019,3,29
+1,0,2019,5,12,2019,5,3
+1,0,2019,6,10,2019,6,1
+1,0,2019,7,7,2019,6,29
+1,0,2019,8,11,2019,8,2
+1,0,2019,9,9,2019,8,30
+1,0,2019,10,6,2019,9,28
+1,0,2019,11,11,2019,11,2
+1,0,2020,0,8,2019,11,30
+1,0,2020,1,12,2020,1,3
+1,0,2020,2,11,2020,2,2
+1,0,2020,3,8,2020,2,30
+1,0,2020,4,6,2020,3,27
+1,0,2020,5,10,2020,5,1
+1,0,2020,6,8,2020,5,29
+1,0,2020,7,12,2020,7,3
+1,0,2020,8,9,2020,7,31
+1,0,2020,9,7,2020,8,28
+1,0,2020,10,11,2020,10,2
+1,0,2020,11,9,2020,10,30
+2,0,2020,11,9,2020,10,30
+2,0,2000,0,12,2000,0,3
+2,0,2000,0,12,2000,0,3
+2,0,2000,1,9,2000,0,31
+2,0,2000,2,8,2000,1,28
+2,0,2000,3,12,2000,3,3
+2,0,2000,4,10,2000,4,1
+2,0,2000,5,7,2000,4,29
+2,0,2000,6,12,2000,6,3
+2,0,2000,7,9,2000,6,31
+2,0,2000,8,6,2000,7,28
+2,0,2000,9,11,2000,9,2
+2,0,2000,10,8,2000,9,30
+2,0,2000,11,6,2000,10,27
+2,0,2001,0,10,2001,0,1
+2,0,2001,1,7,2001,0,29
+2,0,2001,2,7,2001,1,26
+2,0,2001,3,11,2001,3,2
+2,0,2001,4,9,2001,3,30
+2,0,2001,5,6,2001,4,28
+2,0,2001,6,11,2001,6,2
+2,0,2001,7,8,2001,6,30
+2,0,2001,8,12,2001,8,3
+2,0,2001,9,10,2001,9,1
+2,0,2001,10,7,2001,9,29
+2,0,2001,11,12,2001,11,3
+2,0,2002,0,9,2001,11,31
+2,0,2002,1,6,2002,0,28
+2,0,2002,2,6,2002,1,25
+2,0,2002,3,10,2002,3,1
+2,0,2002,4,8,2002,3,29
+2,0,2002,5,12,2002,5,3
+2,0,2002,6,10,2002,6,1
+2,0,2002,7,7,2002,6,29
+2,0,2002,8,11,2002,8,2
+2,0,2002,9,9,2002,8,30
+2,0,2002,10,6,2002,9,28
+2,0,2002,11,11,2002,11,2
+2,0,2003,0,8,2002,11,30
+2,0,2003,1,12,2003,1,3
+2,0,2003,2,12,2003,2,3
+2,0,2003,3,9,2003,2,31
+2,0,2003,4,7,2003,3,28
+2,0,2003,5,11,2003,5,2
+2,0,2003,6,9,2003,5,30
+2,0,2003,7,6,2003,6,28
+2,0,2003,8,10,2003,8,1
+2,0,2003,9,8,2003,8,29
+2,0,2003,10,12,2003,10,3
+2,0,2003,11,10,2003,11,1
+2,0,2004,0,7,2003,11,29
+2,0,2004,1,11,2004,1,2
+2,0,2004,2,10,2004,2,1
+2,0,2004,3,7,2004,2,29
+2,0,2004,4,12,2004,4,3
+2,0,2004,5,9,2004,4,31
+2,0,2004,6,7,2004,5,28
+2,0,2004,7,11,2004,7,2
+2,0,2004,8,8,2004,7,30
+2,0,2004,9,6,2004,8,27
+2,0,2004,10,10,2004,10,1
+2,0,2004,11,8,2004,10,29
+2,0,2005,0,12,2005,0,3
+2,0,2005,1,9,2005,0,31
+2,0,2005,2,9,2005,1,28
+2,0,2005,3,6,2005,2,28
+2,0,2005,4,11,2005,4,2
+2,0,2005,5,8,2005,4,30
+2,0,2005,6,6,2005,5,27
+2,0,2005,7,10,2005,7,1
+2,0,2005,8,7,2005,7,29
+2,0,2005,9,12,2005,9,3
+2,0,2005,10,9,2005,9,31
+2,0,2005,11,7,2005,10,28
+2,0,2006,0,11,2006,0,2
+2,0,2006,1,8,2006,0,30
+2,0,2006,2,8,2006,1,27
+2,0,2006,3,12,2006,3,3
+2,0,2006,4,10,2006,4,1
+2,0,2006,5,7,2006,4,29
+2,0,2006,6,12,2006,6,3
+2,0,2006,7,9,2006,6,31
+2,0,2006,8,6,2006,7,28
+2,0,2006,9,11,2006,9,2
+2,0,2006,10,8,2006,9,30
+2,0,2006,11,6,2006,10,27
+2,0,2007,0,10,2007,0,1
+2,0,2007,1,7,2007,0,29
+2,0,2007,2,7,2007,1,26
+2,0,2007,3,11,2007,3,2
+2,0,2007,4,9,2007,3,30
+2,0,2007,5,6,2007,4,28
+2,0,2007,6,11,2007,6,2
+2,0,2007,7,8,2007,6,30
+2,0,2007,8,12,2007,8,3
+2,0,2007,9,10,2007,9,1
+2,0,2007,10,7,2007,9,29
+2,0,2007,11,12,2007,11,3
+2,0,2008,0,9,2007,11,31
+2,0,2008,1,6,2008,0,28
+2,0,2008,2,12,2008,2,3
+2,0,2008,3,9,2008,2,31
+2,0,2008,4,7,2008,3,28
+2,0,2008,5,11,2008,5,2
+2,0,2008,6,9,2008,5,30
+2,0,2008,7,6,2008,6,28
+2,0,2008,8,10,2008,8,1
+2,0,2008,9,8,2008,8,29
+2,0,2008,10,12,2008,10,3
+2,0,2008,11,10,2008,11,1
+2,0,2009,0,7,2008,11,29
+2,0,2009,1,11,2009,1,2
+2,0,2009,2,11,2009,2,2
+2,0,2009,3,8,2009,2,30
+2,0,2009,4,6,2009,3,27
+2,0,2009,5,10,2009,5,1
+2,0,2009,6,8,2009,5,29
+2,0,2009,7,12,2009,7,3
+2,0,2009,8,9,2009,7,31
+2,0,2009,9,7,2009,8,28
+2,0,2009,10,11,2009,10,2
+2,0,2009,11,9,2009,10,30
+2,0,2010,0,6,2009,11,28
+2,0,2010,1,10,2010,1,1
+2,0,2010,2,10,2010,2,1
+2,0,2010,3,7,2010,2,29
+2,0,2010,4,12,2010,4,3
+2,0,2010,5,9,2010,4,31
+2,0,2010,6,7,2010,5,28
+2,0,2010,7,11,2010,7,2
+2,0,2010,8,8,2010,7,30
+2,0,2010,9,6,2010,8,27
+2,0,2010,10,10,2010,10,1
+2,0,2010,11,8,2010,10,29
+2,0,2011,0,12,2011,0,3
+2,0,2011,1,9,2011,0,31
+2,0,2011,2,9,2011,1,28
+2,0,2011,3,6,2011,2,28
+2,0,2011,4,11,2011,4,2
+2,0,2011,5,8,2011,4,30
+2,0,2011,6,6,2011,5,27
+2,0,2011,7,10,2011,7,1
+2,0,2011,8,7,2011,7,29
+2,0,2011,9,12,2011,9,3
+2,0,2011,10,9,2011,9,31
+2,0,2011,11,7,2011,10,28
+2,0,2012,0,11,2012,0,2
+2,0,2012,1,8,2012,0,30
+2,0,2012,2,7,2012,1,27
+2,0,2012,3,11,2012,3,2
+2,0,2012,4,9,2012,3,30
+2,0,2012,5,6,2012,4,28
+2,0,2012,6,11,2012,6,2
+2,0,2012,7,8,2012,6,30
+2,0,2012,8,12,2012,8,3
+2,0,2012,9,10,2012,9,1
+2,0,2012,10,7,2012,9,29
+2,0,2012,11,12,2012,11,3
+2,0,2013,0,9,2012,11,31
+2,0,2013,1,6,2013,0,28
+2,0,2013,2,6,2013,1,25
+2,0,2013,3,10,2013,3,1
+2,0,2013,4,8,2013,3,29
+2,0,2013,5,12,2013,5,3
+2,0,2013,6,10,2013,6,1
+2,0,2013,7,7,2013,6,29
+2,0,2013,8,11,2013,8,2
+2,0,2013,9,9,2013,8,30
+2,0,2013,10,6,2013,9,28
+2,0,2013,11,11,2013,11,2
+2,0,2014,0,8,2013,11,30
+2,0,2014,1,12,2014,1,3
+2,0,2014,2,12,2014,2,3
+2,0,2014,3,9,2014,2,31
+2,0,2014,4,7,2014,3,28
+2,0,2014,5,11,2014,5,2
+2,0,2014,6,9,2014,5,30
+2,0,2014,7,6,2014,6,28
+2,0,2014,8,10,2014,8,1
+2,0,2014,9,8,2014,8,29
+2,0,2014,10,12,2014,10,3
+2,0,2014,11,10,2014,11,1
+2,0,2015,0,7,2014,11,29
+2,0,2015,1,11,2015,1,2
+2,0,2015,2,11,2015,2,2
+2,0,2015,3,8,2015,2,30
+2,0,2015,4,6,2015,3,27
+2,0,2015,5,10,2015,5,1
+2,0,2015,6,8,2015,5,29
+2,0,2015,7,12,2015,7,3
+2,0,2015,8,9,2015,7,31
+2,0,2015,9,7,2015,8,28
+2,0,2015,10,11,2015,10,2
+2,0,2015,11,9,2015,10,30
+2,0,2016,0,6,2015,11,28
+2,0,2016,1,10,2016,1,1
+2,0,2016,2,9,2016,1,29
+2,0,2016,3,6,2016,2,28
+2,0,2016,4,11,2016,4,2
+2,0,2016,5,8,2016,4,30
+2,0,2016,6,6,2016,5,27
+2,0,2016,7,10,2016,7,1
+2,0,2016,8,7,2016,7,29
+2,0,2016,9,12,2016,9,3
+2,0,2016,10,9,2016,9,31
+2,0,2016,11,7,2016,10,28
+2,0,2017,0,11,2017,0,2
+2,0,2017,1,8,2017,0,30
+2,0,2017,2,8,2017,1,27
+2,0,2017,3,12,2017,3,3
+2,0,2017,4,10,2017,4,1
+2,0,2017,5,7,2017,4,29
+2,0,2017,6,12,2017,6,3
+2,0,2017,7,9,2017,6,31
+2,0,2017,8,6,2017,7,28
+2,0,2017,9,11,2017,9,2
+2,0,2017,10,8,2017,9,30
+2,0,2017,11,6,2017,10,27
+2,0,2018,0,10,2018,0,1
+2,0,2018,1,7,2018,0,29
+2,0,2018,2,7,2018,1,26
+2,0,2018,3,11,2018,3,2
+2,0,2018,4,9,2018,3,30
+2,0,2018,5,6,2018,4,28
+2,0,2018,6,11,2018,6,2
+2,0,2018,7,8,2018,6,30
+2,0,2018,8,12,2018,8,3
+2,0,2018,9,10,2018,9,1
+2,0,2018,10,7,2018,9,29
+2,0,2018,11,12,2018,11,3
+2,0,2019,0,9,2018,11,31
+2,0,2019,1,6,2019,0,28
+2,0,2019,2,6,2019,1,25
+2,0,2019,3,10,2019,3,1
+2,0,2019,4,8,2019,3,29
+2,0,2019,5,12,2019,5,3
+2,0,2019,6,10,2019,6,1
+2,0,2019,7,7,2019,6,29
+2,0,2019,8,11,2019,8,2
+2,0,2019,9,9,2019,8,30
+2,0,2019,10,6,2019,9,28
+2,0,2019,11,11,2019,11,2
+2,0,2020,0,8,2019,11,30
+2,0,2020,1,12,2020,1,3
+2,0,2020,2,11,2020,2,2
+2,0,2020,3,8,2020,2,30
+2,0,2020,4,6,2020,3,27
+2,0,2020,5,10,2020,5,1
+2,0,2020,6,8,2020,5,29
+2,0,2020,7,12,2020,7,3
+2,0,2020,8,9,2020,7,31
+2,0,2020,9,7,2020,8,28
+2,0,2020,10,11,2020,10,2
+2,0,2020,11,9,2020,10,30
+3,0,2020,11,10,2020,11,1
+3,0,2000,0,6,1999,11,28
+3,0,2000,1,10,2000,1,1
+3,0,2000,2,9,2000,1,29
+3,0,2000,3,6,2000,2,28
+3,0,2000,4,4,2000,3,25
+3,0,2000,5,8,2000,4,30
+3,0,2000,6,6,2000,5,27
+3,0,2000,7,10,2000,7,1
+3,0,2000,8,7,2000,7,29
+3,0,2000,9,5,2000,8,26
+3,0,2000,10,9,2000,9,31
+3,0,2000,11,7,2000,10,28
+3,0,2001,0,4,2000,11,26
+3,0,2001,1,8,2001,0,30
+3,0,2001,2,8,2001,1,27
+3,0,2001,3,5,2001,2,27
+3,0,2001,4,10,2001,4,1
+3,0,2001,5,7,2001,4,29
+3,0,2001,6,5,2001,5,26
+3,0,2001,7,9,2001,6,31
+3,0,2001,8,6,2001,7,28
+3,0,2001,9,4,2001,8,25
+3,0,2001,10,8,2001,9,30
+3,0,2001,11,6,2001,10,27
+3,0,2002,0,10,2002,0,1
+3,0,2002,1,7,2002,0,29
+3,0,2002,2,7,2002,1,26
+3,0,2002,3,4,2002,2,26
+3,0,2002,4,9,2002,3,30
+3,0,2002,5,6,2002,4,28
+3,0,2002,6,4,2002,5,25
+3,0,2002,7,8,2002,6,30
+3,0,2002,8,5,2002,7,27
+3,0,2002,9,10,2002,9,1
+3,0,2002,10,7,2002,9,29
+3,0,2002,11,5,2002,10,26
+3,0,2003,0,9,2002,11,31
+3,0,2003,1,6,2003,0,28
+3,0,2003,2,6,2003,1,25
+3,0,2003,3,10,2003,3,1
+3,0,2003,4,8,2003,3,29
+3,0,2003,5,5,2003,4,27
+3,0,2003,6,10,2003,6,1
+3,0,2003,7,7,2003,6,29
+3,0,2003,8,4,2003,7,26
+3,0,2003,9,9,2003,8,30
+3,0,2003,10,6,2003,9,28
+3,0,2003,11,4,2003,10,25
+3,0,2004,0,8,2003,11,30
+3,0,2004,1,5,2004,0,27
+3,0,2004,2,4,2004,1,24
+3,0,2004,3,8,2004,2,30
+3,0,2004,4,6,2004,3,27
+3,0,2004,5,10,2004,5,1
+3,0,2004,6,8,2004,5,29
+3,0,2004,7,5,2004,6,27
+3,0,2004,8,9,2004,7,31
+3,0,2004,9,7,2004,8,28
+3,0,2004,10,4,2004,9,26
+3,0,2004,11,9,2004,10,30
+3,0,2005,0,6,2004,11,28
+3,0,2005,1,10,2005,1,1
+3,0,2005,2,10,2005,2,1
+3,0,2005,3,7,2005,2,29
+3,0,2005,4,5,2005,3,26
+3,0,2005,5,9,2005,4,31
+3,0,2005,6,7,2005,5,28
+3,0,2005,7,4,2005,6,26
+3,0,2005,8,8,2005,7,30
+3,0,2005,9,6,2005,8,27
+3,0,2005,10,10,2005,10,1
+3,0,2005,11,8,2005,10,29
+3,0,2006,0,5,2005,11,27
+3,0,2006,1,9,2006,0,31
+3,0,2006,2,9,2006,1,28
+3,0,2006,3,6,2006,2,28
+3,0,2006,4,4,2006,3,25
+3,0,2006,5,8,2006,4,30
+3,0,2006,6,6,2006,5,27
+3,0,2006,7,10,2006,7,1
+3,0,2006,8,7,2006,7,29
+3,0,2006,9,5,2006,8,26
+3,0,2006,10,9,2006,9,31
+3,0,2006,11,7,2006,10,28
+3,0,2007,0,4,2006,11,26
+3,0,2007,1,8,2007,0,30
+3,0,2007,2,8,2007,1,27
+3,0,2007,3,5,2007,2,27
+3,0,2007,4,10,2007,4,1
+3,0,2007,5,7,2007,4,29
+3,0,2007,6,5,2007,5,26
+3,0,2007,7,9,2007,6,31
+3,0,2007,8,6,2007,7,28
+3,0,2007,9,4,2007,8,25
+3,0,2007,10,8,2007,9,30
+3,0,2007,11,6,2007,10,27
+3,0,2008,0,10,2008,0,1
+3,0,2008,1,7,2008,0,29
+3,0,2008,2,6,2008,1,26
+3,0,2008,3,10,2008,3,1
+3,0,2008,4,8,2008,3,29
+3,0,2008,5,5,2008,4,27
+3,0,2008,6,10,2008,6,1
+3,0,2008,7,7,2008,6,29
+3,0,2008,8,4,2008,7,26
+3,0,2008,9,9,2008,8,30
+3,0,2008,10,6,2008,9,28
+3,0,2008,11,4,2008,10,25
+3,0,2009,0,8,2008,11,30
+3,0,2009,1,5,2009,0,27
+3,0,2009,2,5,2009,1,24
+3,0,2009,3,9,2009,2,31
+3,0,2009,4,7,2009,3,28
+3,0,2009,5,4,2009,4,26
+3,0,2009,6,9,2009,5,30
+3,0,2009,7,6,2009,6,28
+3,0,2009,8,10,2009,8,1
+3,0,2009,9,8,2009,8,29
+3,0,2009,10,5,2009,9,27
+3,0,2009,11,10,2009,11,1
+3,0,2010,0,7,2009,11,29
+3,0,2010,1,4,2010,0,26
+3,0,2010,2,4,2010,1,23
+3,0,2010,3,8,2010,2,30
+3,0,2010,4,6,2010,3,27
+3,0,2010,5,10,2010,5,1
+3,0,2010,6,8,2010,5,29
+3,0,2010,7,5,2010,6,27
+3,0,2010,8,9,2010,7,31
+3,0,2010,9,7,2010,8,28
+3,0,2010,10,4,2010,9,26
+3,0,2010,11,9,2010,10,30
+3,0,2011,0,6,2010,11,28
+3,0,2011,1,10,2011,1,1
+3,0,2011,2,10,2011,2,1
+3,0,2011,3,7,2011,2,29
+3,0,2011,4,5,2011,3,26
+3,0,2011,5,9,2011,4,31
+3,0,2011,6,7,2011,5,28
+3,0,2011,7,4,2011,6,26
+3,0,2011,8,8,2011,7,30
+3,0,2011,9,6,2011,8,27
+3,0,2011,10,10,2011,10,1
+3,0,2011,11,8,2011,10,29
+3,0,2012,0,5,2011,11,27
+3,0,2012,1,9,2012,0,31
+3,0,2012,2,8,2012,1,28
+3,0,2012,3,5,2012,2,27
+3,0,2012,4,10,2012,4,1
+3,0,2012,5,7,2012,4,29
+3,0,2012,6,5,2012,5,26
+3,0,2012,7,9,2012,6,31
+3,0,2012,8,6,2012,7,28
+3,0,2012,9,4,2012,8,25
+3,0,2012,10,8,2012,9,30
+3,0,2012,11,6,2012,10,27
+3,0,2013,0,10,2013,0,1
+3,0,2013,1,7,2013,0,29
+3,0,2013,2,7,2013,1,26
+3,0,2013,3,4,2013,2,26
+3,0,2013,4,9,2013,3,30
+3,0,2013,5,6,2013,4,28
+3,0,2013,6,4,2013,5,25
+3,0,2013,7,8,2013,6,30
+3,0,2013,8,5,2013,7,27
+3,0,2013,9,10,2013,9,1
+3,0,2013,10,7,2013,9,29
+3,0,2013,11,5,2013,10,26
+3,0,2014,0,9,2013,11,31
+3,0,2014,1,6,2014,0,28
+3,0,2014,2,6,2014,1,25
+3,0,2014,3,10,2014,3,1
+3,0,2014,4,8,2014,3,29
+3,0,2014,5,5,2014,4,27
+3,0,2014,6,10,2014,6,1
+3,0,2014,7,7,2014,6,29
+3,0,2014,8,4,2014,7,26
+3,0,2014,9,9,2014,8,30
+3,0,2014,10,6,2014,9,28
+3,0,2014,11,4,2014,10,25
+3,0,2015,0,8,2014,11,30
+3,0,2015,1,5,2015,0,27
+3,0,2015,2,5,2015,1,24
+3,0,2015,3,9,2015,2,31
+3,0,2015,4,7,2015,3,28
+3,0,2015,5,4,2015,4,26
+3,0,2015,6,9,2015,5,30
+3,0,2015,7,6,2015,6,28
+3,0,2015,8,10,2015,8,1
+3,0,2015,9,8,2015,8,29
+3,0,2015,10,5,2015,9,27
+3,0,2015,11,10,2015,11,1
+3,0,2016,0,7,2015,11,29
+3,0,2016,1,4,2016,0,26
+3,0,2016,2,10,2016,2,1
+3,0,2016,3,7,2016,2,29
+3,0,2016,4,5,2016,3,26
+3,0,2016,5,9,2016,4,31
+3,0,2016,6,7,2016,5,28
+3,0,2016,7,4,2016,6,26
+3,0,2016,8,8,2016,7,30
+3,0,2016,9,6,2016,8,27
+3,0,2016,10,10,2016,10,1
+3,0,2016,11,8,2016,10,29
+3,0,2017,0,5,2016,11,27
+3,0,2017,1,9,2017,0,31
+3,0,2017,2,9,2017,1,28
+3,0,2017,3,6,2017,2,28
+3,0,2017,4,4,2017,3,25
+3,0,2017,5,8,2017,4,30
+3,0,2017,6,6,2017,5,27
+3,0,2017,7,10,2017,7,1
+3,0,2017,8,7,2017,7,29
+3,0,2017,9,5,2017,8,26
+3,0,2017,10,9,2017,9,31
+3,0,2017,11,7,2017,10,28
+3,0,2018,0,4,2017,11,26
+3,0,2018,1,8,2018,0,30
+3,0,2018,2,8,2018,1,27
+3,0,2018,3,5,2018,2,27
+3,0,2018,4,10,2018,4,1
+3,0,2018,5,7,2018,4,29
+3,0,2018,6,5,2018,5,26
+3,0,2018,7,9,2018,6,31
+3,0,2018,8,6,2018,7,28
+3,0,2018,9,4,2018,8,25
+3,0,2018,10,8,2018,9,30
+3,0,2018,11,6,2018,10,27
+3,0,2019,0,10,2019,0,1
+3,0,2019,1,7,2019,0,29
+3,0,2019,2,7,2019,1,26
+3,0,2019,3,4,2019,2,26
+3,0,2019,4,9,2019,3,30
+3,0,2019,5,6,2019,4,28
+3,0,2019,6,4,2019,5,25
+3,0,2019,7,8,2019,6,30
+3,0,2019,8,5,2019,7,27
+3,0,2019,9,10,2019,9,1
+3,0,2019,10,7,2019,9,29
+3,0,2019,11,5,2019,10,26
+3,0,2020,0,9,2019,11,31
+3,0,2020,1,6,2020,0,28
+3,0,2020,2,5,2020,1,25
+3,0,2020,3,9,2020,2,31
+3,0,2020,4,7,2020,3,28
+3,0,2020,5,4,2020,4,26
+3,0,2020,6,9,2020,5,30
+3,0,2020,7,6,2020,6,28
+3,0,2020,8,10,2020,8,1
+3,0,2020,9,8,2020,8,29
+3,0,2020,10,5,2020,9,27
+3,0,2020,11,10,2020,11,1
+4,0,2020,11,4,2020,10,25
+4,0,2000,0,7,1999,11,29
+4,0,2000,1,4,2000,0,26
+4,0,2000,2,10,2000,2,1
+4,0,2000,3,7,2000,2,29
+4,0,2000,4,5,2000,3,26
+4,0,2000,5,9,2000,4,31
+4,0,2000,6,7,2000,5,28
+4,0,2000,7,4,2000,6,26
+4,0,2000,8,8,2000,7,30
+4,0,2000,9,6,2000,8,27
+4,0,2000,10,10,2000,10,1
+4,0,2000,11,8,2000,10,29
+4,0,2001,0,5,2000,11,27
+4,0,2001,1,9,2001,0,31
+4,0,2001,2,9,2001,1,28
+4,0,2001,3,6,2001,2,28
+4,0,2001,4,4,2001,3,25
+4,0,2001,5,8,2001,4,30
+4,0,2001,6,6,2001,5,27
+4,0,2001,7,10,2001,7,1
+4,0,2001,8,7,2001,7,29
+4,0,2001,9,5,2001,8,26
+4,0,2001,10,9,2001,9,31
+4,0,2001,11,7,2001,10,28
+4,0,2002,0,4,2001,11,26
+4,0,2002,1,8,2002,0,30
+4,0,2002,2,8,2002,1,27
+4,0,2002,3,5,2002,2,27
+4,0,2002,4,10,2002,4,1
+4,0,2002,5,7,2002,4,29
+4,0,2002,6,5,2002,5,26
+4,0,2002,7,9,2002,6,31
+4,0,2002,8,6,2002,7,28
+4,0,2002,9,4,2002,8,25
+4,0,2002,10,8,2002,9,30
+4,0,2002,11,6,2002,10,27
+4,0,2003,0,10,2003,0,1
+4,0,2003,1,7,2003,0,29
+4,0,2003,2,7,2003,1,26
+4,0,2003,3,4,2003,2,26
+4,0,2003,4,9,2003,3,30
+4,0,2003,5,6,2003,4,28
+4,0,2003,6,4,2003,5,25
+4,0,2003,7,8,2003,6,30
+4,0,2003,8,5,2003,7,27
+4,0,2003,9,10,2003,9,1
+4,0,2003,10,7,2003,9,29
+4,0,2003,11,5,2003,10,26
+4,0,2004,0,9,2003,11,31
+4,0,2004,1,6,2004,0,28
+4,0,2004,2,5,2004,1,25
+4,0,2004,3,9,2004,2,31
+4,0,2004,4,7,2004,3,28
+4,0,2004,5,4,2004,4,26
+4,0,2004,6,9,2004,5,30
+4,0,2004,7,6,2004,6,28
+4,0,2004,8,10,2004,8,1
+4,0,2004,9,8,2004,8,29
+4,0,2004,10,5,2004,9,27
+4,0,2004,11,10,2004,11,1
+4,0,2005,0,7,2004,11,29
+4,0,2005,1,4,2005,0,26
+4,0,2005,2,4,2005,1,23
+4,0,2005,3,8,2005,2,30
+4,0,2005,4,6,2005,3,27
+4,0,2005,5,10,2005,5,1
+4,0,2005,6,8,2005,5,29
+4,0,2005,7,5,2005,6,27
+4,0,2005,8,9,2005,7,31
+4,0,2005,9,7,2005,8,28
+4,0,2005,10,4,2005,9,26
+4,0,2005,11,9,2005,10,30
+4,0,2006,0,6,2005,11,28
+4,0,2006,1,10,2006,1,1
+4,0,2006,2,10,2006,2,1
+4,0,2006,3,7,2006,2,29
+4,0,2006,4,5,2006,3,26
+4,0,2006,5,9,2006,4,31
+4,0,2006,6,7,2006,5,28
+4,0,2006,7,4,2006,6,26
+4,0,2006,8,8,2006,7,30
+4,0,2006,9,6,2006,8,27
+4,0,2006,10,10,2006,10,1
+4,0,2006,11,8,2006,10,29
+4,0,2007,0,5,2006,11,27
+4,0,2007,1,9,2007,0,31
+4,0,2007,2,9,2007,1,28
+4,0,2007,3,6,2007,2,28
+4,0,2007,4,4,2007,3,25
+4,0,2007,5,8,2007,4,30
+4,0,2007,6,6,2007,5,27
+4,0,2007,7,10,2007,7,1
+4,0,2007,8,7,2007,7,29
+4,0,2007,9,5,2007,8,26
+4,0,2007,10,9,2007,9,31
+4,0,2007,11,7,2007,10,28
+4,0,2008,0,4,2007,11,26
+4,0,2008,1,8,2008,0,30
+4,0,2008,2,7,2008,1,27
+4,0,2008,3,4,2008,2,26
+4,0,2008,4,9,2008,3,30
+4,0,2008,5,6,2008,4,28
+4,0,2008,6,4,2008,5,25
+4,0,2008,7,8,2008,6,30
+4,0,2008,8,5,2008,7,27
+4,0,2008,9,10,2008,9,1
+4,0,2008,10,7,2008,9,29
+4,0,2008,11,5,2008,10,26
+4,0,2009,0,9,2008,11,31
+4,0,2009,1,6,2009,0,28
+4,0,2009,2,6,2009,1,25
+4,0,2009,3,10,2009,3,1
+4,0,2009,4,8,2009,3,29
+4,0,2009,5,5,2009,4,27
+4,0,2009,6,10,2009,6,1
+4,0,2009,7,7,2009,6,29
+4,0,2009,8,4,2009,7,26
+4,0,2009,9,9,2009,8,30
+4,0,2009,10,6,2009,9,28
+4,0,2009,11,4,2009,10,25
+4,0,2010,0,8,2009,11,30
+4,0,2010,1,5,2010,0,27
+4,0,2010,2,5,2010,1,24
+4,0,2010,3,9,2010,2,31
+4,0,2010,4,7,2010,3,28
+4,0,2010,5,4,2010,4,26
+4,0,2010,6,9,2010,5,30
+4,0,2010,7,6,2010,6,28
+4,0,2010,8,10,2010,8,1
+4,0,2010,9,8,2010,8,29
+4,0,2010,10,5,2010,9,27
+4,0,2010,11,10,2010,11,1
+4,0,2011,0,7,2010,11,29
+4,0,2011,1,4,2011,0,26
+4,0,2011,2,4,2011,1,23
+4,0,2011,3,8,2011,2,30
+4,0,2011,4,6,2011,3,27
+4,0,2011,5,10,2011,5,1
+4,0,2011,6,8,2011,5,29
+4,0,2011,7,5,2011,6,27
+4,0,2011,8,9,2011,7,31
+4,0,2011,9,7,2011,8,28
+4,0,2011,10,4,2011,9,26
+4,0,2011,11,9,2011,10,30
+4,0,2012,0,6,2011,11,28
+4,0,2012,1,10,2012,1,1
+4,0,2012,2,9,2012,1,29
+4,0,2012,3,6,2012,2,28
+4,0,2012,4,4,2012,3,25
+4,0,2012,5,8,2012,4,30
+4,0,2012,6,6,2012,5,27
+4,0,2012,7,10,2012,7,1
+4,0,2012,8,7,2012,7,29
+4,0,2012,9,5,2012,8,26
+4,0,2012,10,9,2012,9,31
+4,0,2012,11,7,2012,10,28
+4,0,2013,0,4,2012,11,26
+4,0,2013,1,8,2013,0,30
+4,0,2013,2,8,2013,1,27
+4,0,2013,3,5,2013,2,27
+4,0,2013,4,10,2013,4,1
+4,0,2013,5,7,2013,4,29
+4,0,2013,6,5,2013,5,26
+4,0,2013,7,9,2013,6,31
+4,0,2013,8,6,2013,7,28
+4,0,2013,9,4,2013,8,25
+4,0,2013,10,8,2013,9,30
+4,0,2013,11,6,2013,10,27
+4,0,2014,0,10,2014,0,1
+4,0,2014,1,7,2014,0,29
+4,0,2014,2,7,2014,1,26
+4,0,2014,3,4,2014,2,26
+4,0,2014,4,9,2014,3,30
+4,0,2014,5,6,2014,4,28
+4,0,2014,6,4,2014,5,25
+4,0,2014,7,8,2014,6,30
+4,0,2014,8,5,2014,7,27
+4,0,2014,9,10,2014,9,1
+4,0,2014,10,7,2014,9,29
+4,0,2014,11,5,2014,10,26
+4,0,2015,0,9,2014,11,31
+4,0,2015,1,6,2015,0,28
+4,0,2015,2,6,2015,1,25
+4,0,2015,3,10,2015,3,1
+4,0,2015,4,8,2015,3,29
+4,0,2015,5,5,2015,4,27
+4,0,2015,6,10,2015,6,1
+4,0,2015,7,7,2015,6,29
+4,0,2015,8,4,2015,7,26
+4,0,2015,9,9,2015,8,30
+4,0,2015,10,6,2015,9,28
+4,0,2015,11,4,2015,10,25
+4,0,2016,0,8,2015,11,30
+4,0,2016,1,5,2016,0,27
+4,0,2016,2,4,2016,1,24
+4,0,2016,3,8,2016,2,30
+4,0,2016,4,6,2016,3,27
+4,0,2016,5,10,2016,5,1
+4,0,2016,6,8,2016,5,29
+4,0,2016,7,5,2016,6,27
+4,0,2016,8,9,2016,7,31
+4,0,2016,9,7,2016,8,28
+4,0,2016,10,4,2016,9,26
+4,0,2016,11,9,2016,10,30
+4,0,2017,0,6,2016,11,28
+4,0,2017,1,10,2017,1,1
+4,0,2017,2,10,2017,2,1
+4,0,2017,3,7,2017,2,29
+4,0,2017,4,5,2017,3,26
+4,0,2017,5,9,2017,4,31
+4,0,2017,6,7,2017,5,28
+4,0,2017,7,4,2017,6,26
+4,0,2017,8,8,2017,7,30
+4,0,2017,9,6,2017,8,27
+4,0,2017,10,10,2017,10,1
+4,0,2017,11,8,2017,10,29
+4,0,2018,0,5,2017,11,27
+4,0,2018,1,9,2018,0,31
+4,0,2018,2,9,2018,1,28
+4,0,2018,3,6,2018,2,28
+4,0,2018,4,4,2018,3,25
+4,0,2018,5,8,2018,4,30
+4,0,2018,6,6,2018,5,27
+4,0,2018,7,10,2018,7,1
+4,0,2018,8,7,2018,7,29
+4,0,2018,9,5,2018,8,26
+4,0,2018,10,9,2018,9,31
+4,0,2018,11,7,2018,10,28
+4,0,2019,0,4,2018,11,26
+4,0,2019,1,8,2019,0,30
+4,0,2019,2,8,2019,1,27
+4,0,2019,3,5,2019,2,27
+4,0,2019,4,10,2019,4,1
+4,0,2019,5,7,2019,4,29
+4,0,2019,6,5,2019,5,26
+4,0,2019,7,9,2019,6,31
+4,0,2019,8,6,2019,7,28
+4,0,2019,9,4,2019,8,25
+4,0,2019,10,8,2019,9,30
+4,0,2019,11,6,2019,10,27
+4,0,2020,0,10,2020,0,1
+4,0,2020,1,7,2020,0,29
+4,0,2020,2,6,2020,1,26
+4,0,2020,3,10,2020,3,1
+4,0,2020,4,8,2020,3,29
+4,0,2020,5,5,2020,4,27
+4,0,2020,6,10,2020,6,1
+4,0,2020,7,7,2020,6,29
+4,0,2020,8,4,2020,7,26
+4,0,2020,9,9,2020,8,30
+4,0,2020,10,6,2020,9,28
+4,0,2020,11,4,2020,10,25
+5,0,2020,11,5,2020,10,26
+5,0,2020,11,5,2020,10,26
+5,0,2000,0,8,1999,11,30
+5,0,2000,1,5,2000,0,27
+5,0,2000,2,4,2000,1,24
+5,0,2000,3,8,2000,2,30
+5,0,2000,4,6,2000,3,27
+5,0,2000,5,10,2000,5,1
+5,0,2000,6,8,2000,5,29
+5,0,2000,7,5,2000,6,27
+5,0,2000,8,9,2000,7,31
+5,0,2000,9,7,2000,8,28
+5,0,2000,10,4,2000,9,26
+5,0,2000,11,9,2000,10,30
+5,0,2001,0,6,2000,11,28
+5,0,2001,1,10,2001,1,1
+5,0,2001,2,10,2001,2,1
+5,0,2001,3,7,2001,2,29
+5,0,2001,4,5,2001,3,26
+5,0,2001,5,9,2001,4,31
+5,0,2001,6,7,2001,5,28
+5,0,2001,7,4,2001,6,26
+5,0,2001,8,8,2001,7,30
+5,0,2001,9,6,2001,8,27
+5,0,2001,10,10,2001,10,1
+5,0,2001,11,8,2001,10,29
+5,0,2002,0,5,2001,11,27
+5,0,2002,1,9,2002,0,31
+5,0,2002,2,9,2002,1,28
+5,0,2002,3,6,2002,2,28
+5,0,2002,4,4,2002,3,25
+5,0,2002,5,8,2002,4,30
+5,0,2002,6,6,2002,5,27
+5,0,2002,7,10,2002,7,1
+5,0,2002,8,7,2002,7,29
+5,0,2002,9,5,2002,8,26
+5,0,2002,10,9,2002,9,31
+5,0,2002,11,7,2002,10,28
+5,0,2003,0,4,2002,11,26
+5,0,2003,1,8,2003,0,30
+5,0,2003,2,8,2003,1,27
+5,0,2003,3,5,2003,2,27
+5,0,2003,4,10,2003,4,1
+5,0,2003,5,7,2003,4,29
+5,0,2003,6,5,2003,5,26
+5,0,2003,7,9,2003,6,31
+5,0,2003,8,6,2003,7,28
+5,0,2003,9,4,2003,8,25
+5,0,2003,10,8,2003,9,30
+5,0,2003,11,6,2003,10,27
+5,0,2004,0,10,2004,0,1
+5,0,2004,1,7,2004,0,29
+5,0,2004,2,6,2004,1,26
+5,0,2004,3,10,2004,3,1
+5,0,2004,4,8,2004,3,29
+5,0,2004,5,5,2004,4,27
+5,0,2004,6,10,2004,6,1
+5,0,2004,7,7,2004,6,29
+5,0,2004,8,4,2004,7,26
+5,0,2004,9,9,2004,8,30
+5,0,2004,10,6,2004,9,28
+5,0,2004,11,4,2004,10,25
+5,0,2005,0,8,2004,11,30
+5,0,2005,1,5,2005,0,27
+5,0,2005,2,5,2005,1,24
+5,0,2005,3,9,2005,2,31
+5,0,2005,4,7,2005,3,28
+5,0,2005,5,4,2005,4,26
+5,0,2005,6,9,2005,5,30
+5,0,2005,7,6,2005,6,28
+5,0,2005,8,10,2005,8,1
+5,0,2005,9,8,2005,8,29
+5,0,2005,10,5,2005,9,27
+5,0,2005,11,10,2005,11,1
+5,0,2006,0,7,2005,11,29
+5,0,2006,1,4,2006,0,26
+5,0,2006,2,4,2006,1,23
+5,0,2006,3,8,2006,2,30
+5,0,2006,4,6,2006,3,27
+5,0,2006,5,10,2006,5,1
+5,0,2006,6,8,2006,5,29
+5,0,2006,7,5,2006,6,27
+5,0,2006,8,9,2006,7,31
+5,0,2006,9,7,2006,8,28
+5,0,2006,10,4,2006,9,26
+5,0,2006,11,9,2006,10,30
+5,0,2007,0,6,2006,11,28
+5,0,2007,1,10,2007,1,1
+5,0,2007,2,10,2007,2,1
+5,0,2007,3,7,2007,2,29
+5,0,2007,4,5,2007,3,26
+5,0,2007,5,9,2007,4,31
+5,0,2007,6,7,2007,5,28
+5,0,2007,7,4,2007,6,26
+5,0,2007,8,8,2007,7,30
+5,0,2007,9,6,2007,8,27
+5,0,2007,10,10,2007,10,1
+5,0,2007,11,8,2007,10,29
+5,0,2008,0,5,2007,11,27
+5,0,2008,1,9,2008,0,31
+5,0,2008,2,8,2008,1,28
+5,0,2008,3,5,2008,2,27
+5,0,2008,4,10,2008,4,1
+5,0,2008,5,7,2008,4,29
+5,0,2008,6,5,2008,5,26
+5,0,2008,7,9,2008,6,31
+5,0,2008,8,6,2008,7,28
+5,0,2008,9,4,2008,8,25
+5,0,2008,10,8,2008,9,30
+5,0,2008,11,6,2008,10,27
+5,0,2009,0,10,2009,0,1
+5,0,2009,1,7,2009,0,29
+5,0,2009,2,7,2009,1,26
+5,0,2009,3,4,2009,2,26
+5,0,2009,4,9,2009,3,30
+5,0,2009,5,6,2009,4,28
+5,0,2009,6,4,2009,5,25
+5,0,2009,7,8,2009,6,30
+5,0,2009,8,5,2009,7,27
+5,0,2009,9,10,2009,9,1
+5,0,2009,10,7,2009,9,29
+5,0,2009,11,5,2009,10,26
+5,0,2010,0,9,2009,11,31
+5,0,2010,1,6,2010,0,28
+5,0,2010,2,6,2010,1,25
+5,0,2010,3,10,2010,3,1
+5,0,2010,4,8,2010,3,29
+5,0,2010,5,5,2010,4,27
+5,0,2010,6,10,2010,6,1
+5,0,2010,7,7,2010,6,29
+5,0,2010,8,4,2010,7,26
+5,0,2010,9,9,2010,8,30
+5,0,2010,10,6,2010,9,28
+5,0,2010,11,4,2010,10,25
+5,0,2011,0,8,2010,11,30
+5,0,2011,1,5,2011,0,27
+5,0,2011,2,5,2011,1,24
+5,0,2011,3,9,2011,2,31
+5,0,2011,4,7,2011,3,28
+5,0,2011,5,4,2011,4,26
+5,0,2011,6,9,2011,5,30
+5,0,2011,7,6,2011,6,28
+5,0,2011,8,10,2011,8,1
+5,0,2011,9,8,2011,8,29
+5,0,2011,10,5,2011,9,27
+5,0,2011,11,10,2011,11,1
+5,0,2012,0,7,2011,11,29
+5,0,2012,1,4,2012,0,26
+5,0,2012,2,10,2012,2,1
+5,0,2012,3,7,2012,2,29
+5,0,2012,4,5,2012,3,26
+5,0,2012,5,9,2012,4,31
+5,0,2012,6,7,2012,5,28
+5,0,2012,7,4,2012,6,26
+5,0,2012,8,8,2012,7,30
+5,0,2012,9,6,2012,8,27
+5,0,2012,10,10,2012,10,1
+5,0,2012,11,8,2012,10,29
+5,0,2013,0,5,2012,11,27
+5,0,2013,1,9,2013,0,31
+5,0,2013,2,9,2013,1,28
+5,0,2013,3,6,2013,2,28
+5,0,2013,4,4,2013,3,25
+5,0,2013,5,8,2013,4,30
+5,0,2013,6,6,2013,5,27
+5,0,2013,7,10,2013,7,1
+5,0,2013,8,7,2013,7,29
+5,0,2013,9,5,2013,8,26
+5,0,2013,10,9,2013,9,31
+5,0,2013,11,7,2013,10,28
+5,0,2014,0,4,2013,11,26
+5,0,2014,1,8,2014,0,30
+5,0,2014,2,8,2014,1,27
+5,0,2014,3,5,2014,2,27
+5,0,2014,4,10,2014,4,1
+5,0,2014,5,7,2014,4,29
+5,0,2014,6,5,2014,5,26
+5,0,2014,7,9,2014,6,31
+5,0,2014,8,6,2014,7,28
+5,0,2014,9,4,2014,8,25
+5,0,2014,10,8,2014,9,30
+5,0,2014,11,6,2014,10,27
+5,0,2015,0,10,2015,0,1
+5,0,2015,1,7,2015,0,29
+5,0,2015,2,7,2015,1,26
+5,0,2015,3,4,2015,2,26
+5,0,2015,4,9,2015,3,30
+5,0,2015,5,6,2015,4,28
+5,0,2015,6,4,2015,5,25
+5,0,2015,7,8,2015,6,30
+5,0,2015,8,5,2015,7,27
+5,0,2015,9,10,2015,9,1
+5,0,2015,10,7,2015,9,29
+5,0,2015,11,5,2015,10,26
+5,0,2016,0,9,2015,11,31
+5,0,2016,1,6,2016,0,28
+5,0,2016,2,5,2016,1,25
+5,0,2016,3,9,2016,2,31
+5,0,2016,4,7,2016,3,28
+5,0,2016,5,4,2016,4,26
+5,0,2016,6,9,2016,5,30
+5,0,2016,7,6,2016,6,28
+5,0,2016,8,10,2016,8,1
+5,0,2016,9,8,2016,8,29
+5,0,2016,10,5,2016,9,27
+5,0,2016,11,10,2016,11,1
+5,0,2017,0,7,2016,11,29
+5,0,2017,1,4,2017,0,26
+5,0,2017,2,4,2017,1,23
+5,0,2017,3,8,2017,2,30
+5,0,2017,4,6,2017,3,27
+5,0,2017,5,10,2017,5,1
+5,0,2017,6,8,2017,5,29
+5,0,2017,7,5,2017,6,27
+5,0,2017,8,9,2017,7,31
+5,0,2017,9,7,2017,8,28
+5,0,2017,10,4,2017,9,26
+5,0,2017,11,9,2017,10,30
+5,0,2018,0,6,2017,11,28
+5,0,2018,1,10,2018,1,1
+5,0,2018,2,10,2018,2,1
+5,0,2018,3,7,2018,2,29
+5,0,2018,4,5,2018,3,26
+5,0,2018,5,9,2018,4,31
+5,0,2018,6,7,2018,5,28
+5,0,2018,7,4,2018,6,26
+5,0,2018,8,8,2018,7,30
+5,0,2018,9,6,2018,8,27
+5,0,2018,10,10,2018,10,1
+5,0,2018,11,8,2018,10,29
+5,0,2019,0,5,2018,11,27
+5,0,2019,1,9,2019,0,31
+5,0,2019,2,9,2019,1,28
+5,0,2019,3,6,2019,2,28
+5,0,2019,4,4,2019,3,25
+5,0,2019,5,8,2019,4,30
+5,0,2019,6,6,2019,5,27
+5,0,2019,7,10,2019,7,1
+5,0,2019,8,7,2019,7,29
+5,0,2019,9,5,2019,8,26
+5,0,2019,10,9,2019,9,31
+5,0,2019,11,7,2019,10,28
+5,0,2020,0,4,2019,11,26
+5,0,2020,1,8,2020,0,30
+5,0,2020,2,7,2020,1,27
+5,0,2020,3,4,2020,2,26
+5,0,2020,4,9,2020,3,30
+5,0,2020,5,6,2020,4,28
+5,0,2020,6,4,2020,5,25
+5,0,2020,7,8,2020,6,30
+5,0,2020,8,5,2020,7,27
+5,0,2020,9,10,2020,9,1
+5,0,2020,10,7,2020,9,29
+5,0,2020,11,5,2020,10,26
+6,0,2020,11,6,2020,10,27
+6,0,2000,0,9,1999,11,31
+6,0,2000,1,6,2000,0,28
+6,0,2000,2,5,2000,1,25
+6,0,2000,3,9,2000,2,31
+6,0,2000,4,7,2000,3,28
+6,0,2000,5,4,2000,4,26
+6,0,2000,6,9,2000,5,30
+6,0,2000,7,6,2000,6,28
+6,0,2000,8,10,2000,8,1
+6,0,2000,9,8,2000,8,29
+6,0,2000,10,5,2000,9,27
+6,0,2000,11,10,2000,11,1
+6,0,2001,0,7,2000,11,29
+6,0,2001,1,4,2001,0,26
+6,0,2001,2,4,2001,1,23
+6,0,2001,3,8,2001,2,30
+6,0,2001,4,6,2001,3,27
+6,0,2001,5,10,2001,5,1
+6,0,2001,6,8,2001,5,29
+6,0,2001,7,5,2001,6,27
+6,0,2001,8,9,2001,7,31
+6,0,2001,9,7,2001,8,28
+6,0,2001,10,4,2001,9,26
+6,0,2001,11,9,2001,10,30
+6,0,2002,0,6,2001,11,28
+6,0,2002,1,10,2002,1,1
+6,0,2002,2,10,2002,2,1
+6,0,2002,3,7,2002,2,29
+6,0,2002,4,5,2002,3,26
+6,0,2002,5,9,2002,4,31
+6,0,2002,6,7,2002,5,28
+6,0,2002,7,4,2002,6,26
+6,0,2002,8,8,2002,7,30
+6,0,2002,9,6,2002,8,27
+6,0,2002,10,10,2002,10,1
+6,0,2002,11,8,2002,10,29
+6,0,2003,0,5,2002,11,27
+6,0,2003,1,9,2003,0,31
+6,0,2003,2,9,2003,1,28
+6,0,2003,3,6,2003,2,28
+6,0,2003,4,4,2003,3,25
+6,0,2003,5,8,2003,4,30
+6,0,2003,6,6,2003,5,27
+6,0,2003,7,10,2003,7,1
+6,0,2003,8,7,2003,7,29
+6,0,2003,9,5,2003,8,26
+6,0,2003,10,9,2003,9,31
+6,0,2003,11,7,2003,10,28
+6,0,2004,0,4,2003,11,26
+6,0,2004,1,8,2004,0,30
+6,0,2004,2,7,2004,1,27
+6,0,2004,3,4,2004,2,26
+6,0,2004,4,9,2004,3,30
+6,0,2004,5,6,2004,4,28
+6,0,2004,6,4,2004,5,25
+6,0,2004,7,8,2004,6,30
+6,0,2004,8,5,2004,7,27
+6,0,2004,9,10,2004,9,1
+6,0,2004,10,7,2004,9,29
+6,0,2004,11,5,2004,10,26
+6,0,2005,0,9,2004,11,31
+6,0,2005,1,6,2005,0,28
+6,0,2005,2,6,2005,1,25
+6,0,2005,3,10,2005,3,1
+6,0,2005,4,8,2005,3,29
+6,0,2005,5,5,2005,4,27
+6,0,2005,6,10,2005,6,1
+6,0,2005,7,7,2005,6,29
+6,0,2005,8,4,2005,7,26
+6,0,2005,9,9,2005,8,30
+6,0,2005,10,6,2005,9,28
+6,0,2005,11,4,2005,10,25
+6,0,2006,0,8,2005,11,30
+6,0,2006,1,5,2006,0,27
+6,0,2006,2,5,2006,1,24
+6,0,2006,3,9,2006,2,31
+6,0,2006,4,7,2006,3,28
+6,0,2006,5,4,2006,4,26
+6,0,2006,6,9,2006,5,30
+6,0,2006,7,6,2006,6,28
+6,0,2006,8,10,2006,8,1
+6,0,2006,9,8,2006,8,29
+6,0,2006,10,5,2006,9,27
+6,0,2006,11,10,2006,11,1
+6,0,2007,0,7,2006,11,29
+6,0,2007,1,4,2007,0,26
+6,0,2007,2,4,2007,1,23
+6,0,2007,3,8,2007,2,30
+6,0,2007,4,6,2007,3,27
+6,0,2007,5,10,2007,5,1
+6,0,2007,6,8,2007,5,29
+6,0,2007,7,5,2007,6,27
+6,0,2007,8,9,2007,7,31
+6,0,2007,9,7,2007,8,28
+6,0,2007,10,4,2007,9,26
+6,0,2007,11,9,2007,10,30
+6,0,2008,0,6,2007,11,28
+6,0,2008,1,10,2008,1,1
+6,0,2008,2,9,2008,1,29
+6,0,2008,3,6,2008,2,28
+6,0,2008,4,4,2008,3,25
+6,0,2008,5,8,2008,4,30
+6,0,2008,6,6,2008,5,27
+6,0,2008,7,10,2008,7,1
+6,0,2008,8,7,2008,7,29
+6,0,2008,9,5,2008,8,26
+6,0,2008,10,9,2008,9,31
+6,0,2008,11,7,2008,10,28
+6,0,2009,0,4,2008,11,26
+6,0,2009,1,8,2009,0,30
+6,0,2009,2,8,2009,1,27
+6,0,2009,3,5,2009,2,27
+6,0,2009,4,10,2009,4,1
+6,0,2009,5,7,2009,4,29
+6,0,2009,6,5,2009,5,26
+6,0,2009,7,9,2009,6,31
+6,0,2009,8,6,2009,7,28
+6,0,2009,9,4,2009,8,25
+6,0,2009,10,8,2009,9,30
+6,0,2009,11,6,2009,10,27
+6,0,2010,0,10,2010,0,1
+6,0,2010,1,7,2010,0,29
+6,0,2010,2,7,2010,1,26
+6,0,2010,3,4,2010,2,26
+6,0,2010,4,9,2010,3,30
+6,0,2010,5,6,2010,4,28
+6,0,2010,6,4,2010,5,25
+6,0,2010,7,8,2010,6,30
+6,0,2010,8,5,2010,7,27
+6,0,2010,9,10,2010,9,1
+6,0,2010,10,7,2010,9,29
+6,0,2010,11,5,2010,10,26
+6,0,2011,0,9,2010,11,31
+6,0,2011,1,6,2011,0,28
+6,0,2011,2,6,2011,1,25
+6,0,2011,3,10,2011,3,1
+6,0,2011,4,8,2011,3,29
+6,0,2011,5,5,2011,4,27
+6,0,2011,6,10,2011,6,1
+6,0,2011,7,7,2011,6,29
+6,0,2011,8,4,2011,7,26
+6,0,2011,9,9,2011,8,30
+6,0,2011,10,6,2011,9,28
+6,0,2011,11,4,2011,10,25
+6,0,2012,0,8,2011,11,30
+6,0,2012,1,5,2012,0,27
+6,0,2012,2,4,2012,1,24
+6,0,2012,3,8,2012,2,30
+6,0,2012,4,6,2012,3,27
+6,0,2012,5,10,2012,5,1
+6,0,2012,6,8,2012,5,29
+6,0,2012,7,5,2012,6,27
+6,0,2012,8,9,2012,7,31
+6,0,2012,9,7,2012,8,28
+6,0,2012,10,4,2012,9,26
+6,0,2012,11,9,2012,10,30
+6,0,2013,0,6,2012,11,28
+6,0,2013,1,10,2013,1,1
+6,0,2013,2,10,2013,2,1
+6,0,2013,3,7,2013,2,29
+6,0,2013,4,5,2013,3,26
+6,0,2013,5,9,2013,4,31
+6,0,2013,6,7,2013,5,28
+6,0,2013,7,4,2013,6,26
+6,0,2013,8,8,2013,7,30
+6,0,2013,9,6,2013,8,27
+6,0,2013,10,10,2013,10,1
+6,0,2013,11,8,2013,10,29
+6,0,2014,0,5,2013,11,27
+6,0,2014,1,9,2014,0,31
+6,0,2014,2,9,2014,1,28
+6,0,2014,3,6,2014,2,28
+6,0,2014,4,4,2014,3,25
+6,0,2014,5,8,2014,4,30
+6,0,2014,6,6,2014,5,27
+6,0,2014,7,10,2014,7,1
+6,0,2014,8,7,2014,7,29
+6,0,2014,9,5,2014,8,26
+6,0,2014,10,9,2014,9,31
+6,0,2014,11,7,2014,10,28
+6,0,2015,0,4,2014,11,26
+6,0,2015,1,8,2015,0,30
+6,0,2015,2,8,2015,1,27
+6,0,2015,3,5,2015,2,27
+6,0,2015,4,10,2015,4,1
+6,0,2015,5,7,2015,4,29
+6,0,2015,6,5,2015,5,26
+6,0,2015,7,9,2015,6,31
+6,0,2015,8,6,2015,7,28
+6,0,2015,9,4,2015,8,25
+6,0,2015,10,8,2015,9,30
+6,0,2015,11,6,2015,10,27
+6,0,2016,0,10,2016,0,1
+6,0,2016,1,7,2016,0,29
+6,0,2016,2,6,2016,1,26
+6,0,2016,3,10,2016,3,1
+6,0,2016,4,8,2016,3,29
+6,0,2016,5,5,2016,4,27
+6,0,2016,6,10,2016,6,1
+6,0,2016,7,7,2016,6,29
+6,0,2016,8,4,2016,7,26
+6,0,2016,9,9,2016,8,30
+6,0,2016,10,6,2016,9,28
+6,0,2016,11,4,2016,10,25
+6,0,2017,0,8,2016,11,30
+6,0,2017,1,5,2017,0,27
+6,0,2017,2,5,2017,1,24
+6,0,2017,3,9,2017,2,31
+6,0,2017,4,7,2017,3,28
+6,0,2017,5,4,2017,4,26
+6,0,2017,6,9,2017,5,30
+6,0,2017,7,6,2017,6,28
+6,0,2017,8,10,2017,8,1
+6,0,2017,9,8,2017,8,29
+6,0,2017,10,5,2017,9,27
+6,0,2017,11,10,2017,11,1
+6,0,2018,0,7,2017,11,29
+6,0,2018,1,4,2018,0,26
+6,0,2018,2,4,2018,1,23
+6,0,2018,3,8,2018,2,30
+6,0,2018,4,6,2018,3,27
+6,0,2018,5,10,2018,5,1
+6,0,2018,6,8,2018,5,29
+6,0,2018,7,5,2018,6,27
+6,0,2018,8,9,2018,7,31
+6,0,2018,9,7,2018,8,28
+6,0,2018,10,4,2018,9,26
+6,0,2018,11,9,2018,10,30
+6,0,2019,0,6,2018,11,28
+6,0,2019,1,10,2019,1,1
+6,0,2019,2,10,2019,2,1
+6,0,2019,3,7,2019,2,29
+6,0,2019,4,5,2019,3,26
+6,0,2019,5,9,2019,4,31
+6,0,2019,6,7,2019,5,28
+6,0,2019,7,4,2019,6,26
+6,0,2019,8,8,2019,7,30
+6,0,2019,9,6,2019,8,27
+6,0,2019,10,10,2019,10,1
+6,0,2019,11,8,2019,10,29
+6,0,2020,0,5,2019,11,27
+6,0,2020,1,9,2020,0,31
+6,0,2020,2,8,2020,1,28
+6,0,2020,3,5,2020,2,27
+6,0,2020,4,10,2020,4,1
+6,0,2020,5,7,2020,4,29
+6,0,2020,6,5,2020,5,26
+6,0,2020,7,9,2020,6,31
+6,0,2020,8,6,2020,7,28
+6,0,2020,9,4,2020,8,25
+6,0,2020,10,8,2020,9,30
+6,0,2020,11,6,2020,10,27
+7,0,2020,11,7,2020,10,28
+7,0,2000,0,10,2000,0,1
+7,0,2000,1,7,2000,0,29
+7,0,2000,2,6,2000,1,26
+7,0,2000,3,10,2000,3,1
+7,0,2000,4,8,2000,3,29
+7,0,2000,5,5,2000,4,27
+7,0,2000,6,10,2000,6,1
+7,0,2000,7,7,2000,6,29
+7,0,2000,8,4,2000,7,26
+7,0,2000,9,9,2000,8,30
+7,0,2000,10,6,2000,9,28
+7,0,2000,11,4,2000,10,25
+7,0,2001,0,8,2000,11,30
+7,0,2001,1,5,2001,0,27
+7,0,2001,2,5,2001,1,24
+7,0,2001,3,9,2001,2,31
+7,0,2001,4,7,2001,3,28
+7,0,2001,5,4,2001,4,26
+7,0,2001,6,9,2001,5,30
+7,0,2001,7,6,2001,6,28
+7,0,2001,8,10,2001,8,1
+7,0,2001,9,8,2001,8,29
+7,0,2001,10,5,2001,9,27
+7,0,2001,11,10,2001,11,1
+7,0,2002,0,7,2001,11,29
+7,0,2002,1,4,2002,0,26
+7,0,2002,2,4,2002,1,23
+7,0,2002,3,8,2002,2,30
+7,0,2002,4,6,2002,3,27
+7,0,2002,5,10,2002,5,1
+7,0,2002,6,8,2002,5,29
+7,0,2002,7,5,2002,6,27
+7,0,2002,8,9,2002,7,31
+7,0,2002,9,7,2002,8,28
+7,0,2002,10,4,2002,9,26
+7,0,2002,11,9,2002,10,30
+7,0,2003,0,6,2002,11,28
+7,0,2003,1,10,2003,1,1
+7,0,2003,2,10,2003,2,1
+7,0,2003,3,7,2003,2,29
+7,0,2003,4,5,2003,3,26
+7,0,2003,5,9,2003,4,31
+7,0,2003,6,7,2003,5,28
+7,0,2003,7,4,2003,6,26
+7,0,2003,8,8,2003,7,30
+7,0,2003,9,6,2003,8,27
+7,0,2003,10,10,2003,10,1
+7,0,2003,11,8,2003,10,29
+7,0,2004,0,5,2003,11,27
+7,0,2004,1,9,2004,0,31
+7,0,2004,2,8,2004,1,28
+7,0,2004,3,5,2004,2,27
+7,0,2004,4,10,2004,4,1
+7,0,2004,5,7,2004,4,29
+7,0,2004,6,5,2004,5,26
+7,0,2004,7,9,2004,6,31
+7,0,2004,8,6,2004,7,28
+7,0,2004,9,4,2004,8,25
+7,0,2004,10,8,2004,9,30
+7,0,2004,11,6,2004,10,27
+7,0,2005,0,10,2005,0,1
+7,0,2005,1,7,2005,0,29
+7,0,2005,2,7,2005,1,26
+7,0,2005,3,4,2005,2,26
+7,0,2005,4,9,2005,3,30
+7,0,2005,5,6,2005,4,28
+7,0,2005,6,4,2005,5,25
+7,0,2005,7,8,2005,6,30
+7,0,2005,8,5,2005,7,27
+7,0,2005,9,10,2005,9,1
+7,0,2005,10,7,2005,9,29
+7,0,2005,11,5,2005,10,26
+7,0,2006,0,9,2005,11,31
+7,0,2006,1,6,2006,0,28
+7,0,2006,2,6,2006,1,25
+7,0,2006,3,10,2006,3,1
+7,0,2006,4,8,2006,3,29
+7,0,2006,5,5,2006,4,27
+7,0,2006,6,10,2006,6,1
+7,0,2006,7,7,2006,6,29
+7,0,2006,8,4,2006,7,26
+7,0,2006,9,9,2006,8,30
+7,0,2006,10,6,2006,9,28
+7,0,2006,11,4,2006,10,25
+7,0,2007,0,8,2006,11,30
+7,0,2007,1,5,2007,0,27
+7,0,2007,2,5,2007,1,24
+7,0,2007,3,9,2007,2,31
+7,0,2007,4,7,2007,3,28
+7,0,2007,5,4,2007,4,26
+7,0,2007,6,9,2007,5,30
+7,0,2007,7,6,2007,6,28
+7,0,2007,8,10,2007,8,1
+7,0,2007,9,8,2007,8,29
+7,0,2007,10,5,2007,9,27
+7,0,2007,11,10,2007,11,1
+7,0,2008,0,7,2007,11,29
+7,0,2008,1,4,2008,0,26
+7,0,2008,2,10,2008,2,1
+7,0,2008,3,7,2008,2,29
+7,0,2008,4,5,2008,3,26
+7,0,2008,5,9,2008,4,31
+7,0,2008,6,7,2008,5,28
+7,0,2008,7,4,2008,6,26
+7,0,2008,8,8,2008,7,30
+7,0,2008,9,6,2008,8,27
+7,0,2008,10,10,2008,10,1
+7,0,2008,11,8,2008,10,29
+7,0,2009,0,5,2008,11,27
+7,0,2009,1,9,2009,0,31
+7,0,2009,2,9,2009,1,28
+7,0,2009,3,6,2009,2,28
+7,0,2009,4,4,2009,3,25
+7,0,2009,5,8,2009,4,30
+7,0,2009,6,6,2009,5,27
+7,0,2009,7,10,2009,7,1
+7,0,2009,8,7,2009,7,29
+7,0,2009,9,5,2009,8,26
+7,0,2009,10,9,2009,9,31
+7,0,2009,11,7,2009,10,28
+7,0,2010,0,4,2009,11,26
+7,0,2010,1,8,2010,0,30
+7,0,2010,2,8,2010,1,27
+7,0,2010,3,5,2010,2,27
+7,0,2010,4,10,2010,4,1
+7,0,2010,5,7,2010,4,29
+7,0,2010,6,5,2010,5,26
+7,0,2010,7,9,2010,6,31
+7,0,2010,8,6,2010,7,28
+7,0,2010,9,4,2010,8,25
+7,0,2010,10,8,2010,9,30
+7,0,2010,11,6,2010,10,27
+7,0,2011,0,10,2011,0,1
+7,0,2011,1,7,2011,0,29
+7,0,2011,2,7,2011,1,26
+7,0,2011,3,4,2011,2,26
+7,0,2011,4,9,2011,3,30
+7,0,2011,5,6,2011,4,28
+7,0,2011,6,4,2011,5,25
+7,0,2011,7,8,2011,6,30
+7,0,2011,8,5,2011,7,27
+7,0,2011,9,10,2011,9,1
+7,0,2011,10,7,2011,9,29
+7,0,2011,11,5,2011,10,26
+7,0,2012,0,9,2011,11,31
+7,0,2012,1,6,2012,0,28
+7,0,2012,2,5,2012,1,25
+7,0,2012,3,9,2012,2,31
+7,0,2012,4,7,2012,3,28
+7,0,2012,5,4,2012,4,26
+7,0,2012,6,9,2012,5,30
+7,0,2012,7,6,2012,6,28
+7,0,2012,8,10,2012,8,1
+7,0,2012,9,8,2012,8,29
+7,0,2012,10,5,2012,9,27
+7,0,2012,11,10,2012,11,1
+7,0,2013,0,7,2012,11,29
+7,0,2013,1,4,2013,0,26
+7,0,2013,2,4,2013,1,23
+7,0,2013,3,8,2013,2,30
+7,0,2013,4,6,2013,3,27
+7,0,2013,5,10,2013,5,1
+7,0,2013,6,8,2013,5,29
+7,0,2013,7,5,2013,6,27
+7,0,2013,8,9,2013,7,31
+7,0,2013,9,7,2013,8,28
+7,0,2013,10,4,2013,9,26
+7,0,2013,11,9,2013,10,30
+7,0,2014,0,6,2013,11,28
+7,0,2014,1,10,2014,1,1
+7,0,2014,2,10,2014,2,1
+7,0,2014,3,7,2014,2,29
+7,0,2014,4,5,2014,3,26
+7,0,2014,5,9,2014,4,31
+7,0,2014,6,7,2014,5,28
+7,0,2014,7,4,2014,6,26
+7,0,2014,8,8,2014,7,30
+7,0,2014,9,6,2014,8,27
+7,0,2014,10,10,2014,10,1
+7,0,2014,11,8,2014,10,29
+7,0,2015,0,5,2014,11,27
+7,0,2015,1,9,2015,0,31
+7,0,2015,2,9,2015,1,28
+7,0,2015,3,6,2015,2,28
+7,0,2015,4,4,2015,3,25
+7,0,2015,5,8,2015,4,30
+7,0,2015,6,6,2015,5,27
+7,0,2015,7,10,2015,7,1
+7,0,2015,8,7,2015,7,29
+7,0,2015,9,5,2015,8,26
+7,0,2015,10,9,2015,9,31
+7,0,2015,11,7,2015,10,28
+7,0,2016,0,4,2015,11,26
+7,0,2016,1,8,2016,0,30
+7,0,2016,2,7,2016,1,27
+7,0,2016,3,4,2016,2,26
+7,0,2016,4,9,2016,3,30
+7,0,2016,5,6,2016,4,28
+7,0,2016,6,4,2016,5,25
+7,0,2016,7,8,2016,6,30
+7,0,2016,8,5,2016,7,27
+7,0,2016,9,10,2016,9,1
+7,0,2016,10,7,2016,9,29
+7,0,2016,11,5,2016,10,26
+7,0,2017,0,9,2016,11,31
+7,0,2017,1,6,2017,0,28
+7,0,2017,2,6,2017,1,25
+7,0,2017,3,10,2017,3,1
+7,0,2017,4,8,2017,3,29
+7,0,2017,5,5,2017,4,27
+7,0,2017,6,10,2017,6,1
+7,0,2017,7,7,2017,6,29
+7,0,2017,8,4,2017,7,26
+7,0,2017,9,9,2017,8,30
+7,0,2017,10,6,2017,9,28
+7,0,2017,11,4,2017,10,25
+7,0,2018,0,8,2017,11,30
+7,0,2018,1,5,2018,0,27
+7,0,2018,2,5,2018,1,24
+7,0,2018,3,9,2018,2,31
+7,0,2018,4,7,2018,3,28
+7,0,2018,5,4,2018,4,26
+7,0,2018,6,9,2018,5,30
+7,0,2018,7,6,2018,6,28
+7,0,2018,8,10,2018,8,1
+7,0,2018,9,8,2018,8,29
+7,0,2018,10,5,2018,9,27
+7,0,2018,11,10,2018,11,1
+7,0,2019,0,7,2018,11,29
+7,0,2019,1,4,2019,0,26
+7,0,2019,2,4,2019,1,23
+7,0,2019,3,8,2019,2,30
+7,0,2019,4,6,2019,3,27
+7,0,2019,5,10,2019,5,1
+7,0,2019,6,8,2019,5,29
+7,0,2019,7,5,2019,6,27
+7,0,2019,8,9,2019,7,31
+7,0,2019,9,7,2019,8,28
+7,0,2019,10,4,2019,9,26
+7,0,2019,11,9,2019,10,30
+7,0,2020,0,6,2019,11,28
+7,0,2020,1,10,2020,1,1
+7,0,2020,2,9,2020,1,29
+7,0,2020,3,6,2020,2,28
+7,0,2020,4,4,2020,3,25
+7,0,2020,5,8,2020,4,30
+7,0,2020,6,6,2020,5,27
+7,0,2020,7,10,2020,7,1
+7,0,2020,8,7,2020,7,29
+7,0,2020,9,5,2020,8,26
+7,0,2020,10,9,2020,9,31
+7,0,2020,11,7,2020,10,28
+1,1,2020,11,8,2020,10,29
+1,1,2000,0,4,1999,11,26
+1,1,2000,1,8,2000,0,30
+1,1,2000,2,7,2000,1,27
+1,1,2000,3,4,2000,2,26
+1,1,2000,4,9,2000,3,30
+1,1,2000,5,6,2000,4,28
+1,1,2000,6,4,2000,5,25
+1,1,2000,7,8,2000,6,30
+1,1,2000,8,5,2000,7,27
+1,1,2000,9,10,2000,9,1
+1,1,2000,10,7,2000,9,29
+1,1,2000,11,5,2000,10,26
+1,1,2001,0,9,2000,11,31
+1,1,2001,1,6,2001,0,28
+1,1,2001,2,6,2001,1,25
+1,1,2001,3,10,2001,3,1
+1,1,2001,4,8,2001,3,29
+1,1,2001,5,5,2001,4,27
+1,1,2001,6,10,2001,6,1
+1,1,2001,7,7,2001,6,29
+1,1,2001,8,4,2001,7,26
+1,1,2001,9,9,2001,8,30
+1,1,2001,10,6,2001,9,28
+1,1,2001,11,4,2001,10,25
+1,1,2002,0,8,2001,11,30
+1,1,2002,1,5,2002,0,27
+1,1,2002,2,5,2002,1,24
+1,1,2002,3,9,2002,2,31
+1,1,2002,4,7,2002,3,28
+1,1,2002,5,4,2002,4,26
+1,1,2002,6,9,2002,5,30
+1,1,2002,7,6,2002,6,28
+1,1,2002,8,10,2002,8,1
+1,1,2002,9,8,2002,8,29
+1,1,2002,10,5,2002,9,27
+1,1,2002,11,10,2002,11,1
+1,1,2003,0,7,2002,11,29
+1,1,2003,1,4,2003,0,26
+1,1,2003,2,4,2003,1,23
+1,1,2003,3,8,2003,2,30
+1,1,2003,4,6,2003,3,27
+1,1,2003,5,10,2003,5,1
+1,1,2003,6,8,2003,5,29
+1,1,2003,7,5,2003,6,27
+1,1,2003,8,9,2003,7,31
+1,1,2003,9,7,2003,8,28
+1,1,2003,10,4,2003,9,26
+1,1,2003,11,9,2003,10,30
+1,1,2004,0,6,2003,11,28
+1,1,2004,1,10,2004,1,1
+1,1,2004,2,9,2004,1,29
+1,1,2004,3,6,2004,2,28
+1,1,2004,4,4,2004,3,25
+1,1,2004,5,8,2004,4,30
+1,1,2004,6,6,2004,5,27
+1,1,2004,7,10,2004,7,1
+1,1,2004,8,7,2004,7,29
+1,1,2004,9,5,2004,8,26
+1,1,2004,10,9,2004,9,31
+1,1,2004,11,7,2004,10,28
+1,1,2005,0,4,2004,11,26
+1,1,2005,1,8,2005,0,30
+1,1,2005,2,8,2005,1,27
+1,1,2005,3,5,2005,2,27
+1,1,2005,4,10,2005,4,1
+1,1,2005,5,7,2005,4,29
+1,1,2005,6,5,2005,5,26
+1,1,2005,7,9,2005,6,31
+1,1,2005,8,6,2005,7,28
+1,1,2005,9,4,2005,8,25
+1,1,2005,10,8,2005,9,30
+1,1,2005,11,6,2005,10,27
+1,1,2006,0,10,2006,0,1
+1,1,2006,1,7,2006,0,29
+1,1,2006,2,7,2006,1,26
+1,1,2006,3,4,2006,2,26
+1,1,2006,4,9,2006,3,30
+1,1,2006,5,6,2006,4,28
+1,1,2006,6,4,2006,5,25
+1,1,2006,7,8,2006,6,30
+1,1,2006,8,5,2006,7,27
+1,1,2006,9,10,2006,9,1
+1,1,2006,10,7,2006,9,29
+1,1,2006,11,5,2006,10,26
+1,1,2007,0,9,2006,11,31
+1,1,2007,1,6,2007,0,28
+1,1,2007,2,6,2007,1,25
+1,1,2007,3,10,2007,3,1
+1,1,2007,4,8,2007,3,29
+1,1,2007,5,5,2007,4,27
+1,1,2007,6,10,2007,6,1
+1,1,2007,7,7,2007,6,29
+1,1,2007,8,4,2007,7,26
+1,1,2007,9,9,2007,8,30
+1,1,2007,10,6,2007,9,28
+1,1,2007,11,4,2007,10,25
+1,1,2008,0,8,2007,11,30
+1,1,2008,1,5,2008,0,27
+1,1,2008,2,4,2008,1,24
+1,1,2008,3,8,2008,2,30
+1,1,2008,4,6,2008,3,27
+1,1,2008,5,10,2008,5,1
+1,1,2008,6,8,2008,5,29
+1,1,2008,7,5,2008,6,27
+1,1,2008,8,9,2008,7,31
+1,1,2008,9,7,2008,8,28
+1,1,2008,10,4,2008,9,26
+1,1,2008,11,9,2008,10,30
+1,1,2009,0,6,2008,11,28
+1,1,2009,1,10,2009,1,1
+1,1,2009,2,10,2009,2,1
+1,1,2009,3,7,2009,2,29
+1,1,2009,4,5,2009,3,26
+1,1,2009,5,9,2009,4,31
+1,1,2009,6,7,2009,5,28
+1,1,2009,7,4,2009,6,26
+1,1,2009,8,8,2009,7,30
+1,1,2009,9,6,2009,8,27
+1,1,2009,10,10,2009,10,1
+1,1,2009,11,8,2009,10,29
+1,1,2010,0,5,2009,11,27
+1,1,2010,1,9,2010,0,31
+1,1,2010,2,9,2010,1,28
+1,1,2010,3,6,2010,2,28
+1,1,2010,4,4,2010,3,25
+1,1,2010,5,8,2010,4,30
+1,1,2010,6,6,2010,5,27
+1,1,2010,7,10,2010,7,1
+1,1,2010,8,7,2010,7,29
+1,1,2010,9,5,2010,8,26
+1,1,2010,10,9,2010,9,31
+1,1,2010,11,7,2010,10,28
+1,1,2011,0,4,2010,11,26
+1,1,2011,1,8,2011,0,30
+1,1,2011,2,8,2011,1,27
+1,1,2011,3,5,2011,2,27
+1,1,2011,4,10,2011,4,1
+1,1,2011,5,7,2011,4,29
+1,1,2011,6,5,2011,5,26
+1,1,2011,7,9,2011,6,31
+1,1,2011,8,6,2011,7,28
+1,1,2011,9,4,2011,8,25
+1,1,2011,10,8,2011,9,30
+1,1,2011,11,6,2011,10,27
+1,1,2012,0,10,2012,0,1
+1,1,2012,1,7,2012,0,29
+1,1,2012,2,6,2012,1,26
+1,1,2012,3,10,2012,3,1
+1,1,2012,4,8,2012,3,29
+1,1,2012,5,5,2012,4,27
+1,1,2012,6,10,2012,6,1
+1,1,2012,7,7,2012,6,29
+1,1,2012,8,4,2012,7,26
+1,1,2012,9,9,2012,8,30
+1,1,2012,10,6,2012,9,28
+1,1,2012,11,4,2012,10,25
+1,1,2013,0,8,2012,11,30
+1,1,2013,1,5,2013,0,27
+1,1,2013,2,5,2013,1,24
+1,1,2013,3,9,2013,2,31
+1,1,2013,4,7,2013,3,28
+1,1,2013,5,4,2013,4,26
+1,1,2013,6,9,2013,5,30
+1,1,2013,7,6,2013,6,28
+1,1,2013,8,10,2013,8,1
+1,1,2013,9,8,2013,8,29
+1,1,2013,10,5,2013,9,27
+1,1,2013,11,10,2013,11,1
+1,1,2014,0,7,2013,11,29
+1,1,2014,1,4,2014,0,26
+1,1,2014,2,4,2014,1,23
+1,1,2014,3,8,2014,2,30
+1,1,2014,4,6,2014,3,27
+1,1,2014,5,10,2014,5,1
+1,1,2014,6,8,2014,5,29
+1,1,2014,7,5,2014,6,27
+1,1,2014,8,9,2014,7,31
+1,1,2014,9,7,2014,8,28
+1,1,2014,10,4,2014,9,26
+1,1,2014,11,9,2014,10,30
+1,1,2015,0,6,2014,11,28
+1,1,2015,1,10,2015,1,1
+1,1,2015,2,10,2015,2,1
+1,1,2015,3,7,2015,2,29
+1,1,2015,4,5,2015,3,26
+1,1,2015,5,9,2015,4,31
+1,1,2015,6,7,2015,5,28
+1,1,2015,7,4,2015,6,26
+1,1,2015,8,8,2015,7,30
+1,1,2015,9,6,2015,8,27
+1,1,2015,10,10,2015,10,1
+1,1,2015,11,8,2015,10,29
+1,1,2016,0,5,2015,11,27
+1,1,2016,1,9,2016,0,31
+1,1,2016,2,8,2016,1,28
+1,1,2016,3,5,2016,2,27
+1,1,2016,4,10,2016,4,1
+1,1,2016,5,7,2016,4,29
+1,1,2016,6,5,2016,5,26
+1,1,2016,7,9,2016,6,31
+1,1,2016,8,6,2016,7,28
+1,1,2016,9,4,2016,8,25
+1,1,2016,10,8,2016,9,30
+1,1,2016,11,6,2016,10,27
+1,1,2017,0,10,2017,0,1
+1,1,2017,1,7,2017,0,29
+1,1,2017,2,7,2017,1,26
+1,1,2017,3,4,2017,2,26
+1,1,2017,4,9,2017,3,30
+1,1,2017,5,6,2017,4,28
+1,1,2017,6,4,2017,5,25
+1,1,2017,7,8,2017,6,30
+1,1,2017,8,5,2017,7,27
+1,1,2017,9,10,2017,9,1
+1,1,2017,10,7,2017,9,29
+1,1,2017,11,5,2017,10,26
+1,1,2018,0,9,2017,11,31
+1,1,2018,1,6,2018,0,28
+1,1,2018,2,6,2018,1,25
+1,1,2018,3,10,2018,3,1
+1,1,2018,4,8,2018,3,29
+1,1,2018,5,5,2018,4,27
+1,1,2018,6,10,2018,6,1
+1,1,2018,7,7,2018,6,29
+1,1,2018,8,4,2018,7,26
+1,1,2018,9,9,2018,8,30
+1,1,2018,10,6,2018,9,28
+1,1,2018,11,4,2018,10,25
+1,1,2019,0,8,2018,11,30
+1,1,2019,1,5,2019,0,27
+1,1,2019,2,5,2019,1,24
+1,1,2019,3,9,2019,2,31
+1,1,2019,4,7,2019,3,28
+1,1,2019,5,4,2019,4,26
+1,1,2019,6,9,2019,5,30
+1,1,2019,7,6,2019,6,28
+1,1,2019,8,10,2019,8,1
+1,1,2019,9,8,2019,8,29
+1,1,2019,10,5,2019,9,27
+1,1,2019,11,10,2019,11,1
+1,1,2020,0,7,2019,11,29
+1,1,2020,1,4,2020,0,26
+1,1,2020,2,10,2020,2,1
+1,1,2020,3,7,2020,2,29
+1,1,2020,4,5,2020,3,26
+1,1,2020,5,9,2020,4,31
+1,1,2020,6,7,2020,5,28
+1,1,2020,7,4,2020,6,26
+1,1,2020,8,8,2020,7,30
+1,1,2020,9,6,2020,8,27
+1,1,2020,10,10,2020,10,1
+1,1,2020,11,8,2020,10,29
+1,1,2021,0,5,2020,11,27
+1,1,2021,1,9,2021,0,31
+2,1,2021,1,10,2021,1,1
+2,1,2000,0,5,1999,11,27
+2,1,2000,1,9,2000,0,31
+2,1,2000,2,8,2000,1,28
+2,1,2000,3,5,2000,2,27
+2,1,2000,4,10,2000,4,1
+2,1,2000,5,7,2000,4,29
+2,1,2000,6,5,2000,5,26
+2,1,2000,7,9,2000,6,31
+2,1,2000,8,6,2000,7,28
+2,1,2000,9,4,2000,8,25
+2,1,2000,10,8,2000,9,30
+2,1,2000,11,6,2000,10,27
+2,1,2001,0,10,2001,0,1
+2,1,2001,1,7,2001,0,29
+2,1,2001,2,7,2001,1,26
+2,1,2001,3,4,2001,2,26
+2,1,2001,4,9,2001,3,30
+2,1,2001,5,6,2001,4,28
+2,1,2001,6,4,2001,5,25
+2,1,2001,7,8,2001,6,30
+2,1,2001,8,5,2001,7,27
+2,1,2001,9,10,2001,9,1
+2,1,2001,10,7,2001,9,29
+2,1,2001,11,5,2001,10,26
+2,1,2002,0,9,2001,11,31
+2,1,2002,1,6,2002,0,28
+2,1,2002,2,6,2002,1,25
+2,1,2002,3,10,2002,3,1
+2,1,2002,4,8,2002,3,29
+2,1,2002,5,5,2002,4,27
+2,1,2002,6,10,2002,6,1
+2,1,2002,7,7,2002,6,29
+2,1,2002,8,4,2002,7,26
+2,1,2002,9,9,2002,8,30
+2,1,2002,10,6,2002,9,28
+2,1,2002,11,4,2002,10,25
+2,1,2003,0,8,2002,11,30
+2,1,2003,1,5,2003,0,27
+2,1,2003,2,5,2003,1,24
+2,1,2003,3,9,2003,2,31
+2,1,2003,4,7,2003,3,28
+2,1,2003,5,4,2003,4,26
+2,1,2003,6,9,2003,5,30
+2,1,2003,7,6,2003,6,28
+2,1,2003,8,10,2003,8,1
+2,1,2003,9,8,2003,8,29
+2,1,2003,10,5,2003,9,27
+2,1,2003,11,10,2003,11,1
+2,1,2004,0,7,2003,11,29
+2,1,2004,1,4,2004,0,26
+2,1,2004,2,10,2004,2,1
+2,1,2004,3,7,2004,2,29
+2,1,2004,4,5,2004,3,26
+2,1,2004,5,9,2004,4,31
+2,1,2004,6,7,2004,5,28
+2,1,2004,7,4,2004,6,26
+2,1,2004,8,8,2004,7,30
+2,1,2004,9,6,2004,8,27
+2,1,2004,10,10,2004,10,1
+2,1,2004,11,8,2004,10,29
+2,1,2005,0,5,2004,11,27
+2,1,2005,1,9,2005,0,31
+2,1,2005,2,9,2005,1,28
+2,1,2005,3,6,2005,2,28
+2,1,2005,4,4,2005,3,25
+2,1,2005,5,8,2005,4,30
+2,1,2005,6,6,2005,5,27
+2,1,2005,7,10,2005,7,1
+2,1,2005,8,7,2005,7,29
+2,1,2005,9,5,2005,8,26
+2,1,2005,10,9,2005,9,31
+2,1,2005,11,7,2005,10,28
+2,1,2006,0,4,2005,11,26
+2,1,2006,1,8,2006,0,30
+2,1,2006,2,8,2006,1,27
+2,1,2006,3,5,2006,2,27
+2,1,2006,4,10,2006,4,1
+2,1,2006,5,7,2006,4,29
+2,1,2006,6,5,2006,5,26
+2,1,2006,7,9,2006,6,31
+2,1,2006,8,6,2006,7,28
+2,1,2006,9,4,2006,8,25
+2,1,2006,10,8,2006,9,30
+2,1,2006,11,6,2006,10,27
+2,1,2007,0,10,2007,0,1
+2,1,2007,1,7,2007,0,29
+2,1,2007,2,7,2007,1,26
+2,1,2007,3,4,2007,2,26
+2,1,2007,4,9,2007,3,30
+2,1,2007,5,6,2007,4,28
+2,1,2007,6,4,2007,5,25
+2,1,2007,7,8,2007,6,30
+2,1,2007,8,5,2007,7,27
+2,1,2007,9,10,2007,9,1
+2,1,2007,10,7,2007,9,29
+2,1,2007,11,5,2007,10,26
+2,1,2008,0,9,2007,11,31
+2,1,2008,1,6,2008,0,28
+2,1,2008,2,5,2008,1,25
+2,1,2008,3,9,2008,2,31
+2,1,2008,4,7,2008,3,28
+2,1,2008,5,4,2008,4,26
+2,1,2008,6,9,2008,5,30
+2,1,2008,7,6,2008,6,28
+2,1,2008,8,10,2008,8,1
+2,1,2008,9,8,2008,8,29
+2,1,2008,10,5,2008,9,27
+2,1,2008,11,10,2008,11,1
+2,1,2009,0,7,2008,11,29
+2,1,2009,1,4,2009,0,26
+2,1,2009,2,4,2009,1,23
+2,1,2009,3,8,2009,2,30
+2,1,2009,4,6,2009,3,27
+2,1,2009,5,10,2009,5,1
+2,1,2009,6,8,2009,5,29
+2,1,2009,7,5,2009,6,27
+2,1,2009,8,9,2009,7,31
+2,1,2009,9,7,2009,8,28
+2,1,2009,10,4,2009,9,26
+2,1,2009,11,9,2009,10,30
+2,1,2010,0,6,2009,11,28
+2,1,2010,1,10,2010,1,1
+2,1,2010,2,10,2010,2,1
+2,1,2010,3,7,2010,2,29
+2,1,2010,4,5,2010,3,26
+2,1,2010,5,9,2010,4,31
+2,1,2010,6,7,2010,5,28
+2,1,2010,7,4,2010,6,26
+2,1,2010,8,8,2010,7,30
+2,1,2010,9,6,2010,8,27
+2,1,2010,10,10,2010,10,1
+2,1,2010,11,8,2010,10,29
+2,1,2011,0,5,2010,11,27
+2,1,2011,1,9,2011,0,31
+2,1,2011,2,9,2011,1,28
+2,1,2011,3,6,2011,2,28
+2,1,2011,4,4,2011,3,25
+2,1,2011,5,8,2011,4,30
+2,1,2011,6,6,2011,5,27
+2,1,2011,7,10,2011,7,1
+2,1,2011,8,7,2011,7,29
+2,1,2011,9,5,2011,8,26
+2,1,2011,10,9,2011,9,31
+2,1,2011,11,7,2011,10,28
+2,1,2012,0,4,2011,11,26
+2,1,2012,1,8,2012,0,30
+2,1,2012,2,7,2012,1,27
+2,1,2012,3,4,2012,2,26
+2,1,2012,4,9,2012,3,30
+2,1,2012,5,6,2012,4,28
+2,1,2012,6,4,2012,5,25
+2,1,2012,7,8,2012,6,30
+2,1,2012,8,5,2012,7,27
+2,1,2012,9,10,2012,9,1
+2,1,2012,10,7,2012,9,29
+2,1,2012,11,5,2012,10,26
+2,1,2013,0,9,2012,11,31
+2,1,2013,1,6,2013,0,28
+2,1,2013,2,6,2013,1,25
+2,1,2013,3,10,2013,3,1
+2,1,2013,4,8,2013,3,29
+2,1,2013,5,5,2013,4,27
+2,1,2013,6,10,2013,6,1
+2,1,2013,7,7,2013,6,29
+2,1,2013,8,4,2013,7,26
+2,1,2013,9,9,2013,8,30
+2,1,2013,10,6,2013,9,28
+2,1,2013,11,4,2013,10,25
+2,1,2014,0,8,2013,11,30
+2,1,2014,1,5,2014,0,27
+2,1,2014,2,5,2014,1,24
+2,1,2014,3,9,2014,2,31
+2,1,2014,4,7,2014,3,28
+2,1,2014,5,4,2014,4,26
+2,1,2014,6,9,2014,5,30
+2,1,2014,7,6,2014,6,28
+2,1,2014,8,10,2014,8,1
+2,1,2014,9,8,2014,8,29
+2,1,2014,10,5,2014,9,27
+2,1,2014,11,10,2014,11,1
+2,1,2015,0,7,2014,11,29
+2,1,2015,1,4,2015,0,26
+2,1,2015,2,4,2015,1,23
+2,1,2015,3,8,2015,2,30
+2,1,2015,4,6,2015,3,27
+2,1,2015,5,10,2015,5,1
+2,1,2015,6,8,2015,5,29
+2,1,2015,7,5,2015,6,27
+2,1,2015,8,9,2015,7,31
+2,1,2015,9,7,2015,8,28
+2,1,2015,10,4,2015,9,26
+2,1,2015,11,9,2015,10,30
+2,1,2016,0,6,2015,11,28
+2,1,2016,1,10,2016,1,1
+2,1,2016,2,9,2016,1,29
+2,1,2016,3,6,2016,2,28
+2,1,2016,4,4,2016,3,25
+2,1,2016,5,8,2016,4,30
+2,1,2016,6,6,2016,5,27
+2,1,2016,7,10,2016,7,1
+2,1,2016,8,7,2016,7,29
+2,1,2016,9,5,2016,8,26
+2,1,2016,10,9,2016,9,31
+2,1,2016,11,7,2016,10,28
+2,1,2017,0,4,2016,11,26
+2,1,2017,1,8,2017,0,30
+2,1,2017,2,8,2017,1,27
+2,1,2017,3,5,2017,2,27
+2,1,2017,4,10,2017,4,1
+2,1,2017,5,7,2017,4,29
+2,1,2017,6,5,2017,5,26
+2,1,2017,7,9,2017,6,31
+2,1,2017,8,6,2017,7,28
+2,1,2017,9,4,2017,8,25
+2,1,2017,10,8,2017,9,30
+2,1,2017,11,6,2017,10,27
+2,1,2018,0,10,2018,0,1
+2,1,2018,1,7,2018,0,29
+2,1,2018,2,7,2018,1,26
+2,1,2018,3,4,2018,2,26
+2,1,2018,4,9,2018,3,30
+2,1,2018,5,6,2018,4,28
+2,1,2018,6,4,2018,5,25
+2,1,2018,7,8,2018,6,30
+2,1,2018,8,5,2018,7,27
+2,1,2018,9,10,2018,9,1
+2,1,2018,10,7,2018,9,29
+2,1,2018,11,5,2018,10,26
+2,1,2019,0,9,2018,11,31
+2,1,2019,1,6,2019,0,28
+2,1,2019,2,6,2019,1,25
+2,1,2019,3,10,2019,3,1
+2,1,2019,4,8,2019,3,29
+2,1,2019,5,5,2019,4,27
+2,1,2019,6,10,2019,6,1
+2,1,2019,7,7,2019,6,29
+2,1,2019,8,4,2019,7,26
+2,1,2019,9,9,2019,8,30
+2,1,2019,10,6,2019,9,28
+2,1,2019,11,4,2019,10,25
+2,1,2020,0,8,2019,11,30
+2,1,2020,1,5,2020,0,27
+2,1,2020,2,4,2020,1,24
+2,1,2020,3,8,2020,2,30
+2,1,2020,4,6,2020,3,27
+2,1,2020,5,10,2020,5,1
+2,1,2020,6,8,2020,5,29
+2,1,2020,7,5,2020,6,27
+2,1,2020,8,9,2020,7,31
+2,1,2020,9,7,2020,8,28
+2,1,2020,10,4,2020,9,26
+2,1,2020,11,9,2020,10,30
+3,1,2020,11,10,2020,11,1
+3,1,2000,0,6,1999,11,28
+3,1,2000,1,10,2000,1,1
+3,1,2000,2,9,2000,1,29
+3,1,2000,3,6,2000,2,28
+3,1,2000,4,4,2000,3,25
+3,1,2000,5,8,2000,4,30
+3,1,2000,6,6,2000,5,27
+3,1,2000,7,10,2000,7,1
+3,1,2000,8,7,2000,7,29
+3,1,2000,9,5,2000,8,26
+3,1,2000,10,9,2000,9,31
+3,1,2000,11,7,2000,10,28
+3,1,2001,0,4,2000,11,26
+3,1,2001,1,8,2001,0,30
+3,1,2001,2,8,2001,1,27
+3,1,2001,3,5,2001,2,27
+3,1,2001,4,10,2001,4,1
+3,1,2001,5,7,2001,4,29
+3,1,2001,6,5,2001,5,26
+3,1,2001,7,9,2001,6,31
+3,1,2001,8,6,2001,7,28
+3,1,2001,9,4,2001,8,25
+3,1,2001,10,8,2001,9,30
+3,1,2001,11,6,2001,10,27
+3,1,2002,0,10,2002,0,1
+3,1,2002,1,7,2002,0,29
+3,1,2002,2,7,2002,1,26
+3,1,2002,3,4,2002,2,26
+3,1,2002,4,9,2002,3,30
+3,1,2002,5,6,2002,4,28
+3,1,2002,6,4,2002,5,25
+3,1,2002,7,8,2002,6,30
+3,1,2002,8,5,2002,7,27
+3,1,2002,9,10,2002,9,1
+3,1,2002,10,7,2002,9,29
+3,1,2002,11,5,2002,10,26
+3,1,2003,0,9,2002,11,31
+3,1,2003,1,6,2003,0,28
+3,1,2003,2,6,2003,1,25
+3,1,2003,3,10,2003,3,1
+3,1,2003,4,8,2003,3,29
+3,1,2003,5,5,2003,4,27
+3,1,2003,6,10,2003,6,1
+3,1,2003,7,7,2003,6,29
+3,1,2003,8,4,2003,7,26
+3,1,2003,9,9,2003,8,30
+3,1,2003,10,6,2003,9,28
+3,1,2003,11,4,2003,10,25
+3,1,2004,0,8,2003,11,30
+3,1,2004,1,5,2004,0,27
+3,1,2004,2,4,2004,1,24
+3,1,2004,3,8,2004,2,30
+3,1,2004,4,6,2004,3,27
+3,1,2004,5,10,2004,5,1
+3,1,2004,6,8,2004,5,29
+3,1,2004,7,5,2004,6,27
+3,1,2004,8,9,2004,7,31
+3,1,2004,9,7,2004,8,28
+3,1,2004,10,4,2004,9,26
+3,1,2004,11,9,2004,10,30
+3,1,2005,0,6,2004,11,28
+3,1,2005,1,10,2005,1,1
+3,1,2005,2,10,2005,2,1
+3,1,2005,3,7,2005,2,29
+3,1,2005,4,5,2005,3,26
+3,1,2005,5,9,2005,4,31
+3,1,2005,6,7,2005,5,28
+3,1,2005,7,4,2005,6,26
+3,1,2005,8,8,2005,7,30
+3,1,2005,9,6,2005,8,27
+3,1,2005,10,10,2005,10,1
+3,1,2005,11,8,2005,10,29
+3,1,2006,0,5,2005,11,27
+3,1,2006,1,9,2006,0,31
+3,1,2006,2,9,2006,1,28
+3,1,2006,3,6,2006,2,28
+3,1,2006,4,4,2006,3,25
+3,1,2006,5,8,2006,4,30
+3,1,2006,6,6,2006,5,27
+3,1,2006,7,10,2006,7,1
+3,1,2006,8,7,2006,7,29
+3,1,2006,9,5,2006,8,26
+3,1,2006,10,9,2006,9,31
+3,1,2006,11,7,2006,10,28
+3,1,2007,0,4,2006,11,26
+3,1,2007,1,8,2007,0,30
+3,1,2007,2,8,2007,1,27
+3,1,2007,3,5,2007,2,27
+3,1,2007,4,10,2007,4,1
+3,1,2007,5,7,2007,4,29
+3,1,2007,6,5,2007,5,26
+3,1,2007,7,9,2007,6,31
+3,1,2007,8,6,2007,7,28
+3,1,2007,9,4,2007,8,25
+3,1,2007,10,8,2007,9,30
+3,1,2007,11,6,2007,10,27
+3,1,2008,0,10,2008,0,1
+3,1,2008,1,7,2008,0,29
+3,1,2008,2,6,2008,1,26
+3,1,2008,3,10,2008,3,1
+3,1,2008,4,8,2008,3,29
+3,1,2008,5,5,2008,4,27
+3,1,2008,6,10,2008,6,1
+3,1,2008,7,7,2008,6,29
+3,1,2008,8,4,2008,7,26
+3,1,2008,9,9,2008,8,30
+3,1,2008,10,6,2008,9,28
+3,1,2008,11,4,2008,10,25
+3,1,2009,0,8,2008,11,30
+3,1,2009,1,5,2009,0,27
+3,1,2009,2,5,2009,1,24
+3,1,2009,3,9,2009,2,31
+3,1,2009,4,7,2009,3,28
+3,1,2009,5,4,2009,4,26
+3,1,2009,6,9,2009,5,30
+3,1,2009,7,6,2009,6,28
+3,1,2009,8,10,2009,8,1
+3,1,2009,9,8,2009,8,29
+3,1,2009,10,5,2009,9,27
+3,1,2009,11,10,2009,11,1
+3,1,2010,0,7,2009,11,29
+3,1,2010,1,4,2010,0,26
+3,1,2010,2,4,2010,1,23
+3,1,2010,3,8,2010,2,30
+3,1,2010,4,6,2010,3,27
+3,1,2010,5,10,2010,5,1
+3,1,2010,6,8,2010,5,29
+3,1,2010,7,5,2010,6,27
+3,1,2010,8,9,2010,7,31
+3,1,2010,9,7,2010,8,28
+3,1,2010,10,4,2010,9,26
+3,1,2010,11,9,2010,10,30
+3,1,2011,0,6,2010,11,28
+3,1,2011,1,10,2011,1,1
+3,1,2011,2,10,2011,2,1
+3,1,2011,3,7,2011,2,29
+3,1,2011,4,5,2011,3,26
+3,1,2011,5,9,2011,4,31
+3,1,2011,6,7,2011,5,28
+3,1,2011,7,4,2011,6,26
+3,1,2011,8,8,2011,7,30
+3,1,2011,9,6,2011,8,27
+3,1,2011,10,10,2011,10,1
+3,1,2011,11,8,2011,10,29
+3,1,2012,0,5,2011,11,27
+3,1,2012,1,9,2012,0,31
+3,1,2012,2,8,2012,1,28
+3,1,2012,3,5,2012,2,27
+3,1,2012,4,10,2012,4,1
+3,1,2012,5,7,2012,4,29
+3,1,2012,6,5,2012,5,26
+3,1,2012,7,9,2012,6,31
+3,1,2012,8,6,2012,7,28
+3,1,2012,9,4,2012,8,25
+3,1,2012,10,8,2012,9,30
+3,1,2012,11,6,2012,10,27
+3,1,2013,0,10,2013,0,1
+3,1,2013,1,7,2013,0,29
+3,1,2013,2,7,2013,1,26
+3,1,2013,3,4,2013,2,26
+3,1,2013,4,9,2013,3,30
+3,1,2013,5,6,2013,4,28
+3,1,2013,6,4,2013,5,25
+3,1,2013,7,8,2013,6,30
+3,1,2013,8,5,2013,7,27
+3,1,2013,9,10,2013,9,1
+3,1,2013,10,7,2013,9,29
+3,1,2013,11,5,2013,10,26
+3,1,2014,0,9,2013,11,31
+3,1,2014,1,6,2014,0,28
+3,1,2014,2,6,2014,1,25
+3,1,2014,3,10,2014,3,1
+3,1,2014,4,8,2014,3,29
+3,1,2014,5,5,2014,4,27
+3,1,2014,6,10,2014,6,1
+3,1,2014,7,7,2014,6,29
+3,1,2014,8,4,2014,7,26
+3,1,2014,9,9,2014,8,30
+3,1,2014,10,6,2014,9,28
+3,1,2014,11,4,2014,10,25
+3,1,2015,0,8,2014,11,30
+3,1,2015,1,5,2015,0,27
+3,1,2015,2,5,2015,1,24
+3,1,2015,3,9,2015,2,31
+3,1,2015,4,7,2015,3,28
+3,1,2015,5,4,2015,4,26
+3,1,2015,6,9,2015,5,30
+3,1,2015,7,6,2015,6,28
+3,1,2015,8,10,2015,8,1
+3,1,2015,9,8,2015,8,29
+3,1,2015,10,5,2015,9,27
+3,1,2015,11,10,2015,11,1
+3,1,2016,0,7,2015,11,29
+3,1,2016,1,4,2016,0,26
+3,1,2016,2,10,2016,2,1
+3,1,2016,3,7,2016,2,29
+3,1,2016,4,5,2016,3,26
+3,1,2016,5,9,2016,4,31
+3,1,2016,6,7,2016,5,28
+3,1,2016,7,4,2016,6,26
+3,1,2016,8,8,2016,7,30
+3,1,2016,9,6,2016,8,27
+3,1,2016,10,10,2016,10,1
+3,1,2016,11,8,2016,10,29
+3,1,2017,0,5,2016,11,27
+3,1,2017,1,9,2017,0,31
+3,1,2017,2,9,2017,1,28
+3,1,2017,3,6,2017,2,28
+3,1,2017,4,4,2017,3,25
+3,1,2017,5,8,2017,4,30
+3,1,2017,6,6,2017,5,27
+3,1,2017,7,10,2017,7,1
+3,1,2017,8,7,2017,7,29
+3,1,2017,9,5,2017,8,26
+3,1,2017,10,9,2017,9,31
+3,1,2017,11,7,2017,10,28
+3,1,2018,0,4,2017,11,26
+3,1,2018,1,8,2018,0,30
+3,1,2018,2,8,2018,1,27
+3,1,2018,3,5,2018,2,27
+3,1,2018,4,10,2018,4,1
+3,1,2018,5,7,2018,4,29
+3,1,2018,6,5,2018,5,26
+3,1,2018,7,9,2018,6,31
+3,1,2018,8,6,2018,7,28
+3,1,2018,9,4,2018,8,25
+3,1,2018,10,8,2018,9,30
+3,1,2018,11,6,2018,10,27
+3,1,2019,0,10,2019,0,1
+3,1,2019,1,7,2019,0,29
+3,1,2019,2,7,2019,1,26
+3,1,2019,3,4,2019,2,26
+3,1,2019,4,9,2019,3,30
+3,1,2019,5,6,2019,4,28
+3,1,2019,6,4,2019,5,25
+3,1,2019,7,8,2019,6,30
+3,1,2019,8,5,2019,7,27
+3,1,2019,9,10,2019,9,1
+3,1,2019,10,7,2019,9,29
+3,1,2019,11,5,2019,10,26
+3,1,2020,0,9,2019,11,31
+3,1,2020,1,6,2020,0,28
+3,1,2020,2,5,2020,1,25
+3,1,2020,3,9,2020,2,31
+3,1,2020,4,7,2020,3,28
+3,1,2020,5,4,2020,4,26
+3,1,2020,6,9,2020,5,30
+3,1,2020,7,6,2020,6,28
+3,1,2020,8,10,2020,8,1
+3,1,2020,9,8,2020,8,29
+3,1,2020,10,5,2020,9,27
+3,1,2020,11,10,2020,11,1
+4,1,2020,11,4,2020,10,25
+4,1,2000,0,7,1999,11,29
+4,1,2000,1,4,2000,0,26
+4,1,2000,2,10,2000,2,1
+4,1,2000,3,7,2000,2,29
+4,1,2000,4,5,2000,3,26
+4,1,2000,5,9,2000,4,31
+4,1,2000,6,7,2000,5,28
+4,1,2000,7,4,2000,6,26
+4,1,2000,8,8,2000,7,30
+4,1,2000,9,6,2000,8,27
+4,1,2000,10,10,2000,10,1
+4,1,2000,11,8,2000,10,29
+4,1,2001,0,5,2000,11,27
+4,1,2001,1,9,2001,0,31
+4,1,2001,2,9,2001,1,28
+4,1,2001,3,6,2001,2,28
+4,1,2001,4,4,2001,3,25
+4,1,2001,5,8,2001,4,30
+4,1,2001,6,6,2001,5,27
+4,1,2001,7,10,2001,7,1
+4,1,2001,8,7,2001,7,29
+4,1,2001,9,5,2001,8,26
+4,1,2001,10,9,2001,9,31
+4,1,2001,11,7,2001,10,28
+4,1,2002,0,4,2001,11,26
+4,1,2002,1,8,2002,0,30
+4,1,2002,2,8,2002,1,27
+4,1,2002,3,5,2002,2,27
+4,1,2002,4,10,2002,4,1
+4,1,2002,5,7,2002,4,29
+4,1,2002,6,5,2002,5,26
+4,1,2002,7,9,2002,6,31
+4,1,2002,8,6,2002,7,28
+4,1,2002,9,4,2002,8,25
+4,1,2002,10,8,2002,9,30
+4,1,2002,11,6,2002,10,27
+4,1,2003,0,10,2003,0,1
+4,1,2003,1,7,2003,0,29
+4,1,2003,2,7,2003,1,26
+4,1,2003,3,4,2003,2,26
+4,1,2003,4,9,2003,3,30
+4,1,2003,5,6,2003,4,28
+4,1,2003,6,4,2003,5,25
+4,1,2003,7,8,2003,6,30
+4,1,2003,8,5,2003,7,27
+4,1,2003,9,10,2003,9,1
+4,1,2003,10,7,2003,9,29
+4,1,2003,11,5,2003,10,26
+4,1,2004,0,9,2003,11,31
+4,1,2004,1,6,2004,0,28
+4,1,2004,2,5,2004,1,25
+4,1,2004,3,9,2004,2,31
+4,1,2004,4,7,2004,3,28
+4,1,2004,5,4,2004,4,26
+4,1,2004,6,9,2004,5,30
+4,1,2004,7,6,2004,6,28
+4,1,2004,8,10,2004,8,1
+4,1,2004,9,8,2004,8,29
+4,1,2004,10,5,2004,9,27
+4,1,2004,11,10,2004,11,1
+4,1,2005,0,7,2004,11,29
+4,1,2005,1,4,2005,0,26
+4,1,2005,2,4,2005,1,23
+4,1,2005,3,8,2005,2,30
+4,1,2005,4,6,2005,3,27
+4,1,2005,5,10,2005,5,1
+4,1,2005,6,8,2005,5,29
+4,1,2005,7,5,2005,6,27
+4,1,2005,8,9,2005,7,31
+4,1,2005,9,7,2005,8,28
+4,1,2005,10,4,2005,9,26
+4,1,2005,11,9,2005,10,30
+4,1,2006,0,6,2005,11,28
+4,1,2006,1,10,2006,1,1
+4,1,2006,2,10,2006,2,1
+4,1,2006,3,7,2006,2,29
+4,1,2006,4,5,2006,3,26
+4,1,2006,5,9,2006,4,31
+4,1,2006,6,7,2006,5,28
+4,1,2006,7,4,2006,6,26
+4,1,2006,8,8,2006,7,30
+4,1,2006,9,6,2006,8,27
+4,1,2006,10,10,2006,10,1
+4,1,2006,11,8,2006,10,29
+4,1,2007,0,5,2006,11,27
+4,1,2007,1,9,2007,0,31
+4,1,2007,2,9,2007,1,28
+4,1,2007,3,6,2007,2,28
+4,1,2007,4,4,2007,3,25
+4,1,2007,5,8,2007,4,30
+4,1,2007,6,6,2007,5,27
+4,1,2007,7,10,2007,7,1
+4,1,2007,8,7,2007,7,29
+4,1,2007,9,5,2007,8,26
+4,1,2007,10,9,2007,9,31
+4,1,2007,11,7,2007,10,28
+4,1,2008,0,4,2007,11,26
+4,1,2008,1,8,2008,0,30
+4,1,2008,2,7,2008,1,27
+4,1,2008,3,4,2008,2,26
+4,1,2008,4,9,2008,3,30
+4,1,2008,5,6,2008,4,28
+4,1,2008,6,4,2008,5,25
+4,1,2008,7,8,2008,6,30
+4,1,2008,8,5,2008,7,27
+4,1,2008,9,10,2008,9,1
+4,1,2008,10,7,2008,9,29
+4,1,2008,11,5,2008,10,26
+4,1,2009,0,9,2008,11,31
+4,1,2009,1,6,2009,0,28
+4,1,2009,2,6,2009,1,25
+4,1,2009,3,10,2009,3,1
+4,1,2009,4,8,2009,3,29
+4,1,2009,5,5,2009,4,27
+4,1,2009,6,10,2009,6,1
+4,1,2009,7,7,2009,6,29
+4,1,2009,8,4,2009,7,26
+4,1,2009,9,9,2009,8,30
+4,1,2009,10,6,2009,9,28
+4,1,2009,11,4,2009,10,25
+4,1,2010,0,8,2009,11,30
+4,1,2010,1,5,2010,0,27
+4,1,2010,2,5,2010,1,24
+4,1,2010,3,9,2010,2,31
+4,1,2010,4,7,2010,3,28
+4,1,2010,5,4,2010,4,26
+4,1,2010,6,9,2010,5,30
+4,1,2010,7,6,2010,6,28
+4,1,2010,8,10,2010,8,1
+4,1,2010,9,8,2010,8,29
+4,1,2010,10,5,2010,9,27
+4,1,2010,11,10,2010,11,1
+4,1,2011,0,7,2010,11,29
+4,1,2011,1,4,2011,0,26
+4,1,2011,2,4,2011,1,23
+4,1,2011,3,8,2011,2,30
+4,1,2011,4,6,2011,3,27
+4,1,2011,5,10,2011,5,1
+4,1,2011,6,8,2011,5,29
+4,1,2011,7,5,2011,6,27
+4,1,2011,8,9,2011,7,31
+4,1,2011,9,7,2011,8,28
+4,1,2011,10,4,2011,9,26
+4,1,2011,11,9,2011,10,30
+4,1,2012,0,6,2011,11,28
+4,1,2012,1,10,2012,1,1
+4,1,2012,2,9,2012,1,29
+4,1,2012,3,6,2012,2,28
+4,1,2012,4,4,2012,3,25
+4,1,2012,5,8,2012,4,30
+4,1,2012,6,6,2012,5,27
+4,1,2012,7,10,2012,7,1
+4,1,2012,8,7,2012,7,29
+4,1,2012,9,5,2012,8,26
+4,1,2012,10,9,2012,9,31
+4,1,2012,11,7,2012,10,28
+4,1,2013,0,4,2012,11,26
+4,1,2013,1,8,2013,0,30
+4,1,2013,2,8,2013,1,27
+4,1,2013,3,5,2013,2,27
+4,1,2013,4,10,2013,4,1
+4,1,2013,5,7,2013,4,29
+4,1,2013,6,5,2013,5,26
+4,1,2013,7,9,2013,6,31
+4,1,2013,8,6,2013,7,28
+4,1,2013,9,4,2013,8,25
+4,1,2013,10,8,2013,9,30
+4,1,2013,11,6,2013,10,27
+4,1,2014,0,10,2014,0,1
+4,1,2014,1,7,2014,0,29
+4,1,2014,2,7,2014,1,26
+4,1,2014,3,4,2014,2,26
+4,1,2014,4,9,2014,3,30
+4,1,2014,5,6,2014,4,28
+4,1,2014,6,4,2014,5,25
+4,1,2014,7,8,2014,6,30
+4,1,2014,8,5,2014,7,27
+4,1,2014,9,10,2014,9,1
+4,1,2014,10,7,2014,9,29
+4,1,2014,11,5,2014,10,26
+4,1,2015,0,9,2014,11,31
+4,1,2015,1,6,2015,0,28
+4,1,2015,2,6,2015,1,25
+4,1,2015,3,10,2015,3,1
+4,1,2015,4,8,2015,3,29
+4,1,2015,5,5,2015,4,27
+4,1,2015,6,10,2015,6,1
+4,1,2015,7,7,2015,6,29
+4,1,2015,8,4,2015,7,26
+4,1,2015,9,9,2015,8,30
+4,1,2015,10,6,2015,9,28
+4,1,2015,11,4,2015,10,25
+4,1,2016,0,8,2015,11,30
+4,1,2016,1,5,2016,0,27
+4,1,2016,2,4,2016,1,24
+4,1,2016,3,8,2016,2,30
+4,1,2016,4,6,2016,3,27
+4,1,2016,5,10,2016,5,1
+4,1,2016,6,8,2016,5,29
+4,1,2016,7,5,2016,6,27
+4,1,2016,8,9,2016,7,31
+4,1,2016,9,7,2016,8,28
+4,1,2016,10,4,2016,9,26
+4,1,2016,11,9,2016,10,30
+4,1,2017,0,6,2016,11,28
+4,1,2017,1,10,2017,1,1
+4,1,2017,2,10,2017,2,1
+4,1,2017,3,7,2017,2,29
+4,1,2017,4,5,2017,3,26
+4,1,2017,5,9,2017,4,31
+4,1,2017,6,7,2017,5,28
+4,1,2017,7,4,2017,6,26
+4,1,2017,8,8,2017,7,30
+4,1,2017,9,6,2017,8,27
+4,1,2017,10,10,2017,10,1
+4,1,2017,11,8,2017,10,29
+4,1,2018,0,5,2017,11,27
+4,1,2018,1,9,2018,0,31
+4,1,2018,2,9,2018,1,28
+4,1,2018,3,6,2018,2,28
+4,1,2018,4,4,2018,3,25
+4,1,2018,5,8,2018,4,30
+4,1,2018,6,6,2018,5,27
+4,1,2018,7,10,2018,7,1
+4,1,2018,8,7,2018,7,29
+4,1,2018,9,5,2018,8,26
+4,1,2018,10,9,2018,9,31
+4,1,2018,11,7,2018,10,28
+4,1,2019,0,4,2018,11,26
+4,1,2019,1,8,2019,0,30
+4,1,2019,2,8,2019,1,27
+4,1,2019,3,5,2019,2,27
+4,1,2019,4,10,2019,4,1
+4,1,2019,5,7,2019,4,29
+4,1,2019,6,5,2019,5,26
+4,1,2019,7,9,2019,6,31
+4,1,2019,8,6,2019,7,28
+4,1,2019,9,4,2019,8,25
+4,1,2019,10,8,2019,9,30
+4,1,2019,11,6,2019,10,27
+4,1,2020,0,10,2020,0,1
+4,1,2020,1,7,2020,0,29
+4,1,2020,2,6,2020,1,26
+4,1,2020,3,10,2020,3,1
+4,1,2020,4,8,2020,3,29
+4,1,2020,5,5,2020,4,27
+4,1,2020,6,10,2020,6,1
+4,1,2020,7,7,2020,6,29
+4,1,2020,8,4,2020,7,26
+4,1,2020,9,9,2020,8,30
+4,1,2020,10,6,2020,9,28
+4,1,2020,11,4,2020,10,25
+4,1,2021,0,8,2020,11,30
+5,1,2021,0,9,2020,11,31
+5,1,2021,0,9,2020,11,31
+5,1,2000,0,8,1999,11,30
+5,1,2000,1,5,2000,0,27
+5,1,2000,2,4,2000,1,24
+5,1,2000,3,8,2000,2,30
+5,1,2000,4,6,2000,3,27
+5,1,2000,5,10,2000,5,1
+5,1,2000,6,8,2000,5,29
+5,1,2000,7,5,2000,6,27
+5,1,2000,8,9,2000,7,31
+5,1,2000,9,7,2000,8,28
+5,1,2000,10,4,2000,9,26
+5,1,2000,11,9,2000,10,30
+5,1,2001,0,6,2000,11,28
+5,1,2001,1,10,2001,1,1
+5,1,2001,2,10,2001,2,1
+5,1,2001,3,7,2001,2,29
+5,1,2001,4,5,2001,3,26
+5,1,2001,5,9,2001,4,31
+5,1,2001,6,7,2001,5,28
+5,1,2001,7,4,2001,6,26
+5,1,2001,8,8,2001,7,30
+5,1,2001,9,6,2001,8,27
+5,1,2001,10,10,2001,10,1
+5,1,2001,11,8,2001,10,29
+5,1,2002,0,5,2001,11,27
+5,1,2002,1,9,2002,0,31
+5,1,2002,2,9,2002,1,28
+5,1,2002,3,6,2002,2,28
+5,1,2002,4,4,2002,3,25
+5,1,2002,5,8,2002,4,30
+5,1,2002,6,6,2002,5,27
+5,1,2002,7,10,2002,7,1
+5,1,2002,8,7,2002,7,29
+5,1,2002,9,5,2002,8,26
+5,1,2002,10,9,2002,9,31
+5,1,2002,11,7,2002,10,28
+5,1,2003,0,4,2002,11,26
+5,1,2003,1,8,2003,0,30
+5,1,2003,2,8,2003,1,27
+5,1,2003,3,5,2003,2,27
+5,1,2003,4,10,2003,4,1
+5,1,2003,5,7,2003,4,29
+5,1,2003,6,5,2003,5,26
+5,1,2003,7,9,2003,6,31
+5,1,2003,8,6,2003,7,28
+5,1,2003,9,4,2003,8,25
+5,1,2003,10,8,2003,9,30
+5,1,2003,11,6,2003,10,27
+5,1,2004,0,10,2004,0,1
+5,1,2004,1,7,2004,0,29
+5,1,2004,2,6,2004,1,26
+5,1,2004,3,10,2004,3,1
+5,1,2004,4,8,2004,3,29
+5,1,2004,5,5,2004,4,27
+5,1,2004,6,10,2004,6,1
+5,1,2004,7,7,2004,6,29
+5,1,2004,8,4,2004,7,26
+5,1,2004,9,9,2004,8,30
+5,1,2004,10,6,2004,9,28
+5,1,2004,11,4,2004,10,25
+5,1,2005,0,8,2004,11,30
+5,1,2005,1,5,2005,0,27
+5,1,2005,2,5,2005,1,24
+5,1,2005,3,9,2005,2,31
+5,1,2005,4,7,2005,3,28
+5,1,2005,5,4,2005,4,26
+5,1,2005,6,9,2005,5,30
+5,1,2005,7,6,2005,6,28
+5,1,2005,8,10,2005,8,1
+5,1,2005,9,8,2005,8,29
+5,1,2005,10,5,2005,9,27
+5,1,2005,11,10,2005,11,1
+5,1,2006,0,7,2005,11,29
+5,1,2006,1,4,2006,0,26
+5,1,2006,2,4,2006,1,23
+5,1,2006,3,8,2006,2,30
+5,1,2006,4,6,2006,3,27
+5,1,2006,5,10,2006,5,1
+5,1,2006,6,8,2006,5,29
+5,1,2006,7,5,2006,6,27
+5,1,2006,8,9,2006,7,31
+5,1,2006,9,7,2006,8,28
+5,1,2006,10,4,2006,9,26
+5,1,2006,11,9,2006,10,30
+5,1,2007,0,6,2006,11,28
+5,1,2007,1,10,2007,1,1
+5,1,2007,2,10,2007,2,1
+5,1,2007,3,7,2007,2,29
+5,1,2007,4,5,2007,3,26
+5,1,2007,5,9,2007,4,31
+5,1,2007,6,7,2007,5,28
+5,1,2007,7,4,2007,6,26
+5,1,2007,8,8,2007,7,30
+5,1,2007,9,6,2007,8,27
+5,1,2007,10,10,2007,10,1
+5,1,2007,11,8,2007,10,29
+5,1,2008,0,5,2007,11,27
+5,1,2008,1,9,2008,0,31
+5,1,2008,2,8,2008,1,28
+5,1,2008,3,5,2008,2,27
+5,1,2008,4,10,2008,4,1
+5,1,2008,5,7,2008,4,29
+5,1,2008,6,5,2008,5,26
+5,1,2008,7,9,2008,6,31
+5,1,2008,8,6,2008,7,28
+5,1,2008,9,4,2008,8,25
+5,1,2008,10,8,2008,9,30
+5,1,2008,11,6,2008,10,27
+5,1,2009,0,10,2009,0,1
+5,1,2009,1,7,2009,0,29
+5,1,2009,2,7,2009,1,26
+5,1,2009,3,4,2009,2,26
+5,1,2009,4,9,2009,3,30
+5,1,2009,5,6,2009,4,28
+5,1,2009,6,4,2009,5,25
+5,1,2009,7,8,2009,6,30
+5,1,2009,8,5,2009,7,27
+5,1,2009,9,10,2009,9,1
+5,1,2009,10,7,2009,9,29
+5,1,2009,11,5,2009,10,26
+5,1,2010,0,9,2009,11,31
+5,1,2010,1,6,2010,0,28
+5,1,2010,2,6,2010,1,25
+5,1,2010,3,10,2010,3,1
+5,1,2010,4,8,2010,3,29
+5,1,2010,5,5,2010,4,27
+5,1,2010,6,10,2010,6,1
+5,1,2010,7,7,2010,6,29
+5,1,2010,8,4,2010,7,26
+5,1,2010,9,9,2010,8,30
+5,1,2010,10,6,2010,9,28
+5,1,2010,11,4,2010,10,25
+5,1,2011,0,8,2010,11,30
+5,1,2011,1,5,2011,0,27
+5,1,2011,2,5,2011,1,24
+5,1,2011,3,9,2011,2,31
+5,1,2011,4,7,2011,3,28
+5,1,2011,5,4,2011,4,26
+5,1,2011,6,9,2011,5,30
+5,1,2011,7,6,2011,6,28
+5,1,2011,8,10,2011,8,1
+5,1,2011,9,8,2011,8,29
+5,1,2011,10,5,2011,9,27
+5,1,2011,11,10,2011,11,1
+5,1,2012,0,7,2011,11,29
+5,1,2012,1,4,2012,0,26
+5,1,2012,2,10,2012,2,1
+5,1,2012,3,7,2012,2,29
+5,1,2012,4,5,2012,3,26
+5,1,2012,5,9,2012,4,31
+5,1,2012,6,7,2012,5,28
+5,1,2012,7,4,2012,6,26
+5,1,2012,8,8,2012,7,30
+5,1,2012,9,6,2012,8,27
+5,1,2012,10,10,2012,10,1
+5,1,2012,11,8,2012,10,29
+5,1,2013,0,5,2012,11,27
+5,1,2013,1,9,2013,0,31
+5,1,2013,2,9,2013,1,28
+5,1,2013,3,6,2013,2,28
+5,1,2013,4,4,2013,3,25
+5,1,2013,5,8,2013,4,30
+5,1,2013,6,6,2013,5,27
+5,1,2013,7,10,2013,7,1
+5,1,2013,8,7,2013,7,29
+5,1,2013,9,5,2013,8,26
+5,1,2013,10,9,2013,9,31
+5,1,2013,11,7,2013,10,28
+5,1,2014,0,4,2013,11,26
+5,1,2014,1,8,2014,0,30
+5,1,2014,2,8,2014,1,27
+5,1,2014,3,5,2014,2,27
+5,1,2014,4,10,2014,4,1
+5,1,2014,5,7,2014,4,29
+5,1,2014,6,5,2014,5,26
+5,1,2014,7,9,2014,6,31
+5,1,2014,8,6,2014,7,28
+5,1,2014,9,4,2014,8,25
+5,1,2014,10,8,2014,9,30
+5,1,2014,11,6,2014,10,27
+5,1,2015,0,10,2015,0,1
+5,1,2015,1,7,2015,0,29
+5,1,2015,2,7,2015,1,26
+5,1,2015,3,4,2015,2,26
+5,1,2015,4,9,2015,3,30
+5,1,2015,5,6,2015,4,28
+5,1,2015,6,4,2015,5,25
+5,1,2015,7,8,2015,6,30
+5,1,2015,8,5,2015,7,27
+5,1,2015,9,10,2015,9,1
+5,1,2015,10,7,2015,9,29
+5,1,2015,11,5,2015,10,26
+5,1,2016,0,9,2015,11,31
+5,1,2016,1,6,2016,0,28
+5,1,2016,2,5,2016,1,25
+5,1,2016,3,9,2016,2,31
+5,1,2016,4,7,2016,3,28
+5,1,2016,5,4,2016,4,26
+5,1,2016,6,9,2016,5,30
+5,1,2016,7,6,2016,6,28
+5,1,2016,8,10,2016,8,1
+5,1,2016,9,8,2016,8,29
+5,1,2016,10,5,2016,9,27
+5,1,2016,11,10,2016,11,1
+5,1,2017,0,7,2016,11,29
+5,1,2017,1,4,2017,0,26
+5,1,2017,2,4,2017,1,23
+5,1,2017,3,8,2017,2,30
+5,1,2017,4,6,2017,3,27
+5,1,2017,5,10,2017,5,1
+5,1,2017,6,8,2017,5,29
+5,1,2017,7,5,2017,6,27
+5,1,2017,8,9,2017,7,31
+5,1,2017,9,7,2017,8,28
+5,1,2017,10,4,2017,9,26
+5,1,2017,11,9,2017,10,30
+5,1,2018,0,6,2017,11,28
+5,1,2018,1,10,2018,1,1
+5,1,2018,2,10,2018,2,1
+5,1,2018,3,7,2018,2,29
+5,1,2018,4,5,2018,3,26
+5,1,2018,5,9,2018,4,31
+5,1,2018,6,7,2018,5,28
+5,1,2018,7,4,2018,6,26
+5,1,2018,8,8,2018,7,30
+5,1,2018,9,6,2018,8,27
+5,1,2018,10,10,2018,10,1
+5,1,2018,11,8,2018,10,29
+5,1,2019,0,5,2018,11,27
+5,1,2019,1,9,2019,0,31
+5,1,2019,2,9,2019,1,28
+5,1,2019,3,6,2019,2,28
+5,1,2019,4,4,2019,3,25
+5,1,2019,5,8,2019,4,30
+5,1,2019,6,6,2019,5,27
+5,1,2019,7,10,2019,7,1
+5,1,2019,8,7,2019,7,29
+5,1,2019,9,5,2019,8,26
+5,1,2019,10,9,2019,9,31
+5,1,2019,11,7,2019,10,28
+5,1,2020,0,4,2019,11,26
+5,1,2020,1,8,2020,0,30
+5,1,2020,2,7,2020,1,27
+5,1,2020,3,4,2020,2,26
+5,1,2020,4,9,2020,3,30
+5,1,2020,5,6,2020,4,28
+5,1,2020,6,4,2020,5,25
+5,1,2020,7,8,2020,6,30
+5,1,2020,8,5,2020,7,27
+5,1,2020,9,10,2020,9,1
+5,1,2020,10,7,2020,9,29
+5,1,2020,11,5,2020,10,26
+6,1,2020,11,6,2020,10,27
+6,1,2000,0,9,1999,11,31
+6,1,2000,1,6,2000,0,28
+6,1,2000,2,5,2000,1,25
+6,1,2000,3,9,2000,2,31
+6,1,2000,4,7,2000,3,28
+6,1,2000,5,4,2000,4,26
+6,1,2000,6,9,2000,5,30
+6,1,2000,7,6,2000,6,28
+6,1,2000,8,10,2000,8,1
+6,1,2000,9,8,2000,8,29
+6,1,2000,10,5,2000,9,27
+6,1,2000,11,10,2000,11,1
+6,1,2001,0,7,2000,11,29
+6,1,2001,1,4,2001,0,26
+6,1,2001,2,4,2001,1,23
+6,1,2001,3,8,2001,2,30
+6,1,2001,4,6,2001,3,27
+6,1,2001,5,10,2001,5,1
+6,1,2001,6,8,2001,5,29
+6,1,2001,7,5,2001,6,27
+6,1,2001,8,9,2001,7,31
+6,1,2001,9,7,2001,8,28
+6,1,2001,10,4,2001,9,26
+6,1,2001,11,9,2001,10,30
+6,1,2002,0,6,2001,11,28
+6,1,2002,1,10,2002,1,1
+6,1,2002,2,10,2002,2,1
+6,1,2002,3,7,2002,2,29
+6,1,2002,4,5,2002,3,26
+6,1,2002,5,9,2002,4,31
+6,1,2002,6,7,2002,5,28
+6,1,2002,7,4,2002,6,26
+6,1,2002,8,8,2002,7,30
+6,1,2002,9,6,2002,8,27
+6,1,2002,10,10,2002,10,1
+6,1,2002,11,8,2002,10,29
+6,1,2003,0,5,2002,11,27
+6,1,2003,1,9,2003,0,31
+6,1,2003,2,9,2003,1,28
+6,1,2003,3,6,2003,2,28
+6,1,2003,4,4,2003,3,25
+6,1,2003,5,8,2003,4,30
+6,1,2003,6,6,2003,5,27
+6,1,2003,7,10,2003,7,1
+6,1,2003,8,7,2003,7,29
+6,1,2003,9,5,2003,8,26
+6,1,2003,10,9,2003,9,31
+6,1,2003,11,7,2003,10,28
+6,1,2004,0,4,2003,11,26
+6,1,2004,1,8,2004,0,30
+6,1,2004,2,7,2004,1,27
+6,1,2004,3,4,2004,2,26
+6,1,2004,4,9,2004,3,30
+6,1,2004,5,6,2004,4,28
+6,1,2004,6,4,2004,5,25
+6,1,2004,7,8,2004,6,30
+6,1,2004,8,5,2004,7,27
+6,1,2004,9,10,2004,9,1
+6,1,2004,10,7,2004,9,29
+6,1,2004,11,5,2004,10,26
+6,1,2005,0,9,2004,11,31
+6,1,2005,1,6,2005,0,28
+6,1,2005,2,6,2005,1,25
+6,1,2005,3,10,2005,3,1
+6,1,2005,4,8,2005,3,29
+6,1,2005,5,5,2005,4,27
+6,1,2005,6,10,2005,6,1
+6,1,2005,7,7,2005,6,29
+6,1,2005,8,4,2005,7,26
+6,1,2005,9,9,2005,8,30
+6,1,2005,10,6,2005,9,28
+6,1,2005,11,4,2005,10,25
+6,1,2006,0,8,2005,11,30
+6,1,2006,1,5,2006,0,27
+6,1,2006,2,5,2006,1,24
+6,1,2006,3,9,2006,2,31
+6,1,2006,4,7,2006,3,28
+6,1,2006,5,4,2006,4,26
+6,1,2006,6,9,2006,5,30
+6,1,2006,7,6,2006,6,28
+6,1,2006,8,10,2006,8,1
+6,1,2006,9,8,2006,8,29
+6,1,2006,10,5,2006,9,27
+6,1,2006,11,10,2006,11,1
+6,1,2007,0,7,2006,11,29
+6,1,2007,1,4,2007,0,26
+6,1,2007,2,4,2007,1,23
+6,1,2007,3,8,2007,2,30
+6,1,2007,4,6,2007,3,27
+6,1,2007,5,10,2007,5,1
+6,1,2007,6,8,2007,5,29
+6,1,2007,7,5,2007,6,27
+6,1,2007,8,9,2007,7,31
+6,1,2007,9,7,2007,8,28
+6,1,2007,10,4,2007,9,26
+6,1,2007,11,9,2007,10,30
+6,1,2008,0,6,2007,11,28
+6,1,2008,1,10,2008,1,1
+6,1,2008,2,9,2008,1,29
+6,1,2008,3,6,2008,2,28
+6,1,2008,4,4,2008,3,25
+6,1,2008,5,8,2008,4,30
+6,1,2008,6,6,2008,5,27
+6,1,2008,7,10,2008,7,1
+6,1,2008,8,7,2008,7,29
+6,1,2008,9,5,2008,8,26
+6,1,2008,10,9,2008,9,31
+6,1,2008,11,7,2008,10,28
+6,1,2009,0,4,2008,11,26
+6,1,2009,1,8,2009,0,30
+6,1,2009,2,8,2009,1,27
+6,1,2009,3,5,2009,2,27
+6,1,2009,4,10,2009,4,1
+6,1,2009,5,7,2009,4,29
+6,1,2009,6,5,2009,5,26
+6,1,2009,7,9,2009,6,31
+6,1,2009,8,6,2009,7,28
+6,1,2009,9,4,2009,8,25
+6,1,2009,10,8,2009,9,30
+6,1,2009,11,6,2009,10,27
+6,1,2010,0,10,2010,0,1
+6,1,2010,1,7,2010,0,29
+6,1,2010,2,7,2010,1,26
+6,1,2010,3,4,2010,2,26
+6,1,2010,4,9,2010,3,30
+6,1,2010,5,6,2010,4,28
+6,1,2010,6,4,2010,5,25
+6,1,2010,7,8,2010,6,30
+6,1,2010,8,5,2010,7,27
+6,1,2010,9,10,2010,9,1
+6,1,2010,10,7,2010,9,29
+6,1,2010,11,5,2010,10,26
+6,1,2011,0,9,2010,11,31
+6,1,2011,1,6,2011,0,28
+6,1,2011,2,6,2011,1,25
+6,1,2011,3,10,2011,3,1
+6,1,2011,4,8,2011,3,29
+6,1,2011,5,5,2011,4,27
+6,1,2011,6,10,2011,6,1
+6,1,2011,7,7,2011,6,29
+6,1,2011,8,4,2011,7,26
+6,1,2011,9,9,2011,8,30
+6,1,2011,10,6,2011,9,28
+6,1,2011,11,4,2011,10,25
+6,1,2012,0,8,2011,11,30
+6,1,2012,1,5,2012,0,27
+6,1,2012,2,4,2012,1,24
+6,1,2012,3,8,2012,2,30
+6,1,2012,4,6,2012,3,27
+6,1,2012,5,10,2012,5,1
+6,1,2012,6,8,2012,5,29
+6,1,2012,7,5,2012,6,27
+6,1,2012,8,9,2012,7,31
+6,1,2012,9,7,2012,8,28
+6,1,2012,10,4,2012,9,26
+6,1,2012,11,9,2012,10,30
+6,1,2013,0,6,2012,11,28
+6,1,2013,1,10,2013,1,1
+6,1,2013,2,10,2013,2,1
+6,1,2013,3,7,2013,2,29
+6,1,2013,4,5,2013,3,26
+6,1,2013,5,9,2013,4,31
+6,1,2013,6,7,2013,5,28
+6,1,2013,7,4,2013,6,26
+6,1,2013,8,8,2013,7,30
+6,1,2013,9,6,2013,8,27
+6,1,2013,10,10,2013,10,1
+6,1,2013,11,8,2013,10,29
+6,1,2014,0,5,2013,11,27
+6,1,2014,1,9,2014,0,31
+6,1,2014,2,9,2014,1,28
+6,1,2014,3,6,2014,2,28
+6,1,2014,4,4,2014,3,25
+6,1,2014,5,8,2014,4,30
+6,1,2014,6,6,2014,5,27
+6,1,2014,7,10,2014,7,1
+6,1,2014,8,7,2014,7,29
+6,1,2014,9,5,2014,8,26
+6,1,2014,10,9,2014,9,31
+6,1,2014,11,7,2014,10,28
+6,1,2015,0,4,2014,11,26
+6,1,2015,1,8,2015,0,30
+6,1,2015,2,8,2015,1,27
+6,1,2015,3,5,2015,2,27
+6,1,2015,4,10,2015,4,1
+6,1,2015,5,7,2015,4,29
+6,1,2015,6,5,2015,5,26
+6,1,2015,7,9,2015,6,31
+6,1,2015,8,6,2015,7,28
+6,1,2015,9,4,2015,8,25
+6,1,2015,10,8,2015,9,30
+6,1,2015,11,6,2015,10,27
+6,1,2016,0,10,2016,0,1
+6,1,2016,1,7,2016,0,29
+6,1,2016,2,6,2016,1,26
+6,1,2016,3,10,2016,3,1
+6,1,2016,4,8,2016,3,29
+6,1,2016,5,5,2016,4,27
+6,1,2016,6,10,2016,6,1
+6,1,2016,7,7,2016,6,29
+6,1,2016,8,4,2016,7,26
+6,1,2016,9,9,2016,8,30
+6,1,2016,10,6,2016,9,28
+6,1,2016,11,4,2016,10,25
+6,1,2017,0,8,2016,11,30
+6,1,2017,1,5,2017,0,27
+6,1,2017,2,5,2017,1,24
+6,1,2017,3,9,2017,2,31
+6,1,2017,4,7,2017,3,28
+6,1,2017,5,4,2017,4,26
+6,1,2017,6,9,2017,5,30
+6,1,2017,7,6,2017,6,28
+6,1,2017,8,10,2017,8,1
+6,1,2017,9,8,2017,8,29
+6,1,2017,10,5,2017,9,27
+6,1,2017,11,10,2017,11,1
+6,1,2018,0,7,2017,11,29
+6,1,2018,1,4,2018,0,26
+6,1,2018,2,4,2018,1,23
+6,1,2018,3,8,2018,2,30
+6,1,2018,4,6,2018,3,27
+6,1,2018,5,10,2018,5,1
+6,1,2018,6,8,2018,5,29
+6,1,2018,7,5,2018,6,27
+6,1,2018,8,9,2018,7,31
+6,1,2018,9,7,2018,8,28
+6,1,2018,10,4,2018,9,26
+6,1,2018,11,9,2018,10,30
+6,1,2019,0,6,2018,11,28
+6,1,2019,1,10,2019,1,1
+6,1,2019,2,10,2019,2,1
+6,1,2019,3,7,2019,2,29
+6,1,2019,4,5,2019,3,26
+6,1,2019,5,9,2019,4,31
+6,1,2019,6,7,2019,5,28
+6,1,2019,7,4,2019,6,26
+6,1,2019,8,8,2019,7,30
+6,1,2019,9,6,2019,8,27
+6,1,2019,10,10,2019,10,1
+6,1,2019,11,8,2019,10,29
+6,1,2020,0,5,2019,11,27
+6,1,2020,1,9,2020,0,31
+6,1,2020,2,8,2020,1,28
+6,1,2020,3,5,2020,2,27
+6,1,2020,4,10,2020,4,1
+6,1,2020,5,7,2020,4,29
+6,1,2020,6,5,2020,5,26
+6,1,2020,7,9,2020,6,31
+6,1,2020,8,6,2020,7,28
+6,1,2020,9,4,2020,8,25
+6,1,2020,10,8,2020,9,30
+6,1,2020,11,6,2020,10,27
+7,1,2020,11,7,2020,10,28
+7,1,2000,0,10,2000,0,1
+7,1,2000,1,7,2000,0,29
+7,1,2000,2,6,2000,1,26
+7,1,2000,3,10,2000,3,1
+7,1,2000,4,8,2000,3,29
+7,1,2000,5,5,2000,4,27
+7,1,2000,6,10,2000,6,1
+7,1,2000,7,7,2000,6,29
+7,1,2000,8,4,2000,7,26
+7,1,2000,9,9,2000,8,30
+7,1,2000,10,6,2000,9,28
+7,1,2000,11,4,2000,10,25
+7,1,2001,0,8,2000,11,30
+7,1,2001,1,5,2001,0,27
+7,1,2001,2,5,2001,1,24
+7,1,2001,3,9,2001,2,31
+7,1,2001,4,7,2001,3,28
+7,1,2001,5,4,2001,4,26
+7,1,2001,6,9,2001,5,30
+7,1,2001,7,6,2001,6,28
+7,1,2001,8,10,2001,8,1
+7,1,2001,9,8,2001,8,29
+7,1,2001,10,5,2001,9,27
+7,1,2001,11,10,2001,11,1
+7,1,2002,0,7,2001,11,29
+7,1,2002,1,4,2002,0,26
+7,1,2002,2,4,2002,1,23
+7,1,2002,3,8,2002,2,30
+7,1,2002,4,6,2002,3,27
+7,1,2002,5,10,2002,5,1
+7,1,2002,6,8,2002,5,29
+7,1,2002,7,5,2002,6,27
+7,1,2002,8,9,2002,7,31
+7,1,2002,9,7,2002,8,28
+7,1,2002,10,4,2002,9,26
+7,1,2002,11,9,2002,10,30
+7,1,2003,0,6,2002,11,28
+7,1,2003,1,10,2003,1,1
+7,1,2003,2,10,2003,2,1
+7,1,2003,3,7,2003,2,29
+7,1,2003,4,5,2003,3,26
+7,1,2003,5,9,2003,4,31
+7,1,2003,6,7,2003,5,28
+7,1,2003,7,4,2003,6,26
+7,1,2003,8,8,2003,7,30
+7,1,2003,9,6,2003,8,27
+7,1,2003,10,10,2003,10,1
+7,1,2003,11,8,2003,10,29
+7,1,2004,0,5,2003,11,27
+7,1,2004,1,9,2004,0,31
+7,1,2004,2,8,2004,1,28
+7,1,2004,3,5,2004,2,27
+7,1,2004,4,10,2004,4,1
+7,1,2004,5,7,2004,4,29
+7,1,2004,6,5,2004,5,26
+7,1,2004,7,9,2004,6,31
+7,1,2004,8,6,2004,7,28
+7,1,2004,9,4,2004,8,25
+7,1,2004,10,8,2004,9,30
+7,1,2004,11,6,2004,10,27
+7,1,2005,0,10,2005,0,1
+7,1,2005,1,7,2005,0,29
+7,1,2005,2,7,2005,1,26
+7,1,2005,3,4,2005,2,26
+7,1,2005,4,9,2005,3,30
+7,1,2005,5,6,2005,4,28
+7,1,2005,6,4,2005,5,25
+7,1,2005,7,8,2005,6,30
+7,1,2005,8,5,2005,7,27
+7,1,2005,9,10,2005,9,1
+7,1,2005,10,7,2005,9,29
+7,1,2005,11,5,2005,10,26
+7,1,2006,0,9,2005,11,31
+7,1,2006,1,6,2006,0,28
+7,1,2006,2,6,2006,1,25
+7,1,2006,3,10,2006,3,1
+7,1,2006,4,8,2006,3,29
+7,1,2006,5,5,2006,4,27
+7,1,2006,6,10,2006,6,1
+7,1,2006,7,7,2006,6,29
+7,1,2006,8,4,2006,7,26
+7,1,2006,9,9,2006,8,30
+7,1,2006,10,6,2006,9,28
+7,1,2006,11,4,2006,10,25
+7,1,2007,0,8,2006,11,30
+7,1,2007,1,5,2007,0,27
+7,1,2007,2,5,2007,1,24
+7,1,2007,3,9,2007,2,31
+7,1,2007,4,7,2007,3,28
+7,1,2007,5,4,2007,4,26
+7,1,2007,6,9,2007,5,30
+7,1,2007,7,6,2007,6,28
+7,1,2007,8,10,2007,8,1
+7,1,2007,9,8,2007,8,29
+7,1,2007,10,5,2007,9,27
+7,1,2007,11,10,2007,11,1
+7,1,2008,0,7,2007,11,29
+7,1,2008,1,4,2008,0,26
+7,1,2008,2,10,2008,2,1
+7,1,2008,3,7,2008,2,29
+7,1,2008,4,5,2008,3,26
+7,1,2008,5,9,2008,4,31
+7,1,2008,6,7,2008,5,28
+7,1,2008,7,4,2008,6,26
+7,1,2008,8,8,2008,7,30
+7,1,2008,9,6,2008,8,27
+7,1,2008,10,10,2008,10,1
+7,1,2008,11,8,2008,10,29
+7,1,2009,0,5,2008,11,27
+7,1,2009,1,9,2009,0,31
+7,1,2009,2,9,2009,1,28
+7,1,2009,3,6,2009,2,28
+7,1,2009,4,4,2009,3,25
+7,1,2009,5,8,2009,4,30
+7,1,2009,6,6,2009,5,27
+7,1,2009,7,10,2009,7,1
+7,1,2009,8,7,2009,7,29
+7,1,2009,9,5,2009,8,26
+7,1,2009,10,9,2009,9,31
+7,1,2009,11,7,2009,10,28
+7,1,2010,0,4,2009,11,26
+7,1,2010,1,8,2010,0,30
+7,1,2010,2,8,2010,1,27
+7,1,2010,3,5,2010,2,27
+7,1,2010,4,10,2010,4,1
+7,1,2010,5,7,2010,4,29
+7,1,2010,6,5,2010,5,26
+7,1,2010,7,9,2010,6,31
+7,1,2010,8,6,2010,7,28
+7,1,2010,9,4,2010,8,25
+7,1,2010,10,8,2010,9,30
+7,1,2010,11,6,2010,10,27
+7,1,2011,0,10,2011,0,1
+7,1,2011,1,7,2011,0,29
+7,1,2011,2,7,2011,1,26
+7,1,2011,3,4,2011,2,26
+7,1,2011,4,9,2011,3,30
+7,1,2011,5,6,2011,4,28
+7,1,2011,6,4,2011,5,25
+7,1,2011,7,8,2011,6,30
+7,1,2011,8,5,2011,7,27
+7,1,2011,9,10,2011,9,1
+7,1,2011,10,7,2011,9,29
+7,1,2011,11,5,2011,10,26
+7,1,2012,0,9,2011,11,31
+7,1,2012,1,6,2012,0,28
+7,1,2012,2,5,2012,1,25
+7,1,2012,3,9,2012,2,31
+7,1,2012,4,7,2012,3,28
+7,1,2012,5,4,2012,4,26
+7,1,2012,6,9,2012,5,30
+7,1,2012,7,6,2012,6,28
+7,1,2012,8,10,2012,8,1
+7,1,2012,9,8,2012,8,29
+7,1,2012,10,5,2012,9,27
+7,1,2012,11,10,2012,11,1
+7,1,2013,0,7,2012,11,29
+7,1,2013,1,4,2013,0,26
+7,1,2013,2,4,2013,1,23
+7,1,2013,3,8,2013,2,30
+7,1,2013,4,6,2013,3,27
+7,1,2013,5,10,2013,5,1
+7,1,2013,6,8,2013,5,29
+7,1,2013,7,5,2013,6,27
+7,1,2013,8,9,2013,7,31
+7,1,2013,9,7,2013,8,28
+7,1,2013,10,4,2013,9,26
+7,1,2013,11,9,2013,10,30
+7,1,2014,0,6,2013,11,28
+7,1,2014,1,10,2014,1,1
+7,1,2014,2,10,2014,2,1
+7,1,2014,3,7,2014,2,29
+7,1,2014,4,5,2014,3,26
+7,1,2014,5,9,2014,4,31
+7,1,2014,6,7,2014,5,28
+7,1,2014,7,4,2014,6,26
+7,1,2014,8,8,2014,7,30
+7,1,2014,9,6,2014,8,27
+7,1,2014,10,10,2014,10,1
+7,1,2014,11,8,2014,10,29
+7,1,2015,0,5,2014,11,27
+7,1,2015,1,9,2015,0,31
+7,1,2015,2,9,2015,1,28
+7,1,2015,3,6,2015,2,28
+7,1,2015,4,4,2015,3,25
+7,1,2015,5,8,2015,4,30
+7,1,2015,6,6,2015,5,27
+7,1,2015,7,10,2015,7,1
+7,1,2015,8,7,2015,7,29
+7,1,2015,9,5,2015,8,26
+7,1,2015,10,9,2015,9,31
+7,1,2015,11,7,2015,10,28
+7,1,2016,0,4,2015,11,26
+7,1,2016,1,8,2016,0,30
+7,1,2016,2,7,2016,1,27
+7,1,2016,3,4,2016,2,26
+7,1,2016,4,9,2016,3,30
+7,1,2016,5,6,2016,4,28
+7,1,2016,6,4,2016,5,25
+7,1,2016,7,8,2016,6,30
+7,1,2016,8,5,2016,7,27
+7,1,2016,9,10,2016,9,1
+7,1,2016,10,7,2016,9,29
+7,1,2016,11,5,2016,10,26
+7,1,2017,0,9,2016,11,31
+7,1,2017,1,6,2017,0,28
+7,1,2017,2,6,2017,1,25
+7,1,2017,3,10,2017,3,1
+7,1,2017,4,8,2017,3,29
+7,1,2017,5,5,2017,4,27
+7,1,2017,6,10,2017,6,1
+7,1,2017,7,7,2017,6,29
+7,1,2017,8,4,2017,7,26
+7,1,2017,9,9,2017,8,30
+7,1,2017,10,6,2017,9,28
+7,1,2017,11,4,2017,10,25
+7,1,2018,0,8,2017,11,30
+7,1,2018,1,5,2018,0,27
+7,1,2018,2,5,2018,1,24
+7,1,2018,3,9,2018,2,31
+7,1,2018,4,7,2018,3,28
+7,1,2018,5,4,2018,4,26
+7,1,2018,6,9,2018,5,30
+7,1,2018,7,6,2018,6,28
+7,1,2018,8,10,2018,8,1
+7,1,2018,9,8,2018,8,29
+7,1,2018,10,5,2018,9,27
+7,1,2018,11,10,2018,11,1
+7,1,2019,0,7,2018,11,29
+7,1,2019,1,4,2019,0,26
+7,1,2019,2,4,2019,1,23
+7,1,2019,3,8,2019,2,30
+7,1,2019,4,6,2019,3,27
+7,1,2019,5,10,2019,5,1
+7,1,2019,6,8,2019,5,29
+7,1,2019,7,5,2019,6,27
+7,1,2019,8,9,2019,7,31
+7,1,2019,9,7,2019,8,28
+7,1,2019,10,4,2019,9,26
+7,1,2019,11,9,2019,10,30
+7,1,2020,0,6,2019,11,28
+7,1,2020,1,10,2020,1,1
+7,1,2020,2,9,2020,1,29
+7,1,2020,3,6,2020,2,28
+7,1,2020,4,4,2020,3,25
+7,1,2020,5,8,2020,4,30
+7,1,2020,6,6,2020,5,27
+7,1,2020,7,10,2020,7,1
+7,1,2020,8,7,2020,7,29
+7,1,2020,9,5,2020,8,26
+7,1,2020,10,9,2020,9,31
+7,1,2020,11,7,2020,10,28
\ No newline at end of file
diff --git a/src/test/resources/displayedDaysForWeekViewCalculationTestData.txt b/src/test/resources/displayedDaysForWeekViewCalculationTestData.txt
new file mode 100644
index 0000000..7e411ac
--- /dev/null
+++ b/src/test/resources/displayedDaysForWeekViewCalculationTestData.txt
@@ -0,0 +1,792 @@
+1,0,2009,11,31,2009,11,28,2010,0,2
+1,0,2010,0,7,2010,0,4,2010,0,9
+1,0,2010,0,14,2010,0,11,2010,0,16
+1,0,2010,0,21,2010,0,18,2010,0,23
+1,0,2010,0,28,2010,0,25,2010,0,30
+1,0,2010,1,4,2010,1,1,2010,1,6
+1,0,2010,1,11,2010,1,8,2010,1,13
+1,0,2010,1,18,2010,1,15,2010,1,20
+1,0,2010,1,25,2010,1,22,2010,1,27
+1,0,2010,2,4,2010,2,1,2010,2,6
+1,0,2010,2,11,2010,2,8,2010,2,13
+1,0,2010,2,18,2010,2,15,2010,2,20
+1,0,2010,2,25,2010,2,22,2010,2,27
+1,0,2010,3,1,2010,2,29,2010,3,3
+1,0,2010,3,8,2010,3,5,2010,3,10
+1,0,2010,3,15,2010,3,12,2010,3,17
+1,0,2010,3,22,2010,3,19,2010,3,24
+1,0,2010,3,29,2010,3,26,2010,4,1
+1,0,2010,4,6,2010,4,3,2010,4,8
+1,0,2010,4,13,2010,4,10,2010,4,15
+1,0,2010,4,20,2010,4,17,2010,4,22
+1,0,2010,4,27,2010,4,24,2010,4,29
+1,0,2010,5,3,2010,4,31,2010,5,5
+1,0,2010,5,10,2010,5,7,2010,5,12
+1,0,2010,5,17,2010,5,14,2010,5,19
+1,0,2010,5,24,2010,5,21,2010,5,26
+1,0,2010,6,1,2010,5,28,2010,6,3
+1,0,2010,6,8,2010,6,5,2010,6,10
+1,0,2010,6,15,2010,6,12,2010,6,17
+1,0,2010,6,22,2010,6,19,2010,6,24
+1,0,2010,6,29,2010,6,26,2010,6,31
+1,0,2010,7,5,2010,7,2,2010,7,7
+1,0,2010,7,12,2010,7,9,2010,7,14
+1,0,2010,7,19,2010,7,16,2010,7,21
+1,0,2010,7,26,2010,7,23,2010,7,28
+1,0,2010,8,2,2010,7,30,2010,8,4
+1,0,2010,8,9,2010,8,6,2010,8,11
+1,0,2010,8,16,2010,8,13,2010,8,18
+1,0,2010,8,23,2010,8,20,2010,8,25
+1,0,2010,8,30,2010,8,27,2010,9,2
+1,0,2010,9,7,2010,9,4,2010,9,9
+1,0,2010,9,14,2010,9,11,2010,9,16
+1,0,2010,9,21,2010,9,18,2010,9,23
+1,0,2010,9,28,2010,9,25,2010,9,30
+1,0,2010,10,4,2010,10,1,2010,10,6
+1,0,2010,10,11,2010,10,8,2010,10,13
+1,0,2010,10,18,2010,10,15,2010,10,20
+1,0,2010,10,25,2010,10,22,2010,10,27
+1,0,2010,11,2,2010,10,29,2010,11,4
+1,0,2010,11,9,2010,11,6,2010,11,11
+1,0,2010,11,16,2010,11,13,2010,11,18
+1,0,2010,11,23,2010,11,20,2010,11,25
+1,0,2010,11,30,2010,11,27,2011,0,1
+1,0,2011,0,6,2011,0,3,2011,0,8
+2,0,2011,0,6,2011,0,3,2011,0,8
+2,0,2009,11,31,2009,11,28,2010,0,2
+2,0,2009,11,31,2009,11,28,2010,0,2
+2,0,2010,0,7,2010,0,4,2010,0,9
+2,0,2010,0,14,2010,0,11,2010,0,16
+2,0,2010,0,21,2010,0,18,2010,0,23
+2,0,2010,0,28,2010,0,25,2010,0,30
+2,0,2010,1,4,2010,1,1,2010,1,6
+2,0,2010,1,11,2010,1,8,2010,1,13
+2,0,2010,1,18,2010,1,15,2010,1,20
+2,0,2010,1,25,2010,1,22,2010,1,27
+2,0,2010,2,4,2010,2,1,2010,2,6
+2,0,2010,2,11,2010,2,8,2010,2,13
+2,0,2010,2,18,2010,2,15,2010,2,20
+2,0,2010,2,25,2010,2,22,2010,2,27
+2,0,2010,3,1,2010,2,29,2010,3,3
+2,0,2010,3,8,2010,3,5,2010,3,10
+2,0,2010,3,15,2010,3,12,2010,3,17
+2,0,2010,3,22,2010,3,19,2010,3,24
+2,0,2010,3,29,2010,3,26,2010,4,1
+2,0,2010,4,6,2010,4,3,2010,4,8
+2,0,2010,4,13,2010,4,10,2010,4,15
+2,0,2010,4,20,2010,4,17,2010,4,22
+2,0,2010,4,27,2010,4,24,2010,4,29
+2,0,2010,5,3,2010,4,31,2010,5,5
+2,0,2010,5,10,2010,5,7,2010,5,12
+2,0,2010,5,17,2010,5,14,2010,5,19
+2,0,2010,5,24,2010,5,21,2010,5,26
+2,0,2010,6,1,2010,5,28,2010,6,3
+2,0,2010,6,8,2010,6,5,2010,6,10
+2,0,2010,6,15,2010,6,12,2010,6,17
+2,0,2010,6,22,2010,6,19,2010,6,24
+2,0,2010,6,29,2010,6,26,2010,6,31
+2,0,2010,7,5,2010,7,2,2010,7,7
+2,0,2010,7,12,2010,7,9,2010,7,14
+2,0,2010,7,19,2010,7,16,2010,7,21
+2,0,2010,7,26,2010,7,23,2010,7,28
+2,0,2010,8,2,2010,7,30,2010,8,4
+2,0,2010,8,9,2010,8,6,2010,8,11
+2,0,2010,8,16,2010,8,13,2010,8,18
+2,0,2010,8,23,2010,8,20,2010,8,25
+2,0,2010,8,30,2010,8,27,2010,9,2
+2,0,2010,9,7,2010,9,4,2010,9,9
+2,0,2010,9,14,2010,9,11,2010,9,16
+2,0,2010,9,21,2010,9,18,2010,9,23
+2,0,2010,9,28,2010,9,25,2010,9,30
+2,0,2010,10,4,2010,10,1,2010,10,6
+2,0,2010,10,11,2010,10,8,2010,10,13
+2,0,2010,10,18,2010,10,15,2010,10,20
+2,0,2010,10,25,2010,10,22,2010,10,27
+2,0,2010,11,2,2010,10,29,2010,11,4
+2,0,2010,11,9,2010,11,6,2010,11,11
+2,0,2010,11,16,2010,11,13,2010,11,18
+2,0,2010,11,23,2010,11,20,2010,11,25
+2,0,2010,11,30,2010,11,27,2011,0,1
+2,0,2011,0,6,2011,0,3,2011,0,8
+3,0,2011,0,7,2011,0,4,2011,0,11
+3,0,2010,0,1,2009,11,29,2010,0,5
+3,0,2010,0,8,2010,0,5,2010,0,12
+3,0,2010,0,15,2010,0,12,2010,0,19
+3,0,2010,0,22,2010,0,19,2010,0,26
+3,0,2010,0,29,2010,0,26,2010,1,2
+3,0,2010,1,5,2010,1,2,2010,1,9
+3,0,2010,1,12,2010,1,9,2010,1,16
+3,0,2010,1,19,2010,1,16,2010,1,23
+3,0,2010,1,26,2010,1,23,2010,2,2
+3,0,2010,2,5,2010,2,2,2010,2,9
+3,0,2010,2,12,2010,2,9,2010,2,16
+3,0,2010,2,19,2010,2,16,2010,2,23
+3,0,2010,2,26,2010,2,23,2010,2,30
+3,0,2010,3,2,2010,2,30,2010,3,6
+3,0,2010,3,9,2010,3,6,2010,3,13
+3,0,2010,3,16,2010,3,13,2010,3,20
+3,0,2010,3,23,2010,3,20,2010,3,27
+3,0,2010,3,30,2010,3,27,2010,4,4
+3,0,2010,4,7,2010,4,4,2010,4,11
+3,0,2010,4,14,2010,4,11,2010,4,18
+3,0,2010,4,21,2010,4,18,2010,4,25
+3,0,2010,4,28,2010,4,25,2010,5,1
+3,0,2010,5,4,2010,5,1,2010,5,8
+3,0,2010,5,11,2010,5,8,2010,5,15
+3,0,2010,5,18,2010,5,15,2010,5,22
+3,0,2010,5,25,2010,5,22,2010,5,29
+3,0,2010,6,2,2010,5,29,2010,6,6
+3,0,2010,6,9,2010,6,6,2010,6,13
+3,0,2010,6,16,2010,6,13,2010,6,20
+3,0,2010,6,23,2010,6,20,2010,6,27
+3,0,2010,6,30,2010,6,27,2010,7,3
+3,0,2010,7,6,2010,7,3,2010,7,10
+3,0,2010,7,13,2010,7,10,2010,7,17
+3,0,2010,7,20,2010,7,17,2010,7,24
+3,0,2010,7,27,2010,7,24,2010,7,31
+3,0,2010,8,3,2010,7,31,2010,8,7
+3,0,2010,8,10,2010,8,7,2010,8,14
+3,0,2010,8,17,2010,8,14,2010,8,21
+3,0,2010,8,24,2010,8,21,2010,8,28
+3,0,2010,9,1,2010,8,28,2010,9,5
+3,0,2010,9,8,2010,9,5,2010,9,12
+3,0,2010,9,15,2010,9,12,2010,9,19
+3,0,2010,9,22,2010,9,19,2010,9,26
+3,0,2010,9,29,2010,9,26,2010,10,2
+3,0,2010,10,5,2010,10,2,2010,10,9
+3,0,2010,10,12,2010,10,9,2010,10,16
+3,0,2010,10,19,2010,10,16,2010,10,23
+3,0,2010,10,26,2010,10,23,2010,10,30
+3,0,2010,11,3,2010,10,30,2010,11,7
+4,0,2010,11,4,2010,11,1,2010,11,8
+4,0,2010,0,2,2009,11,30,2010,0,6
+4,0,2010,0,9,2010,0,6,2010,0,13
+4,0,2010,0,16,2010,0,13,2010,0,20
+4,0,2010,0,23,2010,0,20,2010,0,27
+4,0,2010,0,30,2010,0,27,2010,1,3
+4,0,2010,1,6,2010,1,3,2010,1,10
+4,0,2010,1,13,2010,1,10,2010,1,17
+4,0,2010,1,20,2010,1,17,2010,1,24
+4,0,2010,1,27,2010,1,24,2010,2,3
+4,0,2010,2,6,2010,2,3,2010,2,10
+4,0,2010,2,13,2010,2,10,2010,2,17
+4,0,2010,2,20,2010,2,17,2010,2,24
+4,0,2010,2,27,2010,2,24,2010,2,31
+4,0,2010,3,3,2010,2,31,2010,3,7
+4,0,2010,3,10,2010,3,7,2010,3,14
+4,0,2010,3,17,2010,3,14,2010,3,21
+4,0,2010,3,24,2010,3,21,2010,3,28
+4,0,2010,4,1,2010,3,28,2010,4,5
+4,0,2010,4,8,2010,4,5,2010,4,12
+4,0,2010,4,15,2010,4,12,2010,4,19
+4,0,2010,4,22,2010,4,19,2010,4,26
+4,0,2010,4,29,2010,4,26,2010,5,2
+4,0,2010,5,5,2010,5,2,2010,5,9
+4,0,2010,5,12,2010,5,9,2010,5,16
+4,0,2010,5,19,2010,5,16,2010,5,23
+4,0,2010,5,26,2010,5,23,2010,5,30
+4,0,2010,6,3,2010,5,30,2010,6,7
+4,0,2010,6,10,2010,6,7,2010,6,14
+4,0,2010,6,17,2010,6,14,2010,6,21
+4,0,2010,6,24,2010,6,21,2010,6,28
+4,0,2010,6,31,2010,6,28,2010,7,4
+4,0,2010,7,7,2010,7,4,2010,7,11
+4,0,2010,7,14,2010,7,11,2010,7,18
+4,0,2010,7,21,2010,7,18,2010,7,25
+4,0,2010,7,28,2010,7,25,2010,8,1
+4,0,2010,8,4,2010,8,1,2010,8,8
+4,0,2010,8,11,2010,8,8,2010,8,15
+4,0,2010,8,18,2010,8,15,2010,8,22
+4,0,2010,8,25,2010,8,22,2010,8,29
+4,0,2010,9,2,2010,8,29,2010,9,6
+4,0,2010,9,9,2010,9,6,2010,9,13
+4,0,2010,9,16,2010,9,13,2010,9,20
+4,0,2010,9,23,2010,9,20,2010,9,27
+4,0,2010,9,30,2010,9,27,2010,10,3
+4,0,2010,10,6,2010,10,3,2010,10,10
+4,0,2010,10,13,2010,10,10,2010,10,17
+4,0,2010,10,20,2010,10,17,2010,10,24
+4,0,2010,10,27,2010,10,24,2010,11,1
+4,0,2010,11,4,2010,11,1,2010,11,8
+4,0,2010,11,11,2010,11,8,2010,11,15
+4,0,2010,11,18,2010,11,15,2010,11,22
+4,0,2010,11,25,2010,11,22,2010,11,29
+4,0,2011,0,1,2010,11,29,2011,0,5
+4,0,2011,0,8,2011,0,5,2011,0,12
+4,0,2011,0,15,2011,0,12,2011,0,19
+5,0,2011,0,16,2011,0,13,2011,0,20
+5,0,2010,0,3,2009,11,31,2010,0,7
+5,0,2010,0,10,2010,0,7,2010,0,14
+5,0,2010,0,17,2010,0,14,2010,0,21
+5,0,2010,0,24,2010,0,21,2010,0,28
+5,0,2010,0,31,2010,0,28,2010,1,4
+5,0,2010,1,7,2010,1,4,2010,1,11
+5,0,2010,1,14,2010,1,11,2010,1,18
+5,0,2010,1,21,2010,1,18,2010,1,25
+5,0,2010,1,28,2010,1,25,2010,2,4
+5,0,2010,2,7,2010,2,4,2010,2,11
+5,0,2010,2,14,2010,2,11,2010,2,18
+5,0,2010,2,21,2010,2,18,2010,2,25
+5,0,2010,2,28,2010,2,25,2010,3,1
+5,0,2010,3,4,2010,3,1,2010,3,8
+5,0,2010,3,11,2010,3,8,2010,3,15
+5,0,2010,3,18,2010,3,15,2010,3,22
+5,0,2010,3,25,2010,3,22,2010,3,29
+5,0,2010,4,2,2010,3,29,2010,4,6
+5,0,2010,4,9,2010,4,6,2010,4,13
+5,0,2010,4,16,2010,4,13,2010,4,20
+5,0,2010,4,23,2010,4,20,2010,4,27
+5,0,2010,4,30,2010,4,27,2010,5,3
+5,0,2010,5,6,2010,5,3,2010,5,10
+5,0,2010,5,13,2010,5,10,2010,5,17
+5,0,2010,5,20,2010,5,17,2010,5,24
+5,0,2010,5,27,2010,5,24,2010,6,1
+5,0,2010,6,4,2010,6,1,2010,6,8
+5,0,2010,6,11,2010,6,8,2010,6,15
+5,0,2010,6,18,2010,6,15,2010,6,22
+5,0,2010,6,25,2010,6,22,2010,6,29
+5,0,2010,7,1,2010,6,29,2010,7,5
+5,0,2010,7,8,2010,7,5,2010,7,12
+5,0,2010,7,15,2010,7,12,2010,7,19
+5,0,2010,7,22,2010,7,19,2010,7,26
+5,0,2010,7,29,2010,7,26,2010,8,2
+5,0,2010,8,5,2010,8,2,2010,8,9
+5,0,2010,8,12,2010,8,9,2010,8,16
+5,0,2010,8,19,2010,8,16,2010,8,23
+5,0,2010,8,26,2010,8,23,2010,8,30
+5,0,2010,9,3,2010,8,30,2010,9,7
+5,0,2010,9,10,2010,9,7,2010,9,14
+5,0,2010,9,17,2010,9,14,2010,9,21
+5,0,2010,9,24,2010,9,21,2010,9,28
+5,0,2010,9,31,2010,9,28,2010,10,4
+5,0,2010,10,7,2010,10,4,2010,10,11
+5,0,2010,10,14,2010,10,11,2010,10,18
+5,0,2010,10,21,2010,10,18,2010,10,25
+5,0,2010,10,28,2010,10,25,2010,11,2
+5,0,2010,11,5,2010,11,2,2010,11,9
+5,0,2010,11,12,2010,11,9,2010,11,16
+5,0,2010,11,19,2010,11,16,2010,11,23
+5,0,2010,11,26,2010,11,23,2010,11,30
+5,0,2011,0,2,2010,11,30,2011,0,6
+6,0,2011,0,3,2010,11,31,2011,0,7
+6,0,2011,0,10,2011,0,7,2011,0,14
+6,0,2011,0,17,2011,0,14,2011,0,21
+6,0,2011,0,24,2011,0,21,2011,0,28
+6,0,2011,0,31,2011,0,28,2011,1,4
+6,0,2011,1,7,2011,1,4,2011,1,11
+6,0,2011,1,14,2011,1,11,2011,1,18
+6,0,2011,1,21,2011,1,18,2011,1,25
+6,0,2011,1,21,2011,1,18,2011,1,25
+6,0,2011,1,21,2011,1,18,2011,1,25
+6,0,2011,0,3,2010,11,31,2011,0,7
+6,0,2011,0,3,2010,11,31,2011,0,7
+6,0,2011,0,10,2011,0,7,2011,0,14
+6,0,2011,0,17,2011,0,14,2011,0,21
+6,0,2011,0,24,2011,0,21,2011,0,28
+6,0,2011,0,31,2011,0,28,2011,1,4
+6,0,2011,1,7,2011,1,4,2011,1,11
+6,0,2011,1,7,2011,1,4,2011,1,11
+6,0,2010,0,4,2010,0,1,2010,0,8
+6,0,2010,0,11,2010,0,8,2010,0,15
+6,0,2010,0,18,2010,0,15,2010,0,22
+6,0,2010,0,25,2010,0,22,2010,0,29
+6,0,2010,1,1,2010,0,29,2010,1,5
+6,0,2010,1,8,2010,1,5,2010,1,12
+6,0,2010,1,15,2010,1,12,2010,1,19
+6,0,2010,1,22,2010,1,19,2010,1,26
+6,0,2010,2,1,2010,1,26,2010,2,5
+6,0,2010,2,8,2010,2,5,2010,2,12
+6,0,2010,2,15,2010,2,12,2010,2,19
+6,0,2010,2,22,2010,2,19,2010,2,26
+6,0,2010,2,29,2010,2,26,2010,3,2
+6,0,2010,3,5,2010,3,2,2010,3,9
+6,0,2010,3,12,2010,3,9,2010,3,16
+6,0,2010,3,19,2010,3,16,2010,3,23
+6,0,2010,3,26,2010,3,23,2010,3,30
+6,0,2010,4,3,2010,3,30,2010,4,7
+6,0,2010,4,10,2010,4,7,2010,4,14
+6,0,2010,4,17,2010,4,14,2010,4,21
+6,0,2010,4,24,2010,4,21,2010,4,28
+6,0,2010,4,31,2010,4,28,2010,5,4
+6,0,2010,5,7,2010,5,4,2010,5,11
+6,0,2010,5,14,2010,5,11,2010,5,18
+6,0,2010,5,21,2010,5,18,2010,5,25
+6,0,2010,5,28,2010,5,25,2010,6,2
+6,0,2010,6,5,2010,6,2,2010,6,9
+6,0,2010,6,12,2010,6,9,2010,6,16
+6,0,2010,6,19,2010,6,16,2010,6,23
+6,0,2010,6,26,2010,6,23,2010,6,30
+6,0,2010,7,2,2010,6,30,2010,7,6
+6,0,2010,7,9,2010,7,6,2010,7,13
+6,0,2010,7,16,2010,7,13,2010,7,20
+6,0,2010,7,23,2010,7,20,2010,7,27
+6,0,2010,7,30,2010,7,27,2010,8,3
+6,0,2010,8,6,2010,8,3,2010,8,10
+6,0,2010,8,13,2010,8,10,2010,8,17
+6,0,2010,8,20,2010,8,17,2010,8,24
+6,0,2010,8,27,2010,8,24,2010,9,1
+6,0,2010,9,4,2010,9,1,2010,9,8
+6,0,2010,9,11,2010,9,8,2010,9,15
+6,0,2010,9,18,2010,9,15,2010,9,22
+6,0,2010,9,25,2010,9,22,2010,9,29
+6,0,2010,10,1,2010,9,29,2010,10,5
+6,0,2010,10,8,2010,10,5,2010,10,12
+6,0,2010,10,15,2010,10,12,2010,10,19
+6,0,2010,10,22,2010,10,19,2010,10,26
+6,0,2010,10,29,2010,10,26,2010,11,3
+6,0,2010,11,6,2010,11,3,2010,11,10
+6,0,2010,11,13,2010,11,10,2010,11,17
+6,0,2010,11,20,2010,11,17,2010,11,24
+6,0,2010,11,27,2010,11,24,2010,11,31
+6,0,2011,0,3,2010,11,31,2011,0,7
+7,0,2011,0,6,2011,0,3,2011,0,8
+7,0,2009,11,31,2009,11,28,2010,0,2
+7,0,2010,0,7,2010,0,4,2010,0,9
+7,0,2010,0,14,2010,0,11,2010,0,16
+7,0,2010,0,21,2010,0,18,2010,0,23
+7,0,2010,0,28,2010,0,25,2010,0,30
+7,0,2010,1,4,2010,1,1,2010,1,6
+7,0,2010,1,11,2010,1,8,2010,1,13
+7,0,2010,1,18,2010,1,15,2010,1,20
+7,0,2010,1,25,2010,1,22,2010,1,27
+7,0,2010,2,4,2010,2,1,2010,2,6
+7,0,2010,2,11,2010,2,8,2010,2,13
+7,0,2010,2,18,2010,2,15,2010,2,20
+7,0,2010,2,25,2010,2,22,2010,2,27
+7,0,2010,3,1,2010,2,29,2010,3,3
+7,0,2010,3,8,2010,3,5,2010,3,10
+7,0,2010,3,15,2010,3,12,2010,3,17
+7,0,2010,3,22,2010,3,19,2010,3,24
+7,0,2010,3,29,2010,3,26,2010,4,1
+7,0,2010,4,6,2010,4,3,2010,4,8
+7,0,2010,4,13,2010,4,10,2010,4,15
+7,0,2010,4,20,2010,4,17,2010,4,22
+7,0,2010,4,27,2010,4,24,2010,4,29
+7,0,2010,5,3,2010,4,31,2010,5,5
+7,0,2010,5,10,2010,5,7,2010,5,12
+7,0,2010,5,17,2010,5,14,2010,5,19
+7,0,2010,5,24,2010,5,21,2010,5,26
+7,0,2010,6,1,2010,5,28,2010,6,3
+7,0,2010,6,8,2010,6,5,2010,6,10
+7,0,2010,6,15,2010,6,12,2010,6,17
+7,0,2010,6,22,2010,6,19,2010,6,24
+7,0,2010,6,29,2010,6,26,2010,6,31
+7,0,2010,7,5,2010,7,2,2010,7,7
+7,0,2010,7,12,2010,7,9,2010,7,14
+7,0,2010,7,19,2010,7,16,2010,7,21
+7,0,2010,7,26,2010,7,23,2010,7,28
+7,0,2010,8,2,2010,7,30,2010,8,4
+7,0,2010,8,9,2010,8,6,2010,8,11
+7,0,2010,8,16,2010,8,13,2010,8,18
+7,0,2010,8,23,2010,8,20,2010,8,25
+7,0,2010,8,30,2010,8,27,2010,9,2
+7,0,2010,9,7,2010,9,4,2010,9,9
+7,0,2010,9,14,2010,9,11,2010,9,16
+7,0,2010,9,21,2010,9,18,2010,9,23
+7,0,2010,9,28,2010,9,25,2010,9,30
+7,0,2010,10,4,2010,10,1,2010,10,6
+7,0,2010,10,11,2010,10,8,2010,10,13
+7,0,2010,10,18,2010,10,15,2010,10,20
+7,0,2010,10,25,2010,10,22,2010,10,27
+7,0,2010,11,2,2010,10,29,2010,11,4
+7,0,2010,11,9,2010,11,6,2010,11,11
+7,0,2010,11,16,2010,11,13,2010,11,18
+7,0,2010,11,23,2010,11,20,2010,11,25
+7,0,2010,11,30,2010,11,27,2011,0,1
+7,0,2011,0,6,2011,0,3,2011,0,8
+1,1,2011,0,5,2011,0,2,2011,0,9
+1,1,2009,11,30,2009,11,27,2010,0,3
+1,1,2010,0,6,2010,0,3,2010,0,10
+1,1,2010,0,13,2010,0,10,2010,0,17
+1,1,2010,0,20,2010,0,17,2010,0,24
+1,1,2010,0,27,2010,0,24,2010,0,31
+1,1,2010,1,3,2010,0,31,2010,1,7
+1,1,2010,1,10,2010,1,7,2010,1,14
+1,1,2010,1,17,2010,1,14,2010,1,21
+1,1,2010,1,24,2010,1,21,2010,1,28
+1,1,2010,2,3,2010,1,28,2010,2,7
+1,1,2010,2,10,2010,2,7,2010,2,14
+1,1,2010,2,17,2010,2,14,2010,2,21
+1,1,2010,2,24,2010,2,21,2010,2,28
+1,1,2010,2,31,2010,2,28,2010,3,4
+1,1,2010,3,7,2010,3,4,2010,3,11
+1,1,2010,3,14,2010,3,11,2010,3,18
+1,1,2010,3,21,2010,3,18,2010,3,25
+1,1,2010,3,28,2010,3,25,2010,4,2
+1,1,2010,4,5,2010,4,2,2010,4,9
+1,1,2010,4,12,2010,4,9,2010,4,16
+1,1,2010,4,19,2010,4,16,2010,4,23
+1,1,2010,4,26,2010,4,23,2010,4,30
+1,1,2010,5,2,2010,4,30,2010,5,6
+1,1,2010,5,9,2010,5,6,2010,5,13
+1,1,2010,5,16,2010,5,13,2010,5,20
+1,1,2010,5,23,2010,5,20,2010,5,27
+1,1,2010,5,30,2010,5,27,2010,6,4
+1,1,2010,6,7,2010,6,4,2010,6,11
+1,1,2010,6,14,2010,6,11,2010,6,18
+1,1,2010,6,21,2010,6,18,2010,6,25
+1,1,2010,6,28,2010,6,25,2010,7,1
+1,1,2010,7,4,2010,7,1,2010,7,8
+1,1,2010,7,11,2010,7,8,2010,7,15
+1,1,2010,7,18,2010,7,15,2010,7,22
+1,1,2010,7,25,2010,7,22,2010,7,29
+1,1,2010,8,1,2010,7,29,2010,8,5
+1,1,2010,8,8,2010,8,5,2010,8,12
+1,1,2010,8,15,2010,8,12,2010,8,19
+1,1,2010,8,22,2010,8,19,2010,8,26
+1,1,2010,8,29,2010,8,26,2010,9,3
+1,1,2010,9,6,2010,9,3,2010,9,10
+1,1,2010,9,13,2010,9,10,2010,9,17
+1,1,2010,9,20,2010,9,17,2010,9,24
+1,1,2010,9,27,2010,9,24,2010,9,31
+1,1,2010,10,3,2010,9,31,2010,10,7
+1,1,2010,10,10,2010,10,7,2010,10,14
+1,1,2010,10,17,2010,10,14,2010,10,21
+1,1,2010,10,24,2010,10,21,2010,10,28
+1,1,2010,11,1,2010,10,28,2010,11,5
+1,1,2010,11,8,2010,11,5,2010,11,12
+1,1,2010,11,15,2010,11,12,2010,11,19
+1,1,2010,11,22,2010,11,19,2010,11,26
+1,1,2010,11,29,2010,11,26,2011,0,2
+1,1,2011,0,5,2011,0,2,2011,0,9
+1,1,2011,0,12,2011,0,9,2011,0,16
+1,1,2011,0,19,2011,0,16,2011,0,23
+1,1,2011,0,26,2011,0,23,2011,0,30
+2,1,2011,0,27,2011,0,24,2011,0,31
+2,1,2009,11,31,2009,11,28,2010,0,4
+2,1,2010,0,7,2010,0,4,2010,0,11
+2,1,2010,0,14,2010,0,11,2010,0,18
+2,1,2010,0,21,2010,0,18,2010,0,25
+2,1,2010,0,28,2010,0,25,2010,1,1
+2,1,2010,1,4,2010,1,1,2010,1,8
+2,1,2010,1,11,2010,1,8,2010,1,15
+2,1,2010,1,18,2010,1,15,2010,1,22
+2,1,2010,1,25,2010,1,22,2010,2,1
+2,1,2010,2,4,2010,2,1,2010,2,8
+2,1,2010,2,11,2010,2,8,2010,2,15
+2,1,2010,2,18,2010,2,15,2010,2,22
+2,1,2010,2,25,2010,2,22,2010,2,29
+2,1,2010,3,1,2010,2,29,2010,3,5
+2,1,2010,3,8,2010,3,5,2010,3,12
+2,1,2010,3,15,2010,3,12,2010,3,19
+2,1,2010,3,22,2010,3,19,2010,3,26
+2,1,2010,3,29,2010,3,26,2010,4,3
+2,1,2010,4,6,2010,4,3,2010,4,10
+2,1,2010,4,13,2010,4,10,2010,4,17
+2,1,2010,4,20,2010,4,17,2010,4,24
+2,1,2010,4,27,2010,4,24,2010,4,31
+2,1,2010,5,3,2010,4,31,2010,5,7
+2,1,2010,5,10,2010,5,7,2010,5,14
+2,1,2010,5,17,2010,5,14,2010,5,21
+2,1,2010,5,24,2010,5,21,2010,5,28
+2,1,2010,6,1,2010,5,28,2010,6,5
+2,1,2010,6,8,2010,6,5,2010,6,12
+2,1,2010,6,15,2010,6,12,2010,6,19
+2,1,2010,6,22,2010,6,19,2010,6,26
+2,1,2010,6,29,2010,6,26,2010,7,2
+2,1,2010,7,5,2010,7,2,2010,7,9
+2,1,2010,7,12,2010,7,9,2010,7,16
+2,1,2010,7,19,2010,7,16,2010,7,23
+2,1,2010,7,26,2010,7,23,2010,7,30
+2,1,2010,8,2,2010,7,30,2010,8,6
+2,1,2010,8,9,2010,8,6,2010,8,13
+2,1,2010,8,16,2010,8,13,2010,8,20
+2,1,2010,8,23,2010,8,20,2010,8,27
+2,1,2010,8,30,2010,8,27,2010,9,4
+2,1,2010,9,7,2010,9,4,2010,9,11
+2,1,2010,9,14,2010,9,11,2010,9,18
+2,1,2010,9,21,2010,9,18,2010,9,25
+2,1,2010,9,28,2010,9,25,2010,10,1
+2,1,2010,10,4,2010,10,1,2010,10,8
+2,1,2010,10,11,2010,10,8,2010,10,15
+2,1,2010,10,18,2010,10,15,2010,10,22
+2,1,2010,10,25,2010,10,22,2010,10,29
+2,1,2010,11,2,2010,10,29,2010,11,6
+2,1,2010,11,9,2010,11,6,2010,11,13
+2,1,2010,11,16,2010,11,13,2010,11,20
+2,1,2010,11,23,2010,11,20,2010,11,27
+2,1,2010,11,30,2010,11,27,2011,0,3
+3,1,2010,11,31,2010,11,28,2011,0,4
+3,1,2010,0,1,2009,11,29,2010,0,5
+3,1,2010,0,8,2010,0,5,2010,0,12
+3,1,2010,0,15,2010,0,12,2010,0,19
+3,1,2010,0,22,2010,0,19,2010,0,26
+3,1,2010,0,29,2010,0,26,2010,1,2
+3,1,2010,1,5,2010,1,2,2010,1,9
+3,1,2010,1,12,2010,1,9,2010,1,16
+3,1,2010,1,19,2010,1,16,2010,1,23
+3,1,2010,1,26,2010,1,23,2010,2,2
+3,1,2010,2,5,2010,2,2,2010,2,9
+3,1,2010,2,12,2010,2,9,2010,2,16
+3,1,2010,2,19,2010,2,16,2010,2,23
+3,1,2010,2,26,2010,2,23,2010,2,30
+3,1,2010,3,2,2010,2,30,2010,3,6
+3,1,2010,3,9,2010,3,6,2010,3,13
+3,1,2010,3,16,2010,3,13,2010,3,20
+3,1,2010,3,23,2010,3,20,2010,3,27
+3,1,2010,3,30,2010,3,27,2010,4,4
+3,1,2010,4,7,2010,4,4,2010,4,11
+3,1,2010,4,14,2010,4,11,2010,4,18
+3,1,2010,4,21,2010,4,18,2010,4,25
+3,1,2010,4,28,2010,4,25,2010,5,1
+3,1,2010,5,4,2010,5,1,2010,5,8
+3,1,2010,5,11,2010,5,8,2010,5,15
+3,1,2010,5,18,2010,5,15,2010,5,22
+3,1,2010,5,25,2010,5,22,2010,5,29
+3,1,2010,6,2,2010,5,29,2010,6,6
+3,1,2010,6,9,2010,6,6,2010,6,13
+3,1,2010,6,16,2010,6,13,2010,6,20
+3,1,2010,6,23,2010,6,20,2010,6,27
+3,1,2010,6,30,2010,6,27,2010,7,3
+3,1,2010,7,6,2010,7,3,2010,7,10
+3,1,2010,7,13,2010,7,10,2010,7,17
+3,1,2010,7,20,2010,7,17,2010,7,24
+3,1,2010,7,27,2010,7,24,2010,7,31
+3,1,2010,8,3,2010,7,31,2010,8,7
+3,1,2010,8,10,2010,8,7,2010,8,14
+3,1,2010,8,17,2010,8,14,2010,8,21
+3,1,2010,8,24,2010,8,21,2010,8,28
+3,1,2010,9,1,2010,8,28,2010,9,5
+3,1,2010,9,8,2010,9,5,2010,9,12
+3,1,2010,9,15,2010,9,12,2010,9,19
+3,1,2010,9,22,2010,9,19,2010,9,26
+3,1,2010,9,29,2010,9,26,2010,10,2
+3,1,2010,10,5,2010,10,2,2010,10,9
+3,1,2010,10,12,2010,10,9,2010,10,16
+3,1,2010,10,19,2010,10,16,2010,10,23
+3,1,2010,10,26,2010,10,23,2010,10,30
+3,1,2010,11,3,2010,10,30,2010,11,7
+3,1,2010,11,10,2010,11,7,2010,11,14
+3,1,2010,11,17,2010,11,14,2010,11,21
+3,1,2010,11,24,2010,11,21,2010,11,28
+3,1,2010,11,31,2010,11,28,2011,0,4
+3,1,2011,0,7,2011,0,4,2011,0,11
+3,1,2011,0,14,2011,0,11,2011,0,18
+3,1,2011,0,21,2011,0,18,2011,0,25
+4,1,2011,0,22,2011,0,19,2011,0,26
+4,1,2011,0,15,2011,0,12,2011,0,19
+4,1,2011,0,29,2011,0,26,2011,1,2
+4,1,2011,1,5,2011,1,2,2011,1,9
+4,1,2011,1,12,2011,1,9,2011,1,16
+4,1,2011,1,12,2011,1,9,2011,1,16
+4,1,2010,0,2,2009,11,30,2010,0,6
+4,1,2010,0,9,2010,0,6,2010,0,13
+4,1,2010,0,16,2010,0,13,2010,0,20
+4,1,2010,0,23,2010,0,20,2010,0,27
+4,1,2010,0,30,2010,0,27,2010,1,3
+4,1,2010,1,6,2010,1,3,2010,1,10
+4,1,2010,1,13,2010,1,10,2010,1,17
+4,1,2010,1,20,2010,1,17,2010,1,24
+4,1,2010,1,27,2010,1,24,2010,2,3
+4,1,2010,2,6,2010,2,3,2010,2,10
+4,1,2010,2,13,2010,2,10,2010,2,17
+4,1,2010,2,20,2010,2,17,2010,2,24
+4,1,2010,2,27,2010,2,24,2010,2,31
+4,1,2010,3,3,2010,2,31,2010,3,7
+4,1,2010,3,10,2010,3,7,2010,3,14
+4,1,2010,3,17,2010,3,14,2010,3,21
+4,1,2010,3,24,2010,3,21,2010,3,28
+4,1,2010,4,1,2010,3,28,2010,4,5
+4,1,2010,4,8,2010,4,5,2010,4,12
+4,1,2010,4,15,2010,4,12,2010,4,19
+4,1,2010,4,22,2010,4,19,2010,4,26
+4,1,2010,4,29,2010,4,26,2010,5,2
+4,1,2010,5,5,2010,5,2,2010,5,9
+4,1,2010,5,12,2010,5,9,2010,5,16
+4,1,2010,5,19,2010,5,16,2010,5,23
+4,1,2010,5,26,2010,5,23,2010,5,30
+4,1,2010,6,3,2010,5,30,2010,6,7
+4,1,2010,6,10,2010,6,7,2010,6,14
+4,1,2010,6,17,2010,6,14,2010,6,21
+4,1,2010,6,24,2010,6,21,2010,6,28
+4,1,2010,6,31,2010,6,28,2010,7,4
+4,1,2010,7,7,2010,7,4,2010,7,11
+4,1,2010,7,14,2010,7,11,2010,7,18
+4,1,2010,7,21,2010,7,18,2010,7,25
+4,1,2010,7,28,2010,7,25,2010,8,1
+4,1,2010,8,4,2010,8,1,2010,8,8
+4,1,2010,8,11,2010,8,8,2010,8,15
+4,1,2010,8,18,2010,8,15,2010,8,22
+4,1,2010,8,25,2010,8,22,2010,8,29
+4,1,2010,9,2,2010,8,29,2010,9,6
+4,1,2010,9,9,2010,9,6,2010,9,13
+4,1,2010,9,16,2010,9,13,2010,9,20
+4,1,2010,9,23,2010,9,20,2010,9,27
+4,1,2010,9,30,2010,9,27,2010,10,3
+4,1,2010,10,6,2010,10,3,2010,10,10
+4,1,2010,10,13,2010,10,10,2010,10,17
+4,1,2010,10,20,2010,10,17,2010,10,24
+4,1,2010,10,27,2010,10,24,2010,11,1
+4,1,2010,11,4,2010,11,1,2010,11,8
+4,1,2010,11,11,2010,11,8,2010,11,15
+4,1,2010,11,18,2010,11,15,2010,11,22
+4,1,2010,11,25,2010,11,22,2010,11,29
+4,1,2011,0,1,2010,11,29,2011,0,5
+4,1,2011,0,8,2011,0,5,2011,0,12
+4,1,2011,0,15,2011,0,12,2011,0,19
+5,1,2011,0,16,2011,0,13,2011,0,20
+5,1,2010,0,3,2009,11,31,2010,0,7
+5,1,2010,0,10,2010,0,7,2010,0,14
+5,1,2010,0,17,2010,0,14,2010,0,21
+5,1,2010,0,24,2010,0,21,2010,0,28
+5,1,2010,0,31,2010,0,28,2010,1,4
+5,1,2010,1,7,2010,1,4,2010,1,11
+5,1,2010,1,14,2010,1,11,2010,1,18
+5,1,2010,1,21,2010,1,18,2010,1,25
+5,1,2010,1,28,2010,1,25,2010,2,4
+5,1,2010,2,7,2010,2,4,2010,2,11
+5,1,2010,2,14,2010,2,11,2010,2,18
+5,1,2010,2,21,2010,2,18,2010,2,25
+5,1,2010,2,28,2010,2,25,2010,3,1
+5,1,2010,3,4,2010,3,1,2010,3,8
+5,1,2010,3,11,2010,3,8,2010,3,15
+5,1,2010,3,18,2010,3,15,2010,3,22
+5,1,2010,3,25,2010,3,22,2010,3,29
+5,1,2010,4,2,2010,3,29,2010,4,6
+5,1,2010,4,9,2010,4,6,2010,4,13
+5,1,2010,4,16,2010,4,13,2010,4,20
+5,1,2010,4,23,2010,4,20,2010,4,27
+5,1,2010,4,30,2010,4,27,2010,5,3
+5,1,2010,5,6,2010,5,3,2010,5,10
+5,1,2010,5,13,2010,5,10,2010,5,17
+5,1,2010,5,20,2010,5,17,2010,5,24
+5,1,2010,5,27,2010,5,24,2010,6,1
+5,1,2010,6,4,2010,6,1,2010,6,8
+5,1,2010,6,11,2010,6,8,2010,6,15
+5,1,2010,6,18,2010,6,15,2010,6,22
+5,1,2010,6,25,2010,6,22,2010,6,29
+5,1,2010,7,1,2010,6,29,2010,7,5
+5,1,2010,7,8,2010,7,5,2010,7,12
+5,1,2010,7,15,2010,7,12,2010,7,19
+5,1,2010,7,22,2010,7,19,2010,7,26
+5,1,2010,7,29,2010,7,26,2010,8,2
+5,1,2010,8,5,2010,8,2,2010,8,9
+5,1,2010,8,12,2010,8,9,2010,8,16
+5,1,2010,8,19,2010,8,16,2010,8,23
+5,1,2010,8,26,2010,8,23,2010,8,30
+5,1,2010,9,3,2010,8,30,2010,9,7
+5,1,2010,9,10,2010,9,7,2010,9,14
+5,1,2010,9,17,2010,9,14,2010,9,21
+5,1,2010,9,24,2010,9,21,2010,9,28
+5,1,2010,9,31,2010,9,28,2010,10,4
+5,1,2010,10,7,2010,10,4,2010,10,11
+5,1,2010,10,14,2010,10,11,2010,10,18
+5,1,2010,10,21,2010,10,18,2010,10,25
+5,1,2010,10,28,2010,10,25,2010,11,2
+5,1,2010,11,5,2010,11,2,2010,11,9
+5,1,2010,11,12,2010,11,9,2010,11,16
+5,1,2010,11,19,2010,11,16,2010,11,23
+5,1,2010,11,26,2010,11,23,2010,11,30
+5,1,2011,0,2,2010,11,30,2011,0,6
+5,1,2011,0,9,2011,0,6,2011,0,13
+5,1,2011,0,16,2011,0,13,2011,0,20
+6,1,2011,0,17,2011,0,14,2011,0,21
+6,1,2010,0,4,2010,0,1,2010,0,8
+6,1,2010,0,11,2010,0,8,2010,0,15
+6,1,2010,0,18,2010,0,15,2010,0,22
+6,1,2010,0,25,2010,0,22,2010,0,29
+6,1,2010,1,1,2010,0,29,2010,1,5
+6,1,2010,1,8,2010,1,5,2010,1,12
+6,1,2010,1,15,2010,1,12,2010,1,19
+6,1,2010,1,22,2010,1,19,2010,1,26
+6,1,2010,2,1,2010,1,26,2010,2,5
+6,1,2010,2,8,2010,2,5,2010,2,12
+6,1,2010,2,15,2010,2,12,2010,2,19
+6,1,2010,2,22,2010,2,19,2010,2,26
+6,1,2010,2,29,2010,2,26,2010,3,2
+6,1,2010,3,5,2010,3,2,2010,3,9
+6,1,2010,3,12,2010,3,9,2010,3,16
+6,1,2010,3,19,2010,3,16,2010,3,23
+6,1,2010,3,26,2010,3,23,2010,3,30
+6,1,2010,4,3,2010,3,30,2010,4,7
+6,1,2010,4,10,2010,4,7,2010,4,14
+6,1,2010,4,17,2010,4,14,2010,4,21
+6,1,2010,4,24,2010,4,21,2010,4,28
+6,1,2010,4,31,2010,4,28,2010,5,4
+6,1,2010,5,7,2010,5,4,2010,5,11
+6,1,2010,5,14,2010,5,11,2010,5,18
+6,1,2010,5,21,2010,5,18,2010,5,25
+6,1,2010,5,28,2010,5,25,2010,6,2
+6,1,2010,6,5,2010,6,2,2010,6,9
+6,1,2010,6,12,2010,6,9,2010,6,16
+6,1,2010,6,19,2010,6,16,2010,6,23
+6,1,2010,6,26,2010,6,23,2010,6,30
+6,1,2010,7,2,2010,6,30,2010,7,6
+6,1,2010,7,9,2010,7,6,2010,7,13
+6,1,2010,7,16,2010,7,13,2010,7,20
+6,1,2010,7,23,2010,7,20,2010,7,27
+6,1,2010,7,30,2010,7,27,2010,8,3
+6,1,2010,8,6,2010,8,3,2010,8,10
+6,1,2010,8,13,2010,8,10,2010,8,17
+6,1,2010,8,20,2010,8,17,2010,8,24
+6,1,2010,8,27,2010,8,24,2010,9,1
+6,1,2010,9,4,2010,9,1,2010,9,8
+6,1,2010,9,11,2010,9,8,2010,9,15
+6,1,2010,9,18,2010,9,15,2010,9,22
+6,1,2010,9,25,2010,9,22,2010,9,29
+6,1,2010,10,1,2010,9,29,2010,10,5
+6,1,2010,10,8,2010,10,5,2010,10,12
+6,1,2010,10,15,2010,10,12,2010,10,19
+6,1,2010,10,22,2010,10,19,2010,10,26
+6,1,2010,10,29,2010,10,26,2010,11,3
+6,1,2010,11,6,2010,11,3,2010,11,10
+6,1,2010,11,13,2010,11,10,2010,11,17
+6,1,2010,11,20,2010,11,17,2010,11,24
+6,1,2010,11,27,2010,11,24,2010,11,31
+6,1,2011,0,3,2010,11,31,2011,0,7
+6,1,2011,0,10,2011,0,7,2011,0,14
+7,1,2011,0,11,2011,0,8,2011,0,15
+7,1,2009,11,29,2009,11,26,2010,0,2
+7,1,2010,0,5,2010,0,2,2010,0,9
+7,1,2010,0,12,2010,0,9,2010,0,16
+7,1,2010,0,19,2010,0,16,2010,0,23
+7,1,2010,0,26,2010,0,23,2010,0,30
+7,1,2010,1,2,2010,0,30,2010,1,6
+7,1,2010,1,9,2010,1,6,2010,1,13
+7,1,2010,1,16,2010,1,13,2010,1,20
+7,1,2010,1,23,2010,1,20,2010,1,27
+7,1,2010,2,2,2010,1,27,2010,2,6
+7,1,2010,2,9,2010,2,6,2010,2,13
+7,1,2010,2,16,2010,2,13,2010,2,20
+7,1,2010,2,23,2010,2,20,2010,2,27
+7,1,2010,2,30,2010,2,27,2010,3,3
+7,1,2010,3,6,2010,3,3,2010,3,10
+7,1,2010,3,13,2010,3,10,2010,3,17
+7,1,2010,3,20,2010,3,17,2010,3,24
+7,1,2010,3,27,2010,3,24,2010,4,1
+7,1,2010,4,4,2010,4,1,2010,4,8
+7,1,2010,4,11,2010,4,8,2010,4,15
+7,1,2010,4,18,2010,4,15,2010,4,22
+7,1,2010,4,25,2010,4,22,2010,4,29
+7,1,2010,5,1,2010,4,29,2010,5,5
+7,1,2010,5,8,2010,5,5,2010,5,12
+7,1,2010,5,15,2010,5,12,2010,5,19
+7,1,2010,5,22,2010,5,19,2010,5,26
+7,1,2010,5,29,2010,5,26,2010,6,3
+7,1,2010,6,6,2010,6,3,2010,6,10
+7,1,2010,6,13,2010,6,10,2010,6,17
+7,1,2010,6,20,2010,6,17,2010,6,24
+7,1,2010,6,27,2010,6,24,2010,6,31
+7,1,2010,7,3,2010,6,31,2010,7,7
+7,1,2010,7,10,2010,7,7,2010,7,14
+7,1,2010,7,17,2010,7,14,2010,7,21
+7,1,2010,7,24,2010,7,21,2010,7,28
+7,1,2010,7,31,2010,7,28,2010,8,4
+7,1,2010,8,7,2010,8,4,2010,8,11
+7,1,2010,8,14,2010,8,11,2010,8,18
+7,1,2010,8,21,2010,8,18,2010,8,25
+7,1,2010,8,28,2010,8,25,2010,9,2
+7,1,2010,9,5,2010,9,2,2010,9,9
+7,1,2010,9,12,2010,9,9,2010,9,16
+7,1,2010,9,19,2010,9,16,2010,9,23
+7,1,2010,9,26,2010,9,23,2010,9,30
+7,1,2010,10,2,2010,9,30,2010,10,6
+7,1,2010,10,9,2010,10,6,2010,10,13
+7,1,2010,10,16,2010,10,13,2010,10,20
+7,1,2010,10,23,2010,10,20,2010,10,27
+7,1,2010,10,30,2010,10,27,2010,11,4
+7,1,2010,11,7,2010,11,4,2010,11,11
+7,1,2010,11,14,2010,11,11,2010,11,18
+7,1,2010,11,21,2010,11,18,2010,11,25
+7,1,2010,11,28,2010,11,25,2011,0,1
+7,1,2011,0,4,2011,0,1,2011,0,8