private void FillCalendar()
        {
            tbl.Controls.Clear();
            Table tb = new Table();

            tb.CssClass = cssMainContainerClass ?? Consts.cssMainContainerClass;
            GenerateWeekHeaders(tb);
            DateTime d             = IDate.HasValue ? IDate.Value : DateTime.Now.StartOfWeek();
            int      startMonth    = d.Month;
            int      numberOfWeeks = (int)DisplayMode;

            MethodInfo m     = Page.GetType().GetMethod(GetDataSourceMethodName);
            var        Items = (List <XCalendarItem>)m.Invoke(Page, new object[] { });

            for (int i = 0; i < numberOfWeeks; i++)
            {
                TableRow weekRow = new TableRow();
                for (int j = 0; j < 7; j++)
                {
                    while (j < (int)d.DayOfWeek)
                    {
                        weekRow.AddWeekDay(new Table()); // irelevant date
                        j++;
                    }
                    if (d.IsSameMonth(startMonth))
                    {
                        var xd = new xCalendarDay(d);
                        xd.DateInfos = Items.Where(x => x.Date == d.Date).ToList();
                        var innerTable = xd.GetDay();
                        innerTable.SetStyles(cssDayItemHeaderClass ?? Consts.cssDayItemHeaderClass, cssDayItemClass ?? Consts.cssDayItemClass);
                        innerTable.CssClass = cssDayItemContainerClass ?? Consts.cssDayItemContainerClass;
                        if (d.IsToday())
                        {
                            innerTable.CssClass = string.Format("{0} {1}", innerTable.CssClass, cssToDayItemClass ?? Consts.cssToDayItemClass);
                        }

                        weekRow.AddWeekDay(innerTable);
                    }
                    d = d.AddDays(1);
                }
                tb.Controls.Add(weekRow);
            }
            tbl.Controls.Add(tb);
        }