2002-02-21 Gaurav Vaish <gvaish@iitk.ac.in>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Calendar.cs
index 29f71ddb206d0aacf25826a3fb289baca8a2d6bc..3e8fc6ce7f2e535830e65d7d1a08660288bb317b 100755 (executable)
@@ -1,30 +1,62 @@
 /**\r
  * Namespace: System.Web.UI.WebControls\r
  * Class:     Calendar\r
- * \r
+ *\r
  * Author:  Gaurav Vaish\r
+ * Maintainer: gvaish@iitk.ac.in\r
  * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Status:  20%\r
- * \r
+ * Implementation: yes\r
+ * Status:  98%\r
+ *\r
  * (C) Gaurav Vaish (2001)\r
  */\r
 \r
 using System;\r
+using System.IO;\r
+using System.Collections;\r
+using System.Globalization;\r
+using System.Text;\r
 using System.Web;\r
 using System.Web.UI;\r
+using System.Drawing;\r
 \r
 namespace System.Web.UI.WebControls\r
 {\r
        public class Calendar : WebControl, IPostBackEventHandler\r
        {\r
                //\r
-               \r
-               private TableItemStyle dayHeaderStyle;\r
+\r
+               private TableItemStyle          dayHeaderStyle;\r
+               private TableItemStyle          dayStyle;\r
+               private TableItemStyle          nextPrevStyle;\r
+               private TableItemStyle          otherMonthDayStyle;\r
+               private SelectedDatesCollection selectedDates;\r
+               private ArrayList               selectedDatesList;\r
+               private TableItemStyle          selectedDayStyle;\r
+               private TableItemStyle          selectorStyle;\r
+               private TableItemStyle          titleStyle;\r
+               private TableItemStyle          todayDayStyle;\r
+               private TableItemStyle          weekendDayStyle;\r
+\r
+               private static readonly object DayRenderEvent           = new object();\r
+               private static readonly object SelectionChangedEvent    = new object();\r
+               private static readonly object VisibleMonthChangedEvent = new object();\r
+\r
+               private Color defaultTextColor;\r
+               private System.Globalization.Calendar globCal;\r
+\r
+               private static int MASK_WEEKEND  = (0x01 << 0);\r
+               private static int MASK_OMONTH   = (0x01 << 1);\r
+               private static int MASK_TODAY    = (0x01 << 2);\r
+               private static int MASK_SELECTED = (0x01 << 3);\r
+               private static int MASK_DAY      = (0x01 << 4);\r
+               private static int MASK_UNIQUE = MASK_WEEKEND | MASK_OMONTH | MASK_TODAY | MASK_SELECTED;\r
+\r
                public Calendar(): base()\r
                {\r
                        //TODO: Initialization\r
                }\r
-               \r
+\r
                public int CellPadding\r
                {\r
                        get\r
@@ -56,13 +88,15 @@ namespace System.Web.UI.WebControls
                                ViewState["CellSpacing"] = value;\r
                        }\r
                }\r
-               \r
+\r
                public TableItemStyle DayHeaderStyle\r
                {\r
                        get\r
                        {\r
                                if(dayHeaderStyle==null)\r
                                        dayHeaderStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       dayHeaderStyle.TrackViewState();\r
                                return dayHeaderStyle;\r
                        }\r
                }\r
@@ -83,11 +117,982 @@ namespace System.Web.UI.WebControls
                                ViewState["DayNameFormat"] = value;\r
                        }\r
                }\r
+\r
+               public TableItemStyle DayStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(dayStyle==null)\r
+                                       dayStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       dayStyle.TrackViewState();\r
+                               return dayStyle;\r
+                       }\r
+               }\r
+\r
+               public FirstDayOfWeek FirstDayOfWeek\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["FirstDayOfWeek"];\r
+                               if(o!=null)\r
+                                       return (FirstDayOfWeek)o;\r
+                               return FirstDayOfWeek.Default;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))\r
+                                       throw new ArgumentException();\r
+                               ViewState["FirstDayOfWeek"] = value;\r
+                       }\r
+               }\r
+\r
+               public string NextMonthText\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["NextMonthText"];\r
+                               if(o!=null)\r
+                                       return (string)o;\r
+                               return "&gt;";\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["NextMonthText"] = value;\r
+                       }\r
+               }\r
+\r
+               public NextPrevFormat NextPrevFormat\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["NextPrevFormat"];\r
+                               if(o!=null)\r
+                                       return (NextPrevFormat)o;\r
+                               return NextPrevFormat.CustomText;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))\r
+                                       throw new ArgumentException();\r
+                               ViewState["NextPrevFormat"] = value;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle NextPrevStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(nextPrevStyle == null)\r
+                                       nextPrevStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       nextPrevStyle.TrackViewState();\r
+                               return nextPrevStyle;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle OtherMonthDayStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(otherMonthDayStyle == null)\r
+                                       otherMonthDayStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       otherMonthDayStyle.TrackViewState();\r
+                               return otherMonthDayStyle;\r
+                       }\r
+               }\r
+\r
+               public string PrevMonthText\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["PrevMonthText"];\r
+                               if(o!=null)\r
+                                       return (string)o;\r
+                               return "&lt;";\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["PrevMonthText"] = value;\r
+                       }\r
+               }\r
+\r
+               public DateTime SelectedDate\r
+               {\r
+                       get\r
+                       {\r
+                               if(SelectedDates.Count > 0)\r
+                               {\r
+                                       return SelectedDates[0];\r
+                               }\r
+                               return DateTime.MinValue;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(value == DateTime.MinValue)\r
+                               {\r
+                                       SelectedDates.Clear();\r
+                               } else\r
+                               {\r
+                                       SelectedDates.SelectRange(value, value);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               public SelectedDatesCollection SelectedDates\r
+               {\r
+                       get\r
+                       {\r
+                               if(selectedDates==null)\r
+                               {\r
+                                       if(selectedDatesList == null)\r
+                                               selectedDatesList = new ArrayList();\r
+                                       selectedDates = new SelectedDatesCollection(selectedDatesList);\r
+                               }\r
+                               return selectedDates;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle SelectedDayStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(selectedDayStyle==null)\r
+                                       selectedDayStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       selectedDayDtyle.TrackViewState();\r
+                               return selectedDayStyle;\r
+                       }\r
+               }\r
+\r
+               public CalendarSelectionMode SelectionMode\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["SelectionMode"];\r
+                               if(o!=null)\r
+                                       return (CalendarSelectionMode)o;\r
+                               return CalendarSelectionMode.Day;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))\r
+                                       throw new ArgumentException();\r
+                               ViewState["SelectionMode"] = value;\r
+                       }\r
+               }\r
+\r
+               public string SelectedMonthText\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["SelectedMonthText"];\r
+                               if(o!=null)\r
+                                       return (string)o;\r
+                               return "&gt;&gt;";\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["SelectedMonthText"] = value;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle SelectorStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(selectorStyle==null)\r
+                                       selectorStyle = new TableItemStyle();\r
+                               return selectorStyle;\r
+                       }\r
+               }\r
+\r
+               public string SelectWeekText\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["SelectWeekText"];\r
+                               if(o!=null)\r
+                                       return (string)o;\r
+                               return "&gt;";\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["SelectWeekText"] = value;\r
+                       }\r
+               }\r
+\r
+               public bool ShowDayHeader\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["ShowDayHeader"];\r
+                               if(o!=null)\r
+                                       return (bool)o;\r
+                               return true;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["ShowDayHeader"] = value;\r
+                       }\r
+               }\r
+\r
+               public bool ShowGridLines\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["ShowGridLines"];\r
+                               if(o!=null)\r
+                                       return (bool)o;\r
+                               return false;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["ShowGridLines"] = value;\r
+                       }\r
+               }\r
+\r
+               public bool ShowNextPrevMonth\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["ShowNextPrevMonth"];\r
+                               if(o!=null)\r
+                                       return (bool)o;\r
+                               return true;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["ShowNextPrevMonth"] = value;\r
+                       }\r
+               }\r
+\r
+               public bool ShowTitle\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["ShowTitle"];\r
+                               if(o!=null)\r
+                                       return (bool)o;\r
+                               return true;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["ShowTitle"] = value;\r
+                       }\r
+               }\r
+\r
+               public TitleFormat TitleFormat\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["TitleFormat"];\r
+                               if(o!=null)\r
+                                       return (TitleFormat)o;\r
+                               return TitleFormat.MonthYear;\r
+                       }\r
+                       set\r
+                       {\r
+                               if(!System.Enum.IsDefined(typeof(TitleFormat), value))\r
+                                       throw new ArgumentException();\r
+                               ViewState["TitleFormat"] = value;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle TitleStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(titleStyle==null)\r
+                                       titleStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       titleStyle.TrackViewState();\r
+                               return titleStyle;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle TodayDayStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(todayDayStyle==null)\r
+                                       todayDayStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                                       todayDayStyle.TrackViewState();\r
+                               return todayDayStyle;\r
+                       }\r
+               }\r
+\r
+               public DateTime TodaysDate\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["TodaysDate"];\r
+                               if(o!=null)\r
+                                       return (DateTime)o;\r
+                               return DateTime.Today;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["TodaysDate"] = value;\r
+                       }\r
+               }\r
+\r
+               public DateTime VisibleDate\r
+               {\r
+                       get\r
+                       {\r
+                               object o = ViewState["VisibleDate"];\r
+                               if(o!=null)\r
+                                       return (DateTime)o;\r
+                               return DateTime.MinValue;\r
+                       }\r
+                       set\r
+                       {\r
+                               ViewState["VisibleDate"] = value;\r
+                       }\r
+               }\r
+\r
+               public TableItemStyle WeekendDayStyle\r
+               {\r
+                       get\r
+                       {\r
+                               if(weekendDayStyle == null)\r
+                                       weekendDayStyle = new TableItemStyle();\r
+                               if(IsTrackingViewState)\r
+                               {\r
+                                       weekendDayStyle.TrackViewState();\r
+                               }\r
+                               return weekendDayStyle;\r
+                       }\r
+               }\r
+\r
+               public event DayRenderEventHandler DayRender\r
+               {\r
+                       add\r
+                       {\r
+                               Events.AddHandler(DayRenderEvent, value);\r
+                       }\r
+                       remove\r
+                       {\r
+                               Events.RemoveHandler(DayRenderEvent, value);\r
+                       }\r
+               }\r
+\r
+               public event EventHandler SelectionChanged\r
+               {\r
+                       add\r
+                       {\r
+                               Events.AddHandler(SelectionChangedEvent, value);\r
+                       }\r
+                       remove\r
+                       {\r
+                               Events.RemoveHandler(SelectionChangedEvent, value);\r
+                       }\r
+               }\r
+\r
+               public event MonthChangedEventHandler VisibleMonthChanged\r
+               {\r
+                       add\r
+                       {\r
+                               Events.AddHandler(VisibleMonthChangedEvent, value);\r
+                       }\r
+                       remove\r
+                       {\r
+                               Events.RemoveHandler(VisibleMonthChangedEvent, value);\r
+                       }\r
+               }\r
+\r
+               protected virtual void OnDayRender(TableCell cell, CalendarDay day)\r
+               {\r
+                       if(Events!=null)\r
+                       {\r
+                               DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);\r
+                               if(dreh!=null)\r
+                                       dreh(this, new DayRenderEventArgs(cell, day));\r
+                       }\r
+               }\r
+\r
+               protected virtual void OnSelectionChanged()\r
+               {\r
+                       if(Events!=null)\r
+                       {\r
+                               EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);\r
+                               if(eh!=null)\r
+                                       eh(this, new EventArgs());\r
+                       }\r
+               }\r
+\r
+               protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)\r
+               {\r
+                       if(Events!=null)\r
+                       {\r
+                               MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);\r
+                               if(mceh!=null)\r
+                                       mceh(this, new MonthChangedEventArgs(newDate, prevDate));\r
+                       }\r
+               }\r
+\r
+               /// <remarks>\r
+               /// See test6.aspx in Tests directory for verification\r
+               /// </remarks>\r
+               void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
+               {\r
+                       globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
+                       DateTime visDate = GetEffectiveVisibleDate();\r
+                       //FIXME: Should it be String.Compare(eventArgument, "nextMonth", false);\r
+                       if(eventArgument == "nextMonth")\r
+                       {\r
+                               VisibleDate = globCal.AddMonths(visDate, 1);\r
+                               OnVisibleDateChanged(VisibleDate, visDate);\r
+                               return;\r
+                       }\r
+                       if(eventArgument == "prevMonth")\r
+                       {\r
+                               VisibleDate = globCal.AddMonths(visDate, -1);\r
+                               OnVisibleDateChanged(VisibleDate, visDate);\r
+                               return;\r
+                       }\r
+                       if(eventArgument == "selectMonth")\r
+                       {\r
+                               DateTime oldDate = new DateTime(globCal.GetYear(visDate), globCal.GetMonth(visDate), 1, globCal);\r
+                               SelectRangeInternal(oldDate, globCal.AddDays(gloCal.AddMonths(oldDate, 1), -1), visDate);\r
+                               return;\r
+                       }\r
+                       if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)\r
+                       {\r
+                               int week = -1;\r
+                               try\r
+                               {\r
+                                       week = Int32.Parse(eventArgument.Substring("selectWeek".Length));\r
+                               } catch(Exception e)\r
+                               {\r
+                               }\r
+                               if(week >= 0 && week <= 5)\r
+                               {\r
+                                       DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);\r
+                                       SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);\r
+                               }\r
+                               return;\r
+                       }\r
+                       if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)\r
+                       {\r
+                               int day = -1;\r
+                               try\r
+                               {\r
+                                       day = Int32.Parse(eventArgument.Substring("selectDay".Length);\r
+                               } catch(Exception e)\r
+                               {\r
+                               }\r
+                               if(day >= 0 && day <= 42)\r
+                               {\r
+                                       DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);\r
+                                       SelectRangeInternal(dayStart, dayStart, visDate);\r
+                               }\r
+                       }\r
+               }\r
+\r
+               protected override void Render(HtmlTextWriter writer)\r
+               {\r
+                       //TODO: Implement me\r
+                       globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
+                       DateTime visDate   = GetEffectiveVisibleDate()\r
+                       DateTime firstDate = GetFirstCalendarDay(visDate);\r
+                       \r
+                       bool isEnabled = false;\r
+                       bool isHtmlTextWriter = false;\r
+                       if(Page == null || Site == null || Site.DesignMode == null )\r
+                       {\r
+                               isEnabled = false;\r
+                               isHtmlTextWriter = false;\r
+                       } else\r
+                       {\r
+                               isEnabled = Enabled;\r
+                               isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));\r
+                       }\r
+                       defaultTextColor = ForeColor;\r
+                       if(defaultTextColor == Color.Empty)\r
+                               defaultTextColor = Color.Black;\r
+                       \r
+                       Table calTable = new Table();\r
+                       calTable.ID = ID;\r
+                       calTable.CopyBaseAttributes(this);\r
+                       if(ControlStyleCreated)\r
+                               ApplyStyle(ControlStyle);\r
+                       calTable.Width = Width;\r
+                       calTable.Height = Height;\r
+                       calTable.CellSpacing = CellSpacing;\r
+                       calTable.CellPadding = CellPadding;\r
+                       \r
+                       if(ControlStyleCreated && ControlStyle.IsSet(Style.BORDERWIDTH) && BorderWidth != Unit.Empty)\r
+                       {\r
+                               calTable.BorderWidth = BorderWidth;\r
+                       } else\r
+                       {\r
+                               calTable.BorderWidth = Unit.Pixel(1);\r
+                       }\r
+                       \r
+                       if(ShowGridLines)\r
+                               calTable.GridLines = GridLines.Both;\r
+                       else\r
+                               calTable.GridLines = GridLines.None;\r
+                       \r
+                       calTable.RenderBeginTag(writer);\r
+                       if(ShowTitle)\r
+                               RenderTitle(writer, visDate, SelectionMode, isEnabled);\r
+                       if(ShowDayHeader)\r
+                               RenderHeader(writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
+                       RenderAllDays(writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
+                       \r
+                       calTable.RenderEndTag(writer);\r
+               }\r
+\r
+               protected override ControlCollection CreateControlCollection()\r
+               {\r
+                       return new EmptyControlCollection(this);\r
+               }\r
+\r
+               protected override void LoadViewState(object savedState)\r
+               {\r
+                       if(savedState!=null)\r
+                       {\r
+                               if(ViewState["_CalendarSelectedDates"] != null)\r
+                                       SelectedDates = (SelectedDatesCollection)ViewState["_CalendarSelectedDates"];\r
+\r
+                               object[] states = (object[]) savedState;\r
+                               if(states[0] != null)\r
+                                       base.LoadViewState(states[0]);\r
+                               if(states[1] != null)\r
+                                       DayHeaderStyle.LoadViewState(states[1]);\r
+                               if(states[2] != null)\r
+                                       DayStyle.LoadViewState(states[2]);\r
+                               if(states[3] != null)\r
+                                       NextPrevStyle.LoadViewState(states[3]);\r
+                               if(states[4] != null)\r
+                                       OtherMonthStyle.LoadViewState(states[4]);\r
+                               if(states[5] != null)\r
+                                       SelectedDayStyle.LoadViewState(states[5]);\r
+                               if(states[6] != null)\r
+                                       SelectorStyle.LoadViewState(states[6]);\r
+                               if(states[7] != null)\r
+                                       TitleStyle.LoadViewState(states[7]);\r
+                               if(states[8] != null)\r
+                                       TodayDayStyle.LoadViewState(states[8]);\r
+                               if(states[9] != null)\r
+                                       WeekendDayStyle.LoadViewState(states[9]);\r
+                       }\r
+               }\r
+\r
+               protected override object SaveViewState()\r
+               {\r
+                       ViewState["_CalendarSelectedDates"] = (SelectedDates.Count > 0 ? selectedDates : null);\r
+                       object[] states = new object[11];\r
+                       states[0] = base.SaveViewState();\r
+                       states[1] = (dayHeaderStyle == null ? null : dayHeaderStyle.SaveViewStyle());\r
+                       states[2] = (dayStyle == null ? null : dayStyle.SaveViewStyle());\r
+                       states[3] = (nextPrevStyle == null ? null : nextPrevStyle.SaveViewStyle());\r
+                       states[4] = (otherMonthDayStyle == null ? null : otherMonthDayStyle.SaveViewStyle());\r
+                       states[5] = (selectedDayStyle == null ? null : selectedDayStyle.SaveViewStyle());\r
+                       states[6] = (selectorStyle == null ? null : selectorStyle.SaveViewStyle());\r
+                       states[7] = (titleStyle == null ? null : titleStyle.SaveViewStyle());\r
+                       states[8] = (todayDayStyle == null ? null : todayDayStyle.SaveViewStyle());\r
+                       states[9] = (weekendDayStyle == null ? null : weekendDayStyle.SaveViewStyle());\r
+                       for(int i=0; i < states.Length)\r
+                       {\r
+                               if(states[i]!=null)\r
+                                       return states;\r
+                       }\r
+                       return null;\r
+               }\r
+\r
+               protected override void TrackViewState(): TrackViewState()\r
+               {\r
+                       if(titleStyle!=null)\r
+                       {\r
+                               titleStyle.TrackViewState();\r
+                       }\r
+                       if(nextPrevStyle!=null)\r
+                       {\r
+                               nextPrevStyle.TrackViewState();\r
+                       }\r
+                       if(dayStyle!=null)\r
+                       {\r
+                               dayStyle.TrackViewState();\r
+                       }\r
+                       if(dayHeaderStyle!=null)\r
+                       {\r
+                               dayHeaderStyle.TrackViewState();\r
+                       }\r
+                       if(todayDayStyle!=null)\r
+                       {\r
+                               todayDayStyle.TrackViewState();\r
+                       }\r
+                       if(weekendDayStyle!=null)\r
+                       {\r
+                               weekendDayStyle.TrackViewState();\r
+                       }\r
+                       if(otherMonthDayStyle!=null)\r
+                       {\r
+                               otherMonthDayStyle.TrackViewState();\r
+                       }\r
+                       if(selectedDayStyle!=null)\r
+                       {\r
+                               selectedDayStyle.TrackViewState();\r
+                       }\r
+                       if(selectorStyle!=null)\r
+                       {\r
+                               selectorStyle.TrackViewState();\r
+                       }\r
+               }\r
+\r
+               [MonoTODO("Individual_Day_Rendering_Part_Left")]\r
+               private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
+               {\r
+                       TableCell weeksCell;\r
+                       string weeksCellData;\r
+                       bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+                       if(isWeekMode)\r
+                       {\r
+                               weeksCell = new TableCell();\r
+                               weeksCell.Width = Unit.Percentage(12);\r
+                               weeksCell.HorizontalAlign = HorizontalAlign.Center;\r
+                               weeksCell.ApplyStyle(SelectorStyle);\r
+                               if(!isDownLevel)\r
+                                       weeksCellData = GetHtmlForCell(weeksCell, isActive);\r
+                       }\r
+                       bool dayRenderBool = false;\r
+                       if(GetType() != typeof(Calendar) || Events[DayRenderEvent] != null || !isDownLevel)\r
+                               dayRenderBool = true;\r
+\r
+                       string[] content = new string[0x01 << 4];\r
+                       int definedStyles = MASK_SELECTED;\r
+                       if(weekendStyle != null && !weekendStyle.IsEmpty)\r
+                               definedStyles |= MASK_WEEKEND;\r
+                       if(otherMonthStyle != null && !otherMonthStyle.IsEmpty)\r
+                               definedStyles |= MASK_OMONTH;\r
+                       if(todayDayStyle != null && todayDayStyle.IsEmpty)\r
+                               definedStyles |= MASK_TODAY;\r
+                       if(dayStyle != null && !dayStyle.IsEmpty)\r
+                               definedStyles |= MASK_DAY;\r
+\r
+                       bool selectDayBool = false;\r
+                       if(isActive && mode != CalendarSelectionMode.None)\r
+                       {\r
+                               selectDayBool = true;\r
+                       }\r
+                       \r
+                       for(int crr = 0; crr < 6; crr++)\r
+                       {\r
+                               writer.Write("<tr>");\r
+                               if(isWeekMode)\r
+                               {\r
+                                       if(isDownLevel)\r
+                                       {\r
+                                               string cellText = GetCalendarLinkText("selectWeek" + crr.ToString(), SelectWeekText, isActive, weeksCell.ForeColor);\r
+                                               weeksCell.Text = cellText;\r
+                                               RenderCalendarCell(writer, weeksCell, cellText);\r
+                                       } else\r
+                                       {\r
+                                               if(isActive)\r
+                                               {\r
+                                                       writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString(), SelectWeekText));\r
+                                               } else\r
+                                               {\r
+                                                       writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString()));\r
+                                               }\r
+                                       }\r
+                               }\r
+                               for(int crc = 0; crc < 7; crc++)\r
+                               {\r
+                                       // have to display for each day in the week.\r
+                                       throw new NotImplementedException();\r
+                               }\r
+                       }\r
+\r
+                       throw new NotImplementedException();\r
+               }\r
                \r
