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