* PagedDataSource.cs (PrivateICollectionEnumerator.MoveNext):
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Calendar.cs
1 //
2 // System.Web.UI.WebControls.Calendar.cs
3 //
4 // Authors:
5 //   Gaurav Vaish (gvaish@iitk.ac.in)
6 //   Gonzalo Paniagua Javier (gonzalo@ximian.com)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9 // (c) 2002 Ximian, Inc. (http://www.ximian.com)
10 // (C) Gaurav Vaish (2002)
11 // (C) 2003 Andreas Nahr
12 //\r
13 \r
14 using System;\r
15 using System.IO;\r
16 using System.Collections;\r
17 using System.Globalization;\r
18 using System.Text;\r
19 using System.Web;\r
20 using System.Web.UI;\r
21 using System.Drawing;\r
22 using System.ComponentModel;
23 using System.ComponentModel.Design;\r
24 \r
25 namespace System.Web.UI.WebControls\r
26 {\r
27         [DefaultEvent("SelectionChanged")]\r
28         [DefaultProperty("SelectedDate")]\r
29         [Designer("System.Web.UI.Design.WebControls.CalendarDesigner, " + Consts.AssemblySystem_Design, typeof (IDesigner))]\r
30         [DataBindingHandler("System.Web.UI.Design.WebControls.CalendarDataBindingHandler, " + Consts.AssemblySystem_Design)]
31         public class Calendar : WebControl, IPostBackEventHandler\r
32         {\r
33                 //\r
34                 private TableItemStyle          dayHeaderStyle;\r
35                 private TableItemStyle          dayStyle;\r
36                 private TableItemStyle          nextPrevStyle;\r
37                 private TableItemStyle          otherMonthDayStyle;\r
38                 private SelectedDatesCollection selectedDates;\r
39                 private ArrayList               selectedDatesList;\r
40                 private TableItemStyle          selectedDayStyle;\r
41                 private TableItemStyle          selectorStyle;\r
42                 private TableItemStyle          titleStyle;\r
43                 private TableItemStyle          todayDayStyle;\r
44                 private TableItemStyle          weekendDayStyle;\r
45 \r
46                 private static readonly object DayRenderEvent           = new object();\r
47                 private static readonly object SelectionChangedEvent    = new object();\r
48                 private static readonly object VisibleMonthChangedEvent = new object();\r
49 \r
50                 private Color defaultTextColor;\r
51                 private System.Globalization.Calendar globCal;\r
52                 private DateTimeFormatInfo infoCal = DateTimeFormatInfo.CurrentInfo;\r
53 \r
54                 private static int MASK_WEEKEND  = (0x01 << 0);\r
55                 private static int MASK_OMONTH   = (0x01 << 1);\r
56                 private static int MASK_TODAY    = (0x01 << 2);\r
57                 private static int MASK_SELECTED = (0x01 << 3);\r
58                 private static int MASK_DAY      = (0x01 << 4);\r
59                 private static int MASK_UNIQUE = MASK_WEEKEND | MASK_OMONTH | MASK_TODAY | MASK_SELECTED;\r
60 \r
61                 public Calendar(): base()\r
62                 {\r
63                         //TODO: Initialization\r
64                 }\r
65
66
67                 [DefaultValue (2), Bindable (true), WebCategory ("Layout")]
68                 [WebSysDescription ("The border left within the calendar days.")]\r
69                 public int CellPadding\r
70                 {\r
71                         get\r
72                         {\r
73                                 object o = ViewState["CellPadding"];\r
74                                 if(o!=null)\r
75                                         return (int)o;\r
76                                 return 2;\r
77                         }\r
78                         set\r
79                         {
80                                 if (value < -1)
81                                         throw new ArgumentOutOfRangeException ("value", "CellPadding value has to be -1 for 'not set' or > -1.");\r
82                                 ViewState["CellPadding"] = value;\r
83                         }\r
84                 }\r
85
86                 [DefaultValue (0), Bindable (true), WebCategory ("Layout")]
87                 [WebSysDescription ("The border left between calendar days.")]\r
88                 public int CellSpacing\r
89                 {\r
90                         get\r
91                         {\r
92                                 object o = ViewState["CellSpacing"];\r
93                                 if(o!=null)\r
94                                         return (int)o;\r
95                                 return 0;\r
96                         }\r
97                         set\r
98                         {\r
99                                 if (value < -1)
100                                         throw new ArgumentOutOfRangeException ("value", "CellSpacing value has to be -1 for 'not set' or > -1.");\r
101                                 ViewState["CellSpacing"] = value;\r
102                         }\r
103                 }\r
104
105                 [NotifyParentProperty (true), WebCategory ("Style")]
106                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
107                 [PersistenceMode (PersistenceMode.InnerProperty)]
108                 [WebSysDescription ("The style applied to the day header.")]\r
109                 public TableItemStyle DayHeaderStyle\r
110                 {\r
111                         get\r
112                         {\r
113                                 if(dayHeaderStyle==null)\r
114                                         dayHeaderStyle = new TableItemStyle();\r
115                                 if(IsTrackingViewState)\r
116                                         dayHeaderStyle.TrackViewState();\r
117                                 return dayHeaderStyle;\r
118                         }\r
119                 }\r
120
121                 [DefaultValue (typeof (DayNameFormat), "Short"), Bindable (true), WebCategory ("Appearance")]
122                 [WebSysDescription ("The format for the day name display.")]\r
123                 public DayNameFormat DayNameFormat\r
124                 {\r
125                         get\r
126                         {\r
127                                 object o = ViewState["DayNameFormat"];\r
128                                 if(o!=null)\r
129                                         return (DayNameFormat)o;\r
130                                 return DayNameFormat.Short;\r
131                         }\r
132                         set\r
133                         {\r
134                                 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))\r
135                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
136                                 ViewState["DayNameFormat"] = value;\r
137                         }\r
138                 }\r
139
140                 [DefaultValue (null)]
141                 [NotifyParentProperty (true), WebCategory ("Style")]
142                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
143                 [PersistenceMode (PersistenceMode.InnerProperty)]
144                 [WebSysDescription ("The style applied to the day entry.")]\r
145                 public TableItemStyle DayStyle\r
146                 {\r
147                         get\r
148                         {\r
149                                 if(dayStyle==null)\r
150                                         dayStyle = new TableItemStyle();\r
151                                 if(IsTrackingViewState)\r
152                                         dayStyle.TrackViewState();\r
153                                 return dayStyle;\r
154                         }\r
155                 }\r
156
157                 [DefaultValue (typeof (FirstDayOfWeek), "Default"), Bindable (true), WebCategory ("Appearance")]
158                 [WebSysDescription ("The day that a week begins with.")]\r
159                 public FirstDayOfWeek FirstDayOfWeek\r
160                 {\r
161                         get\r
162                         {\r
163                                 object o = ViewState["FirstDayOfWeek"];\r
164                                 if(o!=null)\r
165                                         return (FirstDayOfWeek)o;\r
166                                 return FirstDayOfWeek.Default;\r
167                         }\r
168                         set\r
169                         {\r
170                                 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))\r
171                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
172                                 ViewState["FirstDayOfWeek"] = value;\r
173                         }\r
174                 }\r
175
176                 [DefaultValue (">"), Bindable (true), WebCategory ("Appearance")]
177                 [WebSysDescription ("The text for selecting the next month.")]\r
178                 public string NextMonthText\r
179                 {\r
180                         get\r
181                         {\r
182                                 object o = ViewState["NextMonthText"];\r
183                                 if(o!=null)\r
184                                         return (string)o;\r
185                                 return "&gt;";\r
186                         }\r
187                         set\r
188                         {\r
189                                 ViewState["NextMonthText"] = value;\r
190                         }\r
191                 }\r
192
193                 [DefaultValue (typeof (NextPrevFormat), "CustomText"), Bindable (true), WebCategory ("Appearance")]
194                 [WebSysDescription ("The format for the month navigation.")]\r
195                 public NextPrevFormat NextPrevFormat\r
196                 {\r
197                         get\r
198                         {\r
199                                 object o = ViewState["NextPrevFormat"];\r
200                                 if(o!=null)\r
201                                         return (NextPrevFormat)o;\r
202                                 return NextPrevFormat.CustomText;\r
203                         }\r
204                         set\r
205                         {\r
206                                 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))\r
207                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
208                                 ViewState["NextPrevFormat"] = value;\r
209                         }\r
210                 }\r
211
212                 [NotifyParentProperty (true), WebCategory ("Style")]
213                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
214                 [PersistenceMode (PersistenceMode.InnerProperty)]
215                 [WebSysDescription ("The style applied to the month navigation.")]\r
216                 public TableItemStyle NextPrevStyle\r
217                 {\r
218                         get\r
219                         {\r
220                                 if(nextPrevStyle == null)\r
221                                         nextPrevStyle = new TableItemStyle();\r
222                                 if(IsTrackingViewState)\r
223                                         nextPrevStyle.TrackViewState();\r
224                                 return nextPrevStyle;\r
225                         }\r
226                 }\r
227
228                 [DefaultValue (null)]
229                 [NotifyParentProperty (true), WebCategory ("Style")]
230                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
231                 [PersistenceMode (PersistenceMode.InnerProperty)]
232                 [WebSysDescription ("The style applied to day entries belonging to another month.")]\r
233                 public TableItemStyle OtherMonthDayStyle\r
234                 {\r
235                         get\r
236                         {\r
237                                 if(otherMonthDayStyle == null)\r
238                                         otherMonthDayStyle = new TableItemStyle();\r
239                                 if(IsTrackingViewState)\r
240                                         otherMonthDayStyle.TrackViewState();\r
241                                 return otherMonthDayStyle;\r
242                         }\r
243                 }\r
244
245                 [DefaultValue ("<"), Bindable (true), WebCategory ("Appearance")]
246                 [WebSysDescription ("The text for selecting the previous month.")]\r
247                 public string PrevMonthText\r
248                 {\r
249                         get\r
250                         {\r
251                                 object o = ViewState["PrevMonthText"];\r
252                                 if(o!=null)\r
253                                         return (string)o;\r
254                                 return "&lt;";\r
255                         }\r
256                         set\r
257                         {\r
258                                 ViewState["PrevMonthText"] = value;\r
259                         }\r
260                 }\r
261
262                 [DefaultValue (null), Bindable (true)]
263                 [WebSysDescription ("The currently selected date.")]\r
264                 public DateTime SelectedDate\r
265                 {\r
266                         get\r
267                         {\r
268                                 if(SelectedDates.Count > 0)\r
269                                 {\r
270                                         return SelectedDates[0];\r
271                                 }\r
272                                 return DateTime.MinValue;\r
273                         }\r
274                         set\r
275                         {\r
276                                 if(value == DateTime.MinValue)\r
277                                 {\r
278                                         SelectedDates.Clear();\r
279                                 } else\r
280                                 {\r
281                                         SelectedDates.SelectRange(value, value);\r
282                                 }\r
283                         }\r
284                 }\r
285
286                 [Browsable (false), DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
287                 [WebSysDescription ("All currently selected dates.")]\r
288                 public SelectedDatesCollection SelectedDates\r
289                 {\r
290                         get\r
291                         {\r
292                                 if(selectedDates==null)\r
293                                 {\r
294                                         if(selectedDatesList == null)\r
295                                                 selectedDatesList = new ArrayList();\r
296                                         selectedDates = new SelectedDatesCollection(selectedDatesList);\r
297                                 }\r
298                                 return selectedDates;\r
299                         }\r
300                 }\r
301
302                 [DefaultValue (null)]
303                 [NotifyParentProperty (true), WebCategory ("Style")]
304                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
305                 [PersistenceMode (PersistenceMode.InnerProperty)]
306                 [WebSysDescription ("The style applied to the selected day.")]\r
307                 public TableItemStyle SelectedDayStyle\r
308                 {\r
309                         get\r
310                         {\r
311                                 if(selectedDayStyle==null)\r
312                                         selectedDayStyle = new TableItemStyle();\r
313                                 if(IsTrackingViewState)\r
314                                         selectedDayStyle.TrackViewState();\r
315                                 return selectedDayStyle;\r
316                         }\r
317                 }\r
318
319                 [DefaultValue (typeof (CalendarSelectionMode), "Day"), Bindable (true), WebCategory ("Behavior")]
320                 [WebSysDescription ("The mode in which days or other entries are selected.")]\r
321                 public CalendarSelectionMode SelectionMode\r
322                 {\r
323                         get\r
324                         {\r
325                                 object o = ViewState["SelectionMode"];\r
326                                 if(o!=null)\r
327                                         return (CalendarSelectionMode)o;\r
328                                 return CalendarSelectionMode.Day;\r
329                         }\r
330                         set\r
331                         {\r
332                                 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))\r
333                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
334                                 ViewState["SelectionMode"] = value;\r
335                         }\r
336                 }\r
337
338                 [DefaultValue (">>"), Bindable (true), WebCategory ("Appearance")]
339                 [WebSysDescription ("The text that is used for selection of months.")]\r
340                 public string SelectMonthText\r
341                 {\r
342                         get\r
343                         {\r
344                                 object o = ViewState["SelectMonthText"];\r
345                                 if(o!=null)\r
346                                         return (string)o;\r
347                                 return "&gt;&gt;";\r
348                         }\r
349                         set\r
350                         {\r
351                                 ViewState["SelectMonthText"] = value;\r
352                         }\r
353                 }\r
354
355                 [NotifyParentProperty (true), WebCategory ("Style")]
356                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
357                 [PersistenceMode (PersistenceMode.InnerProperty)]
358                 [WebSysDescription ("The style applied to the selector.")]\r
359                 public TableItemStyle SelectorStyle\r
360                 {\r
361                         get\r
362                         {\r
363                                 if(selectorStyle==null)\r
364                                         selectorStyle = new TableItemStyle();\r
365                                 return selectorStyle;\r
366                         }\r
367                 }\r
368
369                 [DefaultValue (">"), Bindable (true), WebCategory ("Appearance")]
370                 [WebSysDescription ("The text that is used for selection of weeks.")]\r
371                 public string SelectWeekText\r
372                 {\r
373                         get\r
374                         {\r
375                                 object o = ViewState["SelectWeekText"];\r
376                                 if(o!=null)\r
377                                         return (string)o;\r
378                                 return "&gt;";\r
379                         }\r
380                         set\r
381                         {\r
382                                 ViewState["SelectWeekText"] = value;\r
383                         }\r
384                 }\r
385
386                 [DefaultValue (true), Bindable (true), WebCategory ("Appearance")]
387                 [WebSysDescription ("Determines if the header for days is shown.")]\r
388                 public bool ShowDayHeader\r
389                 {\r
390                         get\r
391                         {\r
392                                 object o = ViewState["ShowDayHeader"];\r
393                                 if(o!=null)\r
394                                         return (bool)o;\r
395                                 return true;\r
396                         }\r
397                         set\r
398                         {\r
399                                 ViewState["ShowDayHeader"] = value;\r
400                         }\r
401                 }\r
402
403                 [DefaultValue (false), Bindable (true), WebCategory ("Appearance")]
404                 [WebSysDescription ("Determines if gridlines are shown.")]\r
405                 public bool ShowGridLines\r
406                 {\r
407                         get\r
408                         {\r
409                                 object o = ViewState["ShowGridLines"];\r
410                                 if(o!=null)\r
411                                         return (bool)o;\r
412                                 return false;\r
413                         }\r
414                         set\r
415                         {\r
416                                 ViewState["ShowGridLines"] = value;\r
417                         }\r
418                 }\r
419
420                 [DefaultValue (true), Bindable (true), WebCategory ("Appearance")]
421                 [WebSysDescription ("Determines if month navigation is shown.")]\r
422                 public bool ShowNextPrevMonth\r
423                 {\r
424                         get\r
425                         {\r
426                                 object o = ViewState["ShowNextPrevMonth"];\r
427                                 if(o!=null)\r
428                                         return (bool)o;\r
429                                 return true;\r
430                         }\r
431                         set\r
432                         {\r
433                                 ViewState["ShowNextPrevMonth"] = value;\r
434                         }\r
435                 }\r
436
437                 [DefaultValue (true), Bindable (true), WebCategory ("Appearance")]
438                 [WebSysDescription ("Determines if the title is shown.")]\r
439                 public bool ShowTitle\r
440                 {\r
441                         get\r
442                         {\r
443                                 object o = ViewState["ShowTitle"];\r
444                                 if(o!=null)\r
445                                         return (bool)o;\r
446                                 return true;\r
447                         }\r
448                         set\r
449                         {\r
450                                 ViewState["ShowTitle"] = value;\r
451                         }\r
452                 }\r
453
454                 [DefaultValue (typeof (TitleFormat), "MonthYear"), Bindable (true), WebCategory ("Appearance")]
455                 [WebSysDescription ("The format in which the title is rendered.")]\r
456                 public TitleFormat TitleFormat\r
457                 {\r
458                         get\r
459                         {\r
460                                 object o = ViewState["TitleFormat"];\r
461                                 if(o!=null)\r
462                                         return (TitleFormat)o;\r
463                                 return TitleFormat.MonthYear;\r
464                         }\r
465                         set\r
466                         {\r
467                                 if(!System.Enum.IsDefined(typeof(TitleFormat), value))\r
468                                         throw new ArgumentOutOfRangeException ("value", "Only valid enumeration members are allowed");\r
469                                 ViewState["TitleFormat"] = value;\r
470                         }\r
471                 }\r
472
473                 [NotifyParentProperty (true), WebCategory ("Style")]
474                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
475                 [PersistenceMode (PersistenceMode.InnerProperty)]
476                 [WebSysDescription ("The style applied to the title.")]\r
477                 public TableItemStyle TitleStyle\r
478                 {\r
479                         get\r
480                         {\r
481                                 if(titleStyle==null)\r
482                                         titleStyle = new TableItemStyle();\r
483                                 if(IsTrackingViewState)\r
484                                         titleStyle.TrackViewState();\r
485                                 return titleStyle;\r
486                         }\r
487                 }\r
488
489                 [DefaultValue (null)]
490                 [NotifyParentProperty (true), WebCategory ("Style")]
491                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
492                 [PersistenceMode (PersistenceMode.InnerProperty)]
493                 [WebSysDescription ("The style applied to the today's date display.")]\r
494                 public TableItemStyle TodayDayStyle\r
495                 {\r
496                         get\r
497                         {\r
498                                 if(todayDayStyle==null)\r
499                                         todayDayStyle = new TableItemStyle();\r
500                                 if(IsTrackingViewState)\r
501                                         todayDayStyle.TrackViewState();\r
502                                 return todayDayStyle;\r
503                         }\r
504                 }\r
505
506                 [Bindable (true), Browsable (false)]
507                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Hidden)]
508                 [WebSysDescription ("The current date.")]\r
509                 public DateTime TodaysDate\r
510                 {\r
511                         get\r
512                         {\r
513                                 object o = ViewState["TodaysDate"];\r
514                                 if(o!=null)\r
515                                         return (DateTime)o;\r
516                                 return DateTime.Today;\r
517                         }\r
518                         set\r
519                         {\r
520                                 ViewState["TodaysDate"] = value.Date;\r
521                         }\r
522                 }\r
523
524                 [DefaultValue (null), Bindable (true)]
525                 [WebSysDescription ("The month that is displayed.")]\r
526                 public DateTime VisibleDate\r
527                 {\r
528                         get\r
529                         {\r
530                                 object o = ViewState["VisibleDate"];\r
531                                 if(o!=null)\r
532                                         return (DateTime)o;\r
533                                 return DateTime.MinValue;\r
534                         }\r
535                         set\r
536                         {\r
537                                 ViewState["VisibleDate"] = value.Date;\r
538                         }\r
539                 }\r
540
541                 [NotifyParentProperty (true), WebCategory ("Style")]
542                 [DesignerSerializationVisibility (DesignerSerializationVisibility.Content)]
543                 [PersistenceMode (PersistenceMode.InnerProperty)]
544                 [WebSysDescription ("The style applied to weekend days.")]\r
545                 public TableItemStyle WeekendDayStyle\r
546                 {\r
547                         get\r
548                         {\r
549                                 if(weekendDayStyle == null)\r
550                                         weekendDayStyle = new TableItemStyle();\r
551                                 if(IsTrackingViewState)\r
552                                 {\r
553                                         weekendDayStyle.TrackViewState();\r
554                                 }\r
555                                 return weekendDayStyle;\r
556                         }\r
557                 }\r
558
559                 [WebCategory ("Action")]
560                 [WebSysDescription ("Raised when a day entry is rendered.")]\r
561                 public event DayRenderEventHandler DayRender\r
562                 {\r
563                         add\r
564                         {\r
565                                 Events.AddHandler(DayRenderEvent, value);\r
566                         }\r
567                         remove\r
568                         {\r
569                                 Events.RemoveHandler(DayRenderEvent, value);\r
570                         }\r
571                 }\r
572
573                 [WebCategory ("Action")]
574                 [WebSysDescription ("Raised when another entry is selected.")]\r
575                 public event EventHandler SelectionChanged\r
576                 {\r
577                         add\r
578                         {\r
579                                 Events.AddHandler(SelectionChangedEvent, value);\r
580                         }\r
581                         remove\r
582                         {\r
583                                 Events.RemoveHandler(SelectionChangedEvent, value);\r
584                         }\r
585                 }\r
586
587                 [WebCategory ("Action")]
588                 [WebSysDescription ("Raised when a the currently visible month has changed.")]\r
589                 public event MonthChangedEventHandler VisibleMonthChanged\r
590                 {\r
591                         add\r
592                         {\r
593                                 Events.AddHandler(VisibleMonthChangedEvent, value);\r
594                         }\r
595                         remove\r
596                         {\r
597                                 Events.RemoveHandler(VisibleMonthChangedEvent, value);\r
598                         }\r
599                 }\r
600 \r
601                 protected virtual void OnDayRender(TableCell cell, CalendarDay day)\r
602                 {\r
603                         if(Events!=null)\r
604                         {\r
605                                 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);\r
606                                 if(dreh!=null)\r
607                                         dreh(this, new DayRenderEventArgs(cell, day));\r
608                         }\r
609                 }\r
610 \r
611                 protected virtual void OnSelectionChanged()\r
612                 {\r
613                         if(Events!=null)\r
614                         {\r
615                                 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);\r
616                                 if(eh!=null)\r
617                                         eh(this, new EventArgs());\r
618                         }\r
619                 }\r
620 \r
621                 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)\r
622                 {\r
623                         if(Events!=null)\r
624                         {\r
625                                 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);\r
626                                 if(mceh!=null)\r
627                                         mceh(this, new MonthChangedEventArgs(newDate, prevDate));\r
628                         }\r
629                 }\r
630 \r
631                 /// <remarks>\r
632                 /// See test6.aspx in Tests directory for verification\r
633                 /// </remarks>\r
634                 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
635                 {\r
636                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
637                         DateTime visDate = GetEffectiveVisibleDate();\r
638                         if(eventArgument == "nextMonth")\r
639                         {\r
640                                 VisibleDate = globCal.AddMonths(visDate, 1);\r
641                                 OnVisibleMonthChanged(VisibleDate, visDate);\r
642                                 return;\r
643                         }\r
644                         if(eventArgument == "prevMonth")\r
645                         {\r
646                                 VisibleDate = globCal.AddMonths(visDate, -1);\r
647                                 OnVisibleMonthChanged(VisibleDate, visDate);\r
648                                 return;\r
649                         }\r
650                         if(eventArgument == "selectMonth")\r
651                         {\r
652                                 DateTime oldDate = new DateTime(globCal.GetYear(visDate), globCal.GetMonth(visDate), 1, globCal);\r
653                                 SelectRangeInternal(oldDate, globCal.AddDays(globCal.AddMonths(oldDate, 1), -1), visDate);\r
654                                 return;\r
655                         }\r
656                         if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)\r
657                         {\r
658                                 int week = -1;\r
659                                 try\r
660                                 {\r
661                                         week = Int32.Parse(eventArgument.Substring("selectWeek".Length));\r
662                                 } catch(Exception e)\r
663                                 {\r
664                                 }\r
665                                 if(week >= 0 && week <= 5)\r
666                                 {\r
667                                         DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);\r
668                                         SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);\r
669                                 }\r
670                                 return;\r
671                         }\r
672                         if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)\r
673                         {\r
674                                 int day = -1;\r
675                                 try\r
676                                 {\r
677                                         day = Int32.Parse(eventArgument.Substring("selectDay".Length));\r
678                                 } catch(Exception e)\r
679                                 {\r
680                                 }\r
681                                 if(day >= 0 && day <= 42)\r
682                                 {\r
683                                         DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);\r
684                                         SelectRangeInternal(dayStart, dayStart, visDate);\r
685                                 }\r
686                         }\r
687                 }\r
688 \r
689                 protected override void Render(HtmlTextWriter writer)\r
690                 {\r
691                         //TODO: Implement me\r
692                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
693                         DateTime visDate   = GetEffectiveVisibleDate();\r
694                         DateTime firstDate = GetFirstCalendarDay(visDate);\r
695 \r
696                         bool isEnabled;\r
697                         bool isHtmlTextWriter;\r
698                         //FIXME: when Control.Site works, reactivate this\r
699                         //if (Page == null || Site == null) {\r
700                         //      isEnabled = false;\r
701                         //      isHtmlTextWriter = false;\r
702                         //} else {\r
703                                 isEnabled = Enabled;\r
704                                 isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));\r
705                         //}\r
706                         defaultTextColor = ForeColor;\r
707                         if(defaultTextColor == Color.Empty)\r
708                                 defaultTextColor = Color.Black;\r
709 \r
710                         Table calTable = new Table ();\r
711                         calTable.ID = ID;\r
712                         calTable.CopyBaseAttributes(this);\r
713                         if(ControlStyleCreated)\r
714                                 calTable.ApplyStyle(ControlStyle);\r
715                         calTable.Width = Width;\r
716                         calTable.Height = Height;\r
717                         calTable.CellSpacing = CellSpacing;\r
718                         calTable.CellPadding = CellPadding;\r
719 \r
720                         if (ControlStyleCreated &&\r
721                             ControlStyle.IsSet (WebControls.Style.BORDERWIDTH) &&\r
722                             BorderWidth != Unit.Empty)\r
723                                 calTable.BorderWidth = BorderWidth;\r
724                         else\r
725                                 calTable.BorderWidth = Unit.Pixel(1);\r
726 \r
727                         if (ShowGridLines)\r
728                                 calTable.GridLines = GridLines.Both;\r
729                         else\r
730                                 calTable.GridLines = GridLines.None;\r
731 \r
732                         calTable.RenderBeginTag (writer);\r
733 \r
734                         if (ShowTitle)\r
735                                 RenderTitle (writer, visDate, SelectionMode, isEnabled);\r
736 \r
737                         if (ShowDayHeader)\r
738                                 RenderHeader (writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
739 \r
740                         RenderAllDays (writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
741 \r
742                         calTable.RenderEndTag(writer);\r
743                 }\r
744 \r
745                 protected override ControlCollection CreateControlCollection()\r
746                 {\r
747                         return new EmptyControlCollection(this);\r
748                 }\r
749 \r
750                 protected override void LoadViewState(object savedState)\r
751                 {\r
752                         if (savedState!=null) {\r
753                                 object[] states = (object[]) savedState;\r
754                                 if(states[0] != null)\r
755                                         base.LoadViewState(states[0]);\r
756                                 if(states[1] != null)\r
757                                         DayHeaderStyle.LoadViewState(states[1]);\r
758                                 if(states[2] != null)\r
759                                         DayStyle.LoadViewState(states[2]);\r
760                                 if(states[3] != null)\r
761                                         NextPrevStyle.LoadViewState(states[3]);\r
762                                 if(states[4] != null)\r
763                                         OtherMonthDayStyle.LoadViewState(states[4]);\r
764                                 if(states[5] != null)\r
765                                         SelectedDayStyle.LoadViewState(states[5]);\r
766                                 if(states[6] != null)\r
767                                         SelectorStyle.LoadViewState(states[6]);\r
768                                 if(states[7] != null)\r
769                                         TitleStyle.LoadViewState(states[7]);\r
770                                 if(states[8] != null)\r
771                                         TodayDayStyle.LoadViewState(states[8]);\r
772                                 if(states[9] != null)\r
773                                         WeekendDayStyle.LoadViewState(states[9]);\r
774 \r
775                                 ArrayList dateList = ViewState ["_CalendarSelectedDates"] as ArrayList;\r
776                                 if (dateList != null)\r
777                                         selectedDates = new SelectedDatesCollection (dateList);\r
778                         }\r
779                 }\r
780 \r
781                 protected override object SaveViewState()\r
782                 {
783                         if (SelectedDates.Count > 0)\r
784                                 ViewState["_CalendarSelectedDates"] = selectedDates.GetDateList ();
785                         \r
786                         object[] states = new object [10];\r
787                         states[0] = base.SaveViewState();\r
788                         states[1] = (dayHeaderStyle == null ? null : dayHeaderStyle.SaveViewState());\r
789                         states[2] = (dayStyle == null ? null : dayStyle.SaveViewState());\r
790                         states[3] = (nextPrevStyle == null ? null : nextPrevStyle.SaveViewState());\r
791                         states[4] = (otherMonthDayStyle == null ? null : otherMonthDayStyle.SaveViewState());\r
792                         states[5] = (selectedDayStyle == null ? null : selectedDayStyle.SaveViewState());\r
793                         states[6] = (selectorStyle == null ? null : selectorStyle.SaveViewState());\r
794                         states[7] = (titleStyle == null ? null : titleStyle.SaveViewState());\r
795                         states[8] = (todayDayStyle == null ? null : todayDayStyle.SaveViewState());\r
796                         states[9] = (weekendDayStyle == null ? null : weekendDayStyle.SaveViewState());\r
797                         for(int i=0; i < states.Length; i++)\r
798                         {\r
799                                 if(states[i]!=null)\r
800                                         return states;\r
801                         }\r
802                         return null;\r
803                 }\r
804 \r
805                 protected override void TrackViewState()\r
806                 {\r
807                         base.TrackViewState();\r
808                         if(titleStyle!=null)\r
809                         {\r
810                                 titleStyle.TrackViewState();\r
811                         }\r
812                         if(nextPrevStyle!=null)\r
813                         {\r
814                                 nextPrevStyle.TrackViewState();\r
815                         }\r
816                         if(dayStyle!=null)\r
817                         {\r
818                                 dayStyle.TrackViewState();\r
819                         }\r
820                         if(dayHeaderStyle!=null)\r
821                         {\r
822                                 dayHeaderStyle.TrackViewState();\r
823                         }\r
824                         if(todayDayStyle!=null)\r
825                         {\r
826                                 todayDayStyle.TrackViewState();\r
827                         }\r
828                         if(weekendDayStyle!=null)\r
829                         {\r
830                                 weekendDayStyle.TrackViewState();\r
831                         }\r
832                         if(otherMonthDayStyle!=null)\r
833                         {\r
834                                 otherMonthDayStyle.TrackViewState();\r
835                         }\r
836                         if(selectedDayStyle!=null)\r
837                         {\r
838                                 selectedDayStyle.TrackViewState();\r
839                         }\r
840                         if(selectorStyle!=null)\r
841                         {\r
842                                 selectorStyle.TrackViewState();\r
843                         }\r
844                 }\r
845 \r
846                 private void RenderAllDays (HtmlTextWriter writer,\r
847                                             DateTime firstDay,\r
848                                             DateTime activeDate,\r
849                                             CalendarSelectionMode mode,\r
850                                             bool isActive,\r
851                                             bool isDownLevel)\r
852                 {\r
853                         TableItemStyle weeksStyle = null;
854                         TableCell weeksCell = new TableCell ();\r
855                         TableItemStyle weekendStyle = WeekendDayStyle;\r
856                         TableItemStyle otherMonthStyle = OtherMonthDayStyle;\r
857                         Unit size;\r
858                         bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||\r
859                                            mode == CalendarSelectionMode.DayWeekMonth);\r
860 \r
861                         if (isWeekMode) {\r
862                                 weeksStyle = new TableItemStyle ();\r
863                                 weeksStyle.Width = Unit.Percentage (12);\r
864                                 weeksStyle.HorizontalAlign = HorizontalAlign.Center;\r
865                                 weeksStyle.CopyFrom (SelectorStyle);\r
866                                 size = Unit.Percentage (12);\r
867                         } else {\r
868                                 size = Unit.Percentage (14);\r
869                         }\r
870 \r
871                         TableItemStyle [] styles = new TableItemStyle [32];\r
872                         int definedStyles = MASK_SELECTED;\r
873                         if (weekendStyle != null && !weekendStyle.IsEmpty)\r
874                                 definedStyles |= MASK_WEEKEND;\r
875                         if (otherMonthStyle != null && !otherMonthStyle.IsEmpty)\r
876                                 definedStyles |= MASK_OMONTH;\r
877                         if (todayDayStyle != null && !todayDayStyle.IsEmpty)\r
878                                 definedStyles |= MASK_TODAY;\r
879                         if (dayStyle != null && !dayStyle.IsEmpty)\r
880                                 definedStyles |= MASK_DAY;\r
881 \r
882                         bool isCalendar = GetType () == typeof (Calendar);\r
883                         int month = globCal.GetMonth (activeDate);\r
884                         DateTime currentDay = firstDay;\r
885                         for (int crr = 0; crr < 6; crr++) {\r
886                                 writer.Write ("<tr>");\r
887                                 if (isWeekMode) {\r
888                                         string cellText = GetCalendarLinkText (\r
889                                                                 "selectWeek" + crr.ToString (),\r
890                                                                 SelectWeekText, \r
891                                                                 weeksCell.ForeColor,\r
892                                                                 isActive);\r
893 \r
894                                         weeksCell.Text = cellText;\r
895                                         weeksCell.ApplyStyle (weeksStyle);
896                                         RenderCalendarCell (writer, weeksCell, cellText);\r
897                                 }\r
898 \r
899                                 for (int weekDay = 0; weekDay < 7; weekDay++) {\r
900                                         string dayString = currentDay.Day.ToString ();\r
901                                         DayOfWeek dow = currentDay.DayOfWeek;
902                                         CalendarDay calDay =\r
903                                                 new CalendarDay (\r
904                                                                 currentDay,\r
905                                                                 dow == DayOfWeek.Sunday ||
906                                                                 dow == DayOfWeek.Saturday,
907                                                                 currentDay == TodaysDate, \r
908                                                                 selectedDates.Contains (currentDay),\r
909                                                                 globCal.GetMonth (currentDay) != month,\r
910                                                                 dayString\r
911                                                                 );\r
912 \r
913 \r
914                                         int dayStyles = GetMask (calDay) & definedStyles;\r
915                                         TableItemStyle currentDayStyle = styles [dayStyles];\r
916                                         if (currentDayStyle == null) {\r
917                                                 currentDayStyle = new TableItemStyle ();\r
918                                                 if ((dayStyles & MASK_DAY) != 0)\r
919                                                         currentDayStyle.CopyFrom (DayStyle);\r
920 \r
921                                                 if ((dayStyles & MASK_WEEKEND) != 0)\r
922                                                         currentDayStyle.CopyFrom (WeekendDayStyle);\r
923 \r
924                                                 if ((dayStyles & MASK_TODAY) != 0)\r
925                                                         currentDayStyle.CopyFrom (TodayDayStyle);\r
926 \r
927                                                 if ((dayStyles & MASK_OMONTH) != 0)\r
928                                                         currentDayStyle.CopyFrom (OtherMonthDayStyle);\r
929 \r
930                                                 if ((dayStyles & MASK_SELECTED) != 0) {\r
931                                                         currentDayStyle.ForeColor = Color.White;\r
932                                                         currentDayStyle.BackColor = Color.Silver;\r
933                                                         currentDayStyle.CopyFrom (SelectedDayStyle);\r
934                                                 }\r
935 \r
936                                                 currentDayStyle.Width = size;\r
937                                                 currentDayStyle.HorizontalAlign = HorizontalAlign.Center;\r
938                                         }\r
939 \r
940                                         TableCell dayCell = new TableCell ();\r
941                                         dayCell.ApplyStyle (currentDayStyle);\r
942                                         calDay.IsSelectable = isActive;\r
943                                         OnDayRender (dayCell, calDay);\r
944                                         if (isActive)\r
945                                                 dayCell.Text = GetCalendarLinkText (\r
946                                                                         "selectDay" + (crr * 7 + weekDay),\r
947                                                                         dayString,\r
948                                                                         dayCell.ForeColor,\r
949                                                                         true);\r
950                                         else\r
951                                                 dayCell.Text = dayString;\r
952 \r
953                                         dayCell.RenderControl (writer);\r
954 \r
955                                         currentDay = globCal.AddDays (currentDay, 1);\r
956                                 }\r
957                                 writer.Write("</tr>");\r
958                         }\r
959                 }\r
960 \r
961                 private int GetMask (CalendarDay day)\r
962                 {\r
963                         int retVal = MASK_DAY;\r
964                         if(day.IsSelected)\r
965                                 retVal |= MASK_SELECTED;\r
966                         if(day.IsToday)\r
967                                 retVal |= MASK_TODAY;\r
968                         if(day.IsOtherMonth)\r
969                                 retVal |= MASK_OMONTH;\r
970                         if(day.IsWeekend)\r
971                                 retVal |= MASK_WEEKEND;\r
972                         return retVal;\r
973                 }\r
974 \r
975                 /// <remarks>\r
976                 /// Refers to the second line of the calendar, that contains a link\r
977                 /// to select whole month, and weekdays as defined by DayNameFormat\r
978                 /// </remarks>\r
979                 private void RenderHeader (HtmlTextWriter writer,\r
980                                            DateTime firstDay,\r
981                                            CalendarSelectionMode mode,\r
982                                            bool isActive,\r
983                                            bool isDownLevel)\r
984                 {\r
985                         writer.Write("<tr>");\r
986                         bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||\r
987                                            mode == CalendarSelectionMode.DayWeekMonth);\r
988 \r
989                         TableCell headerCell = new TableCell ();\r
990                         headerCell.HorizontalAlign = HorizontalAlign.Center;\r
991                         string selMthText = String.Empty;\r
992                         if (isWeekMode) {\r
993                                 if (mode == CalendarSelectionMode.DayWeekMonth) {\r
994                                         headerCell.ApplyStyle (SelectorStyle);\r
995                                         selMthText = GetCalendarLinkText ("selectMonth",\r
996                                                                           SelectMonthText,\r
997                                                                           SelectorStyle.ForeColor,\r
998                                                                           isActive);\r
999                                 } else {\r
1000                                         headerCell.ApplyStyle (DayHeaderStyle);\r
1001                                         selMthText = String.Empty;\r
1002                                 }\r
1003                                 RenderCalendarCell (writer, headerCell, selMthText);\r
1004                         }\r
1005 \r
1006                         TableCell dayHeaderCell = new TableCell ();\r
1007                         dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;\r
1008                         dayHeaderCell.ApplyStyle (dayHeaderStyle);
1009 \r
1010                         int dayOfWeek = (int) globCal.GetDayOfWeek (firstDay);\r
1011                         DateTimeFormatInfo currDTInfo = DateTimeFormatInfo.CurrentInfo;\r
1012                         for(int currDay = dayOfWeek; currDay < dayOfWeek + 7; currDay++) {\r
1013                                 DayOfWeek effDay = (DayOfWeek) Enum.ToObject (typeof (DayOfWeek), currDay % 7);\r
1014                                 string currDayContent;\r
1015                                 switch(DayNameFormat) {\r
1016                                 case DayNameFormat.Full:\r
1017                                         currDayContent = currDTInfo.GetDayName (effDay);\r
1018                                         break;\r
1019                                 case DayNameFormat.FirstLetter:\r
1020                                         currDayContent = currDTInfo.GetDayName (effDay).Substring (0,1);\r
1021                                         break;\r
1022                                 case DayNameFormat.FirstTwoLetters:\r
1023                                         currDayContent = currDTInfo.GetDayName (effDay).Substring (0,2);\r
1024                                         break;\r
1025                                 case DayNameFormat.Short:\r
1026                                         goto default;\r
1027                                 default:\r
1028                                         currDayContent = currDTInfo.GetAbbreviatedDayName (effDay);\r
1029                                         break;\r
1030                                 }\r
1031 \r
1032                                 RenderCalendarCell(writer, dayHeaderCell, currDayContent);\r
1033                         }\r
1034                         writer.Write ("</tr>");\r
1035                 }\r
1036 \r
1037                 private void RenderTitle (HtmlTextWriter writer,\r
1038                                           DateTime visibleDate,\r
1039                                           CalendarSelectionMode mode,\r
1040                                           bool isActive)\r
1041                 {\r
1042                         writer.Write("<tr>");\r
1043                         Table innerTable = new Table ();\r
1044                         TableCell titleCell = new TableCell();\r
1045                         bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||\r
1046                                            mode == CalendarSelectionMode.DayWeekMonth);\r
1047 \r
1048                         titleCell.ColumnSpan = (isWeekMode ? 8 : 7);\r
1049                         titleCell.BackColor = Color.Silver;\r
1050 \r
1051                         innerTable.GridLines = GridLines.None;\r
1052                         innerTable.Width = Unit.Percentage (100);\r
1053                         innerTable.CellSpacing = 0;\r
1054                         ApplyTitleStyle (innerTable, titleCell, TitleStyle);\r
1055 \r
1056                         titleCell.RenderBeginTag (writer);\r
1057                         innerTable.RenderBeginTag (writer);\r
1058 \r
1059                         writer.Write ("<tr>");\r
1060                         string prevContent = String.Empty;\r
1061                         if (ShowNextPrevMonth) {\r
1062                                 TableCell prevCell = new TableCell ();\r
1063                                 prevCell.Width = Unit.Percentage (15);\r
1064                                 prevCell.HorizontalAlign = HorizontalAlign.Left;\r
1065                                 if (NextPrevFormat == NextPrevFormat.CustomText) {\r
1066                                         prevContent = PrevMonthText;\r
1067                                 } else {\r
1068                                         int pMthInt = globCal.GetMonth(globCal.AddMonths (visibleDate, -1));\r
1069                                         if (NextPrevFormat == NextPrevFormat.FullMonth)\r
1070                                                 prevContent = infoCal.GetMonthName (pMthInt);\r
1071                                         else\r
1072                                                 prevContent = infoCal.GetAbbreviatedMonthName (pMthInt);\r
1073                                 }\r
1074                                 prevCell.ApplyStyle (NextPrevStyle);\r
1075                                 RenderCalendarCell (writer,\r
1076                                                     prevCell,\r
1077                                                     GetCalendarLinkText ("prevMonth",\r
1078                                                                          prevContent,\r
1079                                                                          NextPrevStyle.ForeColor,\r
1080                                                                          isActive)\r
1081                                                     );\r
1082                         }\r
1083 \r
1084                         TableCell currCell = new TableCell ();\r
1085                         currCell.Width = Unit.Percentage (70);\r
1086                         if (TitleStyle.HorizontalAlign == HorizontalAlign.NotSet)\r
1087                                 currCell.HorizontalAlign = HorizontalAlign.Center;\r
1088                         else\r
1089                                 currCell.HorizontalAlign = TitleStyle.HorizontalAlign;\r
1090 \r
1091                         currCell.Wrap = TitleStyle.Wrap;\r
1092                         string currMonthContent = String.Empty;\r
1093                         if (TitleFormat == TitleFormat.Month) {\r
1094                                 currMonthContent = visibleDate.ToString ("MMMM");\r
1095                         } else {\r
1096                                 string cmcFmt = infoCal.YearMonthPattern;\r
1097                                 if (cmcFmt.IndexOf (',') >= 0)\r
1098                                         cmcFmt = "MMMM yyyy";\r
1099 \r
1100                                 currMonthContent = visibleDate.ToString (cmcFmt);\r
1101                         }\r
1102 \r
1103                         RenderCalendarCell (writer, currCell, currMonthContent);\r
1104                                                                  \r
1105                         string nextContent = String.Empty;\r
1106                         if (ShowNextPrevMonth) {\r
1107                                 TableCell nextCell = new TableCell ();\r
1108                                 nextCell.Width = Unit.Percentage(15);\r
1109                                 nextCell.HorizontalAlign = HorizontalAlign.Right;\r
1110                                 if (NextPrevFormat == NextPrevFormat.CustomText) {\r
1111                                         nextContent = NextMonthText;\r
1112                                 } else {\r
1113                                         int nMthInt = globCal.GetMonth (globCal.AddMonths (visibleDate, 1));\r
1114                                         if(NextPrevFormat == NextPrevFormat.FullMonth)\r
1115                                                 nextContent = infoCal.GetMonthName(nMthInt);\r
1116                                         else\r
1117                                                 nextContent = infoCal.GetAbbreviatedMonthName(nMthInt);\r
1118                                 }\r
1119                                 nextCell.ApplyStyle(NextPrevStyle);\r
1120                                 RenderCalendarCell (writer,\r
1121                                                     nextCell,\r
1122                                                     GetCalendarLinkText ("nextMonth",\r
1123                                                                          nextContent,\r
1124                                                                          NextPrevStyle.ForeColor,\r
1125                                                                          isActive)\r
1126                                                     );\r
1127                         }\r
1128 \r
1129                         writer.Write("</tr>");\r
1130                         innerTable.RenderEndTag(writer);\r
1131                         titleCell.RenderEndTag(writer);\r
1132 \r
1133                         writer.Write("</tr>");\r
1134                 }\r
1135 \r
1136                 private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)\r
1137                 {\r
1138                         if(style.BackColor != Color.Empty)\r
1139                         {\r
1140                                 cell.BackColor = style.BackColor;\r
1141                         }\r
1142                         if(style.BorderStyle != BorderStyle.NotSet)\r
1143                         {\r
1144                                 cell.BorderStyle = style.BorderStyle;\r
1145                         }\r
1146                         if(style.BorderColor != Color.Empty)\r
1147                         {\r
1148                                 cell.BorderColor = style.BorderColor;\r
1149                         }\r
1150                         if(style.BorderWidth != Unit.Empty)\r
1151                         {\r
1152                                 cell.BorderWidth = style.BorderWidth;\r
1153                         }\r
1154                         if(style.Height != Unit.Empty)\r
1155                         {\r
1156                                 cell.Height = style.Height;\r
1157                         }\r
1158                         if(style.VerticalAlign != VerticalAlign.NotSet)\r
1159                         {\r
1160                                 cell.VerticalAlign = style.VerticalAlign;\r
1161                         }\r
1162 \r
1163                         if(style.ForeColor != Color.Empty)\r
1164                         {\r
1165                                 table.ForeColor = style.ForeColor;\r
1166                         } else if(ForeColor != Color.Empty)\r
1167                         {\r
1168                                 table.ForeColor = ForeColor;\r
1169                         }\r
1170 \r
1171                         table.Font.CopyFrom(style.Font);\r
1172                         table.Font.MergeWith(Font);\r
1173                 }\r
1174 \r
1175                 private void RenderCalendarCell (HtmlTextWriter writer, TableCell cell, string text)\r
1176                 {\r
1177                         cell.RenderBeginTag(writer);\r
1178                         writer.Write(text);\r
1179                         cell.RenderEndTag(writer);\r
1180                 }\r
1181 \r
1182                 private DateTime GetFirstCalendarDay(DateTime visibleDate)\r
1183                 {\r
1184                         int fow = (int) FirstDayOfWeek;\r
1185                         if (fow == 7)\r
1186                                 fow = (int) infoCal.FirstDayOfWeek;\r
1187 \r
1188                         int days = (int) globCal.GetDayOfWeek (visibleDate) - fow;\r
1189                         if (days <= 0)\r
1190                                 days += 7;\r
1191                         return globCal.AddDays (visibleDate, -days);\r
1192                 }\r
1193 \r
1194                 private DateTime GetEffectiveVisibleDate()\r
1195                 {\r
1196                         DateTime dt = VisibleDate;\r
1197                         if (VisibleDate == DateTime.MinValue)\r
1198                                  dt = TodaysDate;\r
1199 \r
1200                         return globCal.AddDays (dt, 1 - globCal.GetDayOfMonth (dt));\r
1201                 }\r
1202 \r
1203                 /// <summary>\r
1204                 /// Creates text to be displayed, with all attributes if to be\r
1205                 /// shown as a hyperlink\r
1206                 /// </summary>\r
1207                 private string GetCalendarLinkText (string eventArg,\r
1208                                                     string text,\r
1209                                                     Color foreground,\r
1210                                                     bool isLink)\r
1211                 {\r
1212                         if (isLink) {\r
1213                                 StringBuilder dispVal = new StringBuilder ();\r
1214                                 dispVal.Append ("<a href=\"");\r
1215                                 dispVal.Append (Page.GetPostBackClientHyperlink (this, eventArg));\r
1216                                 dispVal.Append ("\" style=\"color: ");\r
1217                                 if (foreground.IsEmpty) {\r
1218                                         dispVal.Append (ColorTranslator.ToHtml (defaultTextColor));\r
1219                                 } else {\r
1220                                         dispVal.Append (ColorTranslator.ToHtml (foreground));\r
1221                                 }\r
1222                                 dispVal.Append ("\">");\r
1223                                 dispVal.Append (text);\r
1224                                 dispVal.Append ("</a>");\r
1225                                 return dispVal.ToString ();\r
1226                         }\r
1227                         return text;\r
1228                 }\r
1229 \r
1230                 private string GetHtmlForCell (TableCell cell, bool showLinks)\r
1231                 {\r
1232                         StringWriter sw = new StringWriter ();\r
1233                         HtmlTextWriter htw = new HtmlTextWriter (sw);\r
1234                         cell.RenderBeginTag (htw);\r
1235                         if(showLinks) {\r
1236                                 htw.Write (GetCalendarLinkText ("{0}", "{1}", cell.ForeColor, showLinks));\r
1237                         } else {\r
1238                                 htw.Write ("{0}");\r
1239                         }\r
1240                         cell.RenderEndTag (htw);\r
1241                         return sw.ToString();\r
1242                 }\r
1243 \r
1244                 internal void SelectRangeInternal (DateTime fromDate, DateTime toDate, DateTime visibleDate)\r
1245                 {\r
1246                         TimeSpan span = toDate - fromDate;\r
1247                         if (SelectedDates.Count != span.Days + 1 || \r
1248                             SelectedDates [0] != fromDate || \r
1249                             SelectedDates [SelectedDates.Count - 1] != toDate) {\r
1250                                 SelectedDates.SelectRange (fromDate, toDate);\r
1251                                 OnSelectionChanged ();\r
1252                         }\r
1253                 }\r
1254         }\r
1255 }\r