Index: JvScheduledEvents.pas
===================================================================
--- JvScheduledEvents.pas	(revision 10965)
+++ JvScheduledEvents.pas	(working copy)
@@ -197,10 +197,66 @@
     constructor Create(Collection: TCollection); override;
     destructor Destroy; override;
     procedure LoadState(const TriggerStamp: TTimeStamp; const TriggerCount, DayCount: Integer;
-      const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime); virtual;
+      const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime;
+    {Common}
+      const ARecurringType: TScheduleRecurringKind;
+      const AStartDate: TTimeStamp;
+      const AEndType: TScheduleEndKind;
+      const AEndDate: TTimeStamp;
+      const AEndCount: Cardinal;
+      const ALastTriggered: TTimeStamp;
+    {DayFrequency}
+      const ADayFrequencyStartTime: Cardinal;
+      const ADayFrequencyEndTime: Cardinal;
+      const ADayFrequencyInterval: Cardinal;
+    {Daily}
+      const ADayEveryWeekDay: Boolean;
+      const ADayInterval: Cardinal;
+    {Weekly}
+      const AWeekInterval: Cardinal;
+      const AWeekDaysOfWeek: TScheduleWeekDays;
+    {Monthly}
+      const AMonthIndexKind: TScheduleIndexKind;
+      const AMonthIndexValue: Cardinal;
+      const AMonthDay: Cardinal;
+      const AMonthInterval: Cardinal;
+    {Yearly}
+      const AYearIndexKind: TScheduleIndexKind;
+      const AYearIndexValue: Cardinal;
+      const AYearDay: Cardinal;
+      const AYearMonth: Cardinal;
+      const AYearInterval: Cardinal); virtual;
     procedure Pause;
     procedure SaveState(out TriggerStamp: TTimeStamp; out TriggerCount, DayCount: Integer;
-      out SnoozeStamp: TTimeStamp; out ALastSnoozeInterval: TSystemTime); virtual;
+      out SnoozeStamp: TTimeStamp; out ALastSnoozeInterval: TSystemTime;
+    {Common}
+      out ARecurringType: TScheduleRecurringKind;
+      out AStartDate: TTimeStamp;
+      out AEndType: TScheduleEndKind;
+      out AEndDate: TTimeStamp;
+      out AEndCount: Cardinal;
+      out ALastTriggered: TTimeStamp;
+    {DayFrequency}
+      out ADayFrequencyStartTime: Cardinal;
+      out ADayFrequencyEndTime: Cardinal;
+      out ADayFrequencyInterval: Cardinal;
+    {Daily}
+      out ADayEveryWeekDay: Boolean;
+      out ADayInterval: Cardinal;
+    {Weekly}
+      out AWeekInterval: Cardinal;
+      out AWeekDaysOfWeek: TScheduleWeekDays;
+    {Monthly}
+      out AMothIndexKind: TScheduleIndexKind;
+      out AMonthIndexValue: Cardinal;
+      out AMonthDay: Cardinal;
+      out AMonthInterval: Cardinal;
+    {Yearly}
+      out AYearIndexKind: TScheduleIndexKind;
+      out AYearIndexValue: Cardinal;
+      out AYearDay: Cardinal;
+      out AYearMonth: Cardinal;
+      out AYearInterval: Cardinal); virtual;
     procedure Snooze(const MSecs: Word; const Secs: Word = 0; const Mins: Word = 0;
       const Hrs: Word = 0; const Days: Word = 0);
     procedure Start;
@@ -452,20 +508,6 @@
 begin
   inherited Create(AOwner);
   FEvents := TJvEventCollection.Create(Self);
-
-  {$IFDEF VCL}
-  FWnd := AllocateHWndEx(WndProc);
-  {$ENDIF VCL}
-  {$IFDEF VisualCLX}
-  FWnd := QWidgetH(AllocateMessageObject(Self));
-  {$ENDIF VisualCLX}
-  if not (csDesigning in ComponentState) and not (csLoading in ComponentState) then
-  begin
-    if AutoSave then
-      LoadEventStates;
-    InitEvents;
-  end;
-  ScheduleThread.AddEventComponent(Self);
 end;
 
 destructor TJvCustomScheduledEvents.Destroy;
@@ -537,9 +579,16 @@
 begin
   if not (csDesigning in ComponentState) then
   begin
+    {$IFDEF VCL}
+    FWnd := AllocateHWndEx(WndProc);
+    {$ENDIF VCL}
+    {$IFDEF VisualCLX}
+    FWnd := QWidgetH(AllocateMessageObject(Self));
+    {$ENDIF VisualCLX}
     if AutoSave then
       LoadEventStates;
     InitEvents;
+    ScheduleThread.AddEventComponent(Self);
   end;
 end;
 
@@ -553,6 +602,37 @@
   SnoozeInterval: TSystemTime;
   EventName: string;
   Event: TJvEventCollectionItem;
+
+  AInt: Cardinal;
+  {common}
+  ARecurringType: TScheduleRecurringKind;
+  AStartDate: TTimeStamp;
+  AEndType: TScheduleEndKind;
+  AEndDate: TTimeStamp;
+  AEndCount: Cardinal;
+  ALastTriggered: TTimeStamp;
+  {DayFrequency}
+  ADayFrequencyStartTime: Cardinal;
+  ADayFrequencyEndTime: Cardinal;
+  ADayFrequencyInterval: Cardinal;
+  {Daily}
+  ADayEveryWeekDay: Boolean;
+  ADayInterval: Cardinal;
+  {Weekly}
+  AWeekInterval: Cardinal;
+  AWeekDaysOfWeek: TScheduleWeekDays;
+  AWeekDaysBitValue: Cardinal;//bit setting
+  {Monthly}
+  AMothIndexKind: TScheduleIndexKind;
+  AMonthIndexValue: Cardinal;
+  AMonthDay: Cardinal;
+  AMonthInterval: Cardinal;
+  {Yearly}
+  AYearIndexKind: TScheduleIndexKind;
+  AYearIndexValue: Cardinal;
+  AYearDay: Cardinal;
+  AYearMonth: Cardinal;
+  AYearInterval: Cardinal;
 begin
   EventName := Sender.ReadString(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'Eventname']));
   if EventName <> '' then
@@ -570,9 +650,89 @@
     SnoozeInterval.wMinute := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wMinute']));
     SnoozeInterval.wSecond := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wSecond']));
     SnoozeInterval.wMilliseconds := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wMilliseconds']));
+    {Common}
+    AInt := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'RecurringType']));
+    ARecurringType := TScheduleRecurringKind(AInt);
+    AStartDate.Time := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'StartDate_time']));
+    AStartDate.Date := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'StartDate_date']));
+    AInt := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndType']));
+    AEndType := TScheduleEndKind(AInt);
+    AEndDate.Time := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndDate_time']));
+    AEndDate.Date := Sender.readInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndDate_date']));
+    AEndCount := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndCount']));
+    ALastTriggered.Time := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'LastTriggered_time']));
+    ALastTriggered.Date := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'LastTriggered_date']));
+    {DayFrequency}
+    ADayFrequencyStartTime := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyStartTime']));
+    ADayFrequencyEndTime := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyEndTime']));
+    ADayFrequencyInterval := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyInterval']));
+    {Daily}
+    ADayEveryWeekDay := Sender.ReadBoolean(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayEveryWeekDay']));
+    ADayInterval := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayInterval']));
+    {Weekly}
+    AWeekInterval := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'WeekInterval']));
+//    AppStorage.ReadSet(Sender.ConcatPaths([Path, ItemName + IntToStr(Index),'WeekDays']), TypeInfo(TScheduleWeekDays), [], AWeekDaysOfWeek);
+    {sorry for this code, but for me it is easer then use WriteSet, because I don't have time to learn how it works.}
+    AWeekDaysBitValue:=AppStorage.ReadInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'WeekDaysOfWeek']));
+    AWeekDaysOfWeek:=[];
+    if AWeekDaysBitValue and $40 = $40 then
+      Include(AWeekDaysOfWeek,swdMonday);
+    if AWeekDaysBitValue and $20 = $20 then
+      Include(AWeekDaysOfWeek,swdTuesday);
+    if AWeekDaysBitValue and $10 = $10 then
+      Include(AWeekDaysOfWeek,swdWednesday);
+    if AWeekDaysBitValue and 8 = 8 then
+      Include(AWeekDaysOfWeek,swdThursday);
+    if AWeekDaysBitValue and 4 = 4 then
+      Include(AWeekDaysOfWeek,swdFriday);
+    if AWeekDaysBitValue and 2 = 2 then
+      Include(AWeekDaysOfWeek,swdSaturday);
+    if AWeekDaysBitValue and 1 = 1 then
+      Include(AWeekDaysOfWeek,swdSunday);
+    {Monthly}
+    AInt := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'MothIndexKind']));
+    AMothIndexKind := TScheduleIndexKind(AInt);
+    AMonthIndexValue := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthIndexValue']));
+    AMonthDay := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthDay']));
+    AMonthInterval := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthInterval']));
+    {Yearly}
+    AInt := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearIndexKind']));
+    AYearIndexKind := TScheduleIndexKind(AInt);
+    AYearIndexValue := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearIndexValue']));
+    AYearDay := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearDay']));
+    AYearMonth := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearMonth']));
+    AYearInterval := Sender.ReadInteger(Sender.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearInterval']));
     Event := TJvEventCollection(List).Add;
     Event.Name := EventName;
-    Event.LoadState(Stamp, TriggerCount, DayCount, Snooze, SnoozeInterval);
+    Event.LoadState(Stamp, TriggerCount, DayCount, Snooze, SnoozeInterval,
+    {common}
+    ARecurringType,
+    AStartDate,
+    AEndType,
+    AEndDate,
+    AEndCount,
+    ALastTriggered,
+    {DayFrequency}
+    ADayFrequencyStartTime,
+    ADayFrequencyEndTime,
+    ADayFrequencyInterval,
+    {Daily}
+    ADayEveryWeekDay,
+    ADayInterval,
+    {Weekly}
+    AWeekInterval,
+    AWeekDaysOfWeek,
+    {Monthly}
+    AMothIndexKind,
+    AMonthIndexValue,
+    AMonthDay,
+    AMonthInterval,
+    {Yearly}
+    AYearIndexKind,
+    AYearIndexValue,
+    AYearDay,
+    AYearMonth,
+    AYearInterval);
   end;
 end;
 
@@ -597,8 +757,65 @@
   SnoozeInterval: TSystemTime;
   SnoozeDate: Integer;
   SnoozeTime: Integer;
+  {common}
+  ARecurringType: TScheduleRecurringKind;
+  AStartDate: TTimeStamp;
+  AEndType: TScheduleEndKind;
+  AEndDate: TTimeStamp;
+  AEndCount: Cardinal;
+  ALastTriggered: TTimeStamp;
+  {DayFrequency}
+  ADayFrequencyStartTime: Cardinal;
+  ADayFrequencyEndTime: Cardinal;
+  ADayFrequencyInterval: Cardinal;
+  {Daily}
+  ADayEveryWeekDay: Boolean;
+  ADayInterval: Cardinal;
+  {Weekly}
+  AWeekInterval: Cardinal;
+  AWeekDaysOfWeek: TScheduleWeekDays;
+  AWeekDaysBitValue:integer;//bit setting
+  {Monthly}
+  AMothIndexKind: TScheduleIndexKind;
+  AMonthIndexValue: Cardinal;
+  AMonthDay: Cardinal;
+  AMonthInterval: Cardinal;
+  {Yearly}
+  AYearIndexKind: TScheduleIndexKind;
+  AYearIndexValue: Cardinal;
+  AYearDay: Cardinal;
+  AYearMonth: Cardinal;
+  AYearInterval: Cardinal;
 begin
-  TJvEventCollection(List)[Index].SaveState(Stamp, TriggerCount, DayCount, SnoozeStamp, SnoozeInterval);
+  TJvEventCollection(List)[Index].SaveState(Stamp, TriggerCount, DayCount, SnoozeStamp, SnoozeInterval,
+  {Common}
+    ARecurringType,
+    AStartDate,
+    AEndType,
+    AEndDate,
+    AEndCount,
+    ALastTriggered,
+  {DayFrequency}
+    ADayFrequencyStartTime,
+    ADayFrequencyEndTime,
+    ADayFrequencyInterval,
+  {Daily}
+    ADayEveryWeekDay,
+    ADayInterval,
+  {Weekly}
+    AWeekInterval,
+    AWeekDaysOfWeek,
+  {Monthly}
+    AMothIndexKind,
+    AMonthIndexValue,
+    AMonthDay,
+    AMonthInterval,
+  {Yearly}
+    AYearIndexKind,
+    AYearIndexValue,
+    AYearDay,
+    AYearMonth,
+    AYearInterval);
   StampDate := Stamp.Date;
   StampTime := Stamp.Time;
   SnoozeDate := SnoozeStamp.Date;
@@ -617,6 +834,46 @@
   AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wMinute']), SnoozeInterval.wMinute);
   AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wSecond']), SnoozeInterval.wSecond);
   AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'SnoozeInterval.wMilliseconds']), SnoozeInterval.wMilliseconds);
+  {Common}
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'RecurringType']), Integer(ARecurringType));
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'StartDate_time']), AStartDate.Time);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'StartDate_date']), AStartDate.Date);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndType']), Integer(AEndType));
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndDate_time']), AEndDate.Time);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndDate_date']), AEndDate.Date);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'EndCount']), AEndCount);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'LastTriggered_time']), ALastTriggered.Time);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'LastTriggered_date']), ALastTriggered.Date);
+  {DayFrequency}
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyStartTime']), ADayFrequencyStartTime);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyEndTime']), ADayFrequencyEndTime);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayFrequencyInterval']), ADayFrequencyInterval);
+  {Daily}
+  AppStorage.WriteBoolean(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayEveryWeekDay']), ADayEveryWeekDay);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'DayInterval']), ADayInterval);
+  {Weekly}
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'WeekInterval']), AWeekInterval);
+//  AppStorage.WriteSet(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'WeekDaysOfWeek']), TypeInfo(TScheduleWeekDays), AWeekDaysOfWeek);
+  AWeekDaysBitValue:=0 or
+    (Ord(swdMonday in AWeekDaysOfWeek) shl 6) or
+    (Ord(swdTuesday in AWeekDaysOfWeek) shl 5) or
+    (Ord(swdWednesday in AWeekDaysOfWeek) shl 4) or
+    (Ord(swdThursday in AWeekDaysOfWeek) shl 3) or
+    (Ord(swdFriday in AWeekDaysOfWeek) shl 2) or
+    (Ord(swdSaturday in AWeekDaysOfWeek) shl 1) or
+     Ord(swdSunday in AWeekDaysOfWeek);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'WeekDaysOfWeek']),AWeekDaysBitValue);
+  {Monthly}
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'MothIndexKind']), Integer(AMothIndexKind));
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthIndexValue']), AMonthIndexValue);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthDay']), AMonthDay);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'MonthInterval']), AMonthInterval);
+  {Yearly}
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearIndexKind']), Integer(AYearIndexKind));
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearIndexValue']), AYearIndexValue);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearDay']), AYearDay);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearMonth']), AYearMonth);
+  AppStorage.WriteInteger(AppStorage.ConcatPaths([Path, ItemName + IntToStr(Index), 'YearInterval']), AYearInterval);
 end;
 
 procedure TJvCustomScheduledEvents.DeleteSingleEvent(Sender: TJvCustomAppStorage; const Path: string;
@@ -666,9 +923,6 @@
 
 {$IFDEF VCL}
 procedure TJvCustomScheduledEvents.WndProc(var Msg: TMessage);
-var
-  List: TList;
-  I: Integer;
 begin
   with Msg do
     case Msg of
@@ -676,25 +930,9 @@
         Dispatch(Msg);
       WM_TIMECHANGE:
         begin
-          // Mantis 3355: Time has changed, mark all running schedules as
-          // "to be restarted", stop and then restart them.
-          List := TList.Create;
-          try
-            for I := 0 to FEvents.Count - 1 do
-            begin
-              if FEvents[I].State in [sesTriggered, sesExecuting, sesPaused] then
-              begin
-                List.Add(FEvents[I]);
-                FEvents[I].Stop;
-              end;
-            end;
-            for I := 0 to List.Count - 1 do
-            begin
-              TJvEventCollectionItem(List[I]).Start;
-            end;
-          finally
-            List.Free;
-          end;
+          // Mantis 3355: Time has changed, stop and restart the schedules
+          StopAll;
+          StartAll;
         end;
     else
       Result := DefWindowProc(Handle, Msg, WParam, LParam);
@@ -1208,9 +1446,94 @@
   end;
 end;
 
-procedure TJvEventCollectionItem.LoadState(const TriggerStamp: TTimeStamp; const TriggerCount,
-  DayCount: Integer; const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime);
+procedure TJvEventCollectionItem.LoadState(const TriggerStamp: TTimeStamp; const TriggerCount, DayCount: Integer;
+  const SnoozeStamp: TTimeStamp; const ALastSnoozeInterval: TSystemTime;
+  {Common}
+  const ARecurringType: TScheduleRecurringKind;
+  const AStartDate: TTimeStamp;
+  const AEndType: TScheduleEndKind;
+  const AEndDate: TTimeStamp;
+  const AEndCount: Cardinal;
+  const ALastTriggered: TTimeStamp;
+  {DayFrequency}
+  const ADayFrequencyStartTime: Cardinal;
+  const ADayFrequencyEndTime: Cardinal;
+  const ADayFrequencyInterval: Cardinal;
+  {Daily}
+  const ADayEveryWeekDay: Boolean;
+  const ADayInterval: Cardinal;
+  {Weekly}
+  const AWeekInterval: Cardinal;
+  const AWeekDaysOfWeek: TScheduleWeekDays;
+  {Monthly}
+  const AMonthIndexKind: TScheduleIndexKind;
+  const AMonthIndexValue: Cardinal;
+  const AMonthDay: Cardinal;
+  const AMonthInterval: Cardinal;
+  {Yearly}
+  const AYearIndexKind: TScheduleIndexKind;
+  const AYearIndexValue: Cardinal;
+  const AYearDay: Cardinal;
+  const AYearMonth: Cardinal;
+  const AYearInterval: Cardinal);
+var
+  IDayFrequency: IJclScheduleDayFrequency;
+  IDay: IJclDailySchedule;
+  IWeek: IJclWeeklySchedule;
+  IMonth: IJclMonthlySchedule;
+  IYear: IJclYearlySchedule;
 begin
+  Schedule.RecurringType:=ARecurringType;
+  if ARecurringType<>srkOneShot then
+    begin
+      IDayFrequency := Schedule as IJclScheduleDayFrequency;
+      IDayFrequency.StartTime := ADayFrequencyStartTime;
+      IDayFrequency.EndTime := ADayFrequencyEndTime;
+      IDayFrequency.Interval := ADayFrequencyInterval;
+    end;
+  case ARecurringType of
+    srkOneShot:
+      begin
+      end;
+    srkDaily:
+      begin
+        {IJclDailySchedule}
+        IDay := Schedule as IJclDailySchedule;
+        IDay.EveryWeekDay := ADayEveryWeekDay;
+        if not ADayEveryWeekDay then
+          IDay.Interval := ADayInterval;
+      end;
+    srkWeekly:
+      begin
+        {IJclWeeklySchedule}
+        IWeek := Schedule as IJclWeeklySchedule;
+        IWeek.DaysOfWeek := AWeekDaysOfWeek;
+        IWeek.Interval := AWeekInterval;
+      end;
+    srkMonthly:
+      begin
+        {IJclMonthlySchedule}
+        IMonth := Schedule as IJclMonthlySchedule;
+        IMonth.IndexKind := AMonthIndexKind;
+        if AMonthIndexKind <> sikNone then
+          IMonth.IndexValue := AMonthIndexValue;
+        if AMonthIndexKind = sikNone then
+          IMonth.Day := AMonthDay;
+        IMonth.Interval := AMonthInterval;
+      end;
+    srkYearly:
+      begin
+        {IJclYearlySchedule}
+        IYear := Schedule as IJclYearlySchedule;
+        IYear.IndexKind := AYearIndexKind;
+        if AYearIndexKind <> sikNone then
+          IYear.IndexValue := AYearIndexValue
+        else
+          IYear.Day := AYearDay;
+        IYear.Month := AYearMonth;
+        IYear.Interval := AYearInterval;
+      end;
+  end;
   Schedule.InitToSavedState(TriggerStamp, TriggerCount, DayCount);
   FScheduleFire := TriggerStamp;
   FSnoozeFire := SnoozeStamp;
@@ -1230,9 +1553,99 @@
     FState := sesPaused;
 end;
 
-procedure TJvEventCollectionItem.SaveState(out TriggerStamp: TTimeStamp; out TriggerCount,
-  DayCount: Integer; out SnoozeStamp: TTimeStamp; out ALastSnoozeInterval: TSystemTime);
+procedure TJvEventCollectionItem.SaveState(out TriggerStamp: TTimeStamp; out TriggerCount, DayCount: Integer;
+  {Common}
+  out SnoozeStamp: TTimeStamp; out ALastSnoozeInterval: TSystemTime;
+  out ARecurringType: TScheduleRecurringKind;
+  out AStartDate: TTimeStamp;
+  out AEndType: TScheduleEndKind;
+  out AEndDate: TTimeStamp;
+  out AEndCount: Cardinal;
+  out ALastTriggered: TTimeStamp;
+ {DayFrequency}
+  out ADayFrequencyStartTime: Cardinal;
+  out ADayFrequencyEndTime: Cardinal;
+  out ADayFrequencyInterval: Cardinal;
+ {Daily}
+  out ADayEveryWeekDay: Boolean;
+  out ADayInterval: Cardinal;
+ {Weekly}
+  out AWeekInterval: Cardinal;
+  out AWeekDaysOfWeek: TScheduleWeekDays;
+ {Monthly}
+  out AMothIndexKind: TScheduleIndexKind;
+  out AMonthIndexValue: Cardinal;
+  out AMonthDay: Cardinal;
+  out AMonthInterval: Cardinal;
+ {Yearly}
+  out AYearIndexKind: TScheduleIndexKind;
+  out AYearIndexValue: Cardinal;
+  out AYearDay: Cardinal;
+  out AYearMonth: Cardinal;
+  out AYearInterval: Cardinal);
+var
+  IDayFrequency: IJclScheduleDayFrequency;
+  IDay: IJclDailySchedule;
+  IWeek: IJclWeeklySchedule;
+  IMonth: IJclMonthlySchedule;
+  IYear: IJclYearlySchedule;
 begin
+  {Common properties}
+  AEndType := FSchedule.EndType;
+  AEndDate := FSchedule.EndDate;
+  AEndCount := FSchedule.EndCount;
+  ALastTriggered := Fschedule.LastTriggered;
+  AStartDate := FSchedule.StartDate;
+  ARecurringType := FSchedule.RecurringType;
+  {IJclScheduleDayFrequency}
+  if ARecurringType<>srkOneShot then
+    begin
+      IDayFrequency := FSchedule as IJclScheduleDayFrequency;
+      ADayFrequencyStartTime := IDayFrequency.StartTime;
+      ADayFrequencyEndTime := IDayFrequency.EndTime;
+      ADayFrequencyInterval := IDayFrequency.Interval;
+    end;
+  case ARecurringType of
+    srkOneShot:
+      begin
+      end;
+    srkDaily:
+      begin
+        {IJclDailySchedule}
+        IDay := FSchedule as IJclDailySchedule;
+        ADayInterval := IDay.Interval;
+        ADayEveryWeekDay := IDay.EveryWeekDay;
+      end;
+    srkWeekly:
+      begin
+        {IJclWeeklySchedule}
+        IWeek := FSchedule as IJclWeeklySchedule;
+        AWeekInterval := IWeek.Interval;
+        AWeekDaysOfWeek := IWeek.DaysOfWeek;
+      end;
+    srkMonthly:
+      begin
+        {IJclMonthlySchedule}
+        IMonth := FSchedule as IJclMonthlySchedule;
+        AMothIndexKind := IMonth.IndexKind;
+        if AMothIndexKind <> sikNone then
+          AMonthIndexValue := IMonth.IndexValue;
+        AMonthDay := IMonth.Day;
+        AMonthInterval := IMonth.Interval;
+      end;
+    srkYearly:
+      begin
+        {IJclYearlySchedule}
+        IYear := FSchedule as IJclYearlySchedule;
+        AYearIndexKind := IYear.IndexKind;
+        if AYearIndexKind <> sikNone then
+          AYearIndexValue := IYear.IndexValue;
+        AYearDay := IYear.Day;
+        AYearMonth := IYear.Month;
+        AYearInterval := IYear.Interval;
+      end;
+  end;
+  {Old part}
   TriggerStamp := FScheduleFire;
   TriggerCount := Schedule.TriggerCount;
   DayCount := Schedule.DayCount;