-               public void RaisePostBackEvent(string eventArgument)\r
+               private int GetMask(CalendarDay day)\r
+               {\r
+                       int retVal = MASK_DAY;\r
+                       if(day.IsSelected)\r
+                               retVal |= MASK_SELECTED;\r
+                       if(day.IsToday)\r
+                               retVal |= MASK_TODAY;\r
+                       if(day.IsOtherMonth)\r
+                               retVal |= MASK_OMONTH;\r
+                       if(day.IsWeekend)\r
+                               retVal |= MASK_WEEKEND;\r
+                       return retVal;\r
+               }\r
+\r
+               /// <remarks>\r
+               /// Refers to the second line of the calendar, that contains a link\r
+               /// to select whole month, and weekdays as defined by DayNameFormat\r
+               /// </remarks>\r
+               private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
+               {\r
+                       writer.Write("<tr>");\r
+                       bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+                       TableCell headerCell = new TableCell();\r
+                       headerCell.HorizontalAlign = HorizontalAlign.Center;\r
+                       string selMthText = String.Empty;\r
+                       if(isWeekMode)\r
+                       {\r
+                               headerCell.ApplyStyle(SelectorStyle);\r
+                               selMthText = GetCalendarLinkText("selectMonth", SelectMonthText, isActive, SelectorStyle.ForeColor);\r
+                       } else\r
+                       {\r
+                               headerCell.ApplyStyle(DayHeaderStyle);\r
+                       }\r
+                       RenderCalendarCell(writer, headerCell, selMthText);\r
+                       \r
+                       TableCell dayHeaderCell = new TableCell();\r
+                       dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;\r
+                       string content = null;\r
+                       if(!isDownLevel)\r
+                       {\r
+                               content = GetHtmlForCell(dayHeaderCell, isActive);\r
+                       }\r
+                       int dayOfWeek = (int)globCal.GetDayOfWeek(firstDay);\r
+                       for(int currDay = dayOfWeek; currDay < dayOfWeek + 7; currDay++)\r
+                       {\r
+                               int effDay = (currDay % 7);\r
+                               string currDayContent = String.Empty;\r
+                               switch(DayNameFormat)\r
+                               {\r
+                                       DayNameFormat.Full:            currDayContent = DateTimeFormatInfo.GetDayName(effDay);\r
+                                                                      break;\r
+                                       DayNameFormat.FirstLetter:     currDayContent = DateTimeFormatInfo.GetDayName(effDay).Substring(0,1);\r
+                                                                      break;\r
+                                       DayNameFormat.FirstTwoLetters: currDayContent = DateTimeFormatInfo.GetDayName(effDay).Substring(0,2);\r
+                                                                      break;\r
+                                       DayNameFormat.Short:\r
+                                       default:                       currDayContent = DateTimeFormatInfo.GetAbbreviatedDayName(effDay);\r
+                                                                      break;\r
+                               }\r
+                               if(isDownLevel)\r
+                               {\r
+                                       RenderCalendarCell(writer, dayHeaderCell, currDayContent);\r
+                               } else\r
+                               {\r
+                                       writer.Write(String.Format(content, currDayContent);\r
+                               }\r
+                       }\r
+                       writer.Write("</tr>");\r
+               }\r
+\r
+               private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)\r
                {\r
-                       //TODO: THE LOST WORLD\r
-                       // Written to keep compile get going\r
+                       writer.Write("<tr>");\r
+                       Table innerTable = new Table();\r
+                       TableCell titleCell = new TableCell();\r
+                       bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+                       titleCell.ColumnSpan = (isWeekMode ? 8 : 7);\r
+                       titleCell.BackColor = "Silver";\r
+                       \r
+                       innerTable.GridLines = GridLine.None;\r
+                       innerTable.Width = Unit.Percentage(100);\r
+                       innerTable.CellSpacing = 0;\r
+                       ApplyTitleStyle(innerTable, titleCell, TitleStyle);\r
+                       \r
+                       innerTable.RenderBeginTag(writer);\r
+                       titleCell.RenderBeginTag(writer);\r
+                       \r
+                       writer.Write("<tr>");\r
+                       string prevContent = String.Empty;\r
+                       if(ShowNextPrevMonth)\r
+                       {\r
+                               TableCell prevCell = new TableCell();\r
+                               prevCell.Width = Unit.Percentage(15);\r
+                               prevCell.HorizontalAlign = HorizontalAlign.Left;\r
+                               if(NextPrevFormat == NextPrevFormat.CustomText)\r
+                               {\r
+                                       prevContent = PrevMonthText;\r
+                               } else\r
+                               {\r
+                                       int pMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, -1));\r
+                                       if(NextPrevFormat == NextPrevFormat.FullText)\r
+                                               prevContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(pMthInt);\r
+                                       else\r
+                                               prevContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(pMthInt);\r
+                               }\r
+                               prevCell.ApplyStyle(NextPrevStyle);\r
+                               RenderCalendarCell(writer, prevCell, GetCalendarLinkText("prevMonth", prevContent, isActive, NextPrevStyle.ForeColor));\r
+                       }\r
+                       TableCell currCell = new TableCell();\r
+                       currCell.Width = Unit.Percentage(70);\r
+                       if(TitleStyle.HorizontalAlign == HorizontalAlign.NotSet)\r
+                               currCell.HorizontalAlign = HorizontalAlign.Center;\r
+                       else\r
+                               currCell.HorizontalAlign = TitleStyle.HorizontalAlign;\r
+                       currCell.Wrap = TitleStyle.Wrap;\r
+                       string currMonthContent = String.Empty;\r
+                       if(TitleFormat == TitleFormat.Month)\r
+                       {\r
+                               currMonthContent = visibleDate.ToString("MMMM");\r
+                       } else\r
+                       {\r
+                               string cmcFmt = DateTimeFormatInfo.CurrentInfo.YearMonthPattern;\r
+                               if(cmcFmt.IndexOf(',') >= 0)\r
+                               {\r
+                                       cmcFmt = "MMMM yyyy";\r
+                               }\r
+                               currMonthContent = visibleDate.ToString(cmcFmt);\r
+                       }\r
+                       string nextContent = String.Empty;\r
+                       if(ShowNextPrevMonth)\r
+                       {\r
+                               TableCell nextCell = new TableCell();\r
+                               nextCell.Width = Unit.Percentage(15);\r
+                               nextCell.HorizontalAlign = HorizontalAlign.Left;\r
+                               if(NextPrevFormat == NextPrevFormat.CustomText)\r
+                               {\r
+                                       nextContent = PrevMonthText;\r
+                               } else\r
+                               {\r
+                                       int nMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, 1));\r
+                                       if(NextPrevFormat == NextPrevFormat.FullText)\r
+                                               nextContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(nMthInt);\r
+                                       else\r
+                                               nextContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(nMthInt);\r
+                               }\r
+                               nextCell.ApplyStyle(NextPrevStyle);\r
+                               RenderCalendarCell(writer, nextCell, GetCalendarLinkText("nextMonth", nextContent, isActive, NextPrevStyle.ForeColor));\r
+                       }\r
+                       \r
+                       writer.Write("</tr>");\r
+                       titleCell.RenderEndTag(writer);\r
+                       innerTable.RenderEndTag(writer);\r
+                       \r
+                       writer.Write("</tr>");\r
+               }\r
+\r
+               private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)\r
+               {\r
+                       if(style.BackColor != Color.Empty)\r
+                       {\r
+                               cell.BackColor = style.BackColor;\r
+                       }\r
+                       if(style.BorderStyle != BorderStyle.NotSet)\r
+                       {\r
+                               cell.BorderStyle = style.BorderStyle;\r
+                       }\r
+                       if(style.BorderColor != Color.Empty)\r
+                       {\r
+                               cell.BorderColor = style.BorderColor;\r
+                       }\r
+                       if(style.BorderWidth != Unit.Empty)\r
+                       {\r
+                               cell.BorderWidth = style.BorderWidth;\r
+                       }\r
+                       if(style.Height != Unit.Empty)\r
+                       {\r
+                               cell.Height = style.Height;\r
+                       }\r
+                       if(style.VerticalAlign != VerticalAlign.NotSet)\r
+                       {\r
+                               cell.VerticalAlign = style.VerticalAlign;\r
+                       }\r
+                       \r
+                       if(style.ForeColor != Color.Empty)\r
+                       {\r
+                               table.ForeColor = style.ForeColor;\r
+                       } else if(ForeColor != Color.Empty)\r
+                       {\r
+                               table.ForeColor = ForeColor;\r
+                       }\r
+                       \r
+                       table.Font.CopyFrom(style.Font);\r
+                       table.Font.MergeWith(Font);\r
+               }\r
+\r
+               private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)\r
+               {\r
+                       cell.RenderBeginTag(writer);\r
+                       writer.Write(text);\r
+                       cell.RenderEndTag(writer);\r
+               }\r
+\r
+               private DateTime GetFirstCalendarDay(DateTime visibleDate)\r
+               {\r
+                       DayOfWeek firstDay = ( FirstDayOfWeek == FirstDayOfWeek.Default ? DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek : FirstDayOfWeek);\r
+                       //FIXME: is (int)(Enum) correct?\r
+                       int days = (int)globCal.GetDayOfWeek(visibleDate) - (int)firstDay;\r
+                       if(days < 0)\r
+                       {\r
+                               days += 7;\r
+                       }\r
+                       return globCal.AddDays(visibleDate, -days);\r
+               }\r
+\r
+               private DateTime GetEffectiveVisibleDate()\r
+               {\r
+                       DateTime dt = VisibleDate;\r
+                       if(dt.Equals(DateTime.MinValue))\r
+                       {\r
+                               dt = TodaysDate;\r
+                       }\r
+                       return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);\r
+               }\r
+\r
+               /// <summary>\r
+               /// Creates text to be displayed, with all attributes if to be\r
+               /// shown as a hyperlink\r
+               /// </summary>\r
+               private string GetCalendarLinkText(string eventArg, string text, Color foreground, bool isLink)\r
+               {\r
+                       if(isLink)\r
+                       {\r
+                               StringBuilder dispVal = new StringBuilder();\r
+                               dispVal.Append("<a href=\"");\r
+                               dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));\r
+                               dispVal.Append("\" style=\"color: ");\r
+                               if(foreground.IsEmpty)\r
+                               {\r
+                                       dispVal.Append(ColorTranslator.ToHtml(defaultTextColor));\r
+                               } else\r
+                               {\r
+                                       dispVal.Append(ColorTranslator.ToHtml(foreground));\r
+                               }\r
+                               dispVal.Append("\">");\r
+                               dispVal.Append(text);\r
+                               dispVal.Append("</a>");\r
+                               return dispVal.ToString();\r
+                       }\r
+                       return text;\r
+               }\r
+\r
+               private string GetHtmlForCell(TableCell cell, bool showLinks)\r
+               {\r
+                       StringWriter sw = new StringWriter();\r
+                       HtmlTextWriter htw = new HtmlTextWriter(sw);\r
+                       cell.RenderBeginTag(htw);\r
+                       if(showLinks)\r
+                       {\r
+                               htw.Write(GetCalendarLinkText("{0}", "{1}", cell.ForeColor, showLinks));\r
+                       } else\r
+                       {\r
+                               htw.Write("{0}");\r
+                       }\r
+                       cell.RenderEndTag(htw);\r
+                       return sw.ToString();\r
+               }\r
+\r
+               internal DateTime SelectRangeInternal(DateTime fromDate, DateTime toDate, DateTime visibleDate)\r
+               {\r
+                       TimeSpan span = fromDate - toDate;\r
+                       if(SelectedDates.Count != span.Days || SelectedDates[SelectedDate.Count - 1]!= toDate)\r
+                       {\r
+                               SelectedDates.SelectRange(fromDate, toDate);\r
+                               OnSelectionChanged();\r
+                       }\r
+                       if(globCal.GetMonth(fromDate) == globCal.GetMonth(fromDate) && globCal.GetMonth(fromDate) != globCal.GetMonth(visibleDate)\r
+                       {\r
+                               VisibleDate = new DateTime(globCal.GetYear(fromDate), globCal.getMonth(fromDate), 1, globCal);\r
+                               OnVisibleMonthChanged(VisibleDate, visibleDate);\r
+                       }\r
                }\r
        }\r
 }\r