protected void RefreshCalendar(RecentAchievements ra)
    {
        if (ra == null)
        {
            throw new ArgumentNullException(nameof(ra));
        }
        DateTime dtMonthStart = new DateTime(ra.StartDate.Year, ra.StartDate.Month, 1);
        DateTime dtMonthEnd   = new DateTime(ra.EndDate.Year, ra.EndDate.Month, 1);

        plcFlyingCalendar.Controls.Add(new Literal()
        {
            Text = String.Format(CultureInfo.InvariantCulture, "<h2>{0}</h2>", Resources.Achievements.RecentAchievementsCalendarHeader)
        });

        for (DateTime dtCurrentMonth = dtMonthStart; dtCurrentMonth.CompareTo(dtMonthEnd) <= 0; dtCurrentMonth = dtCurrentMonth.AddMonths(1))
        {
            Panel pMonth = new Panel();
            plcFlyingCalendar.Controls.Add(pMonth);
            pMonth.CssClass = "monthContainer";
            AddMonth(dtCurrentMonth, pMonth, ra);
        }
    }
    protected void AddMonth(DateTime dt, Control parent, RecentAchievements ra)
    {
        if (parent == null)
        {
            throw new ArgumentNullException(nameof(parent));
        }
        if (ra == null)
        {
            throw new ArgumentNullException(nameof(ra));
        }
        DateTime dtDay       = new DateTime(dt.Year, dt.Month, 1);
        DateTime dtNextMonth = dtDay.AddMonths(1);

        while (dtDay.DayOfWeek > CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek)
        {
            dtDay = dtDay.AddDays(-1);
        }

        Table table = new Table();

        parent.Controls.Add(table);
        TableRow trMonth = new TableRow();

        table.Rows.Add(trMonth);
        trMonth.Cells.Add(new TableCell()
        {
            ColumnSpan = 7, Text = dt.ToString("MMMM - yyyy", CultureInfo.CurrentCulture), CssClass = "monthHeader"
        });

        table.Rows.Add(new TableRow());

        int iWeek = table.Rows.Count - 1;

        int iDayOfWeek = 0;

        // Add each of the prior-month days
        while (dtDay.Day > 1)
        {
            AddDayCell(table.Rows[iWeek], dtDay, 0, "adjacentDay");
            dtDay = dtDay.AddDays(1);
            iDayOfWeek++;
        }

        // Now add each of this month's days to the row
        while (dtDay.CompareTo(dtNextMonth) < 0)
        {
            while (iDayOfWeek++ < 7 && dtDay.CompareTo(dtNextMonth) < 0)
            {
                int cFlights = ra.FlightCountOnDate(dtDay);
                AddDayCell(table.Rows[iWeek], dtDay, cFlights, "includedDay");
                dtDay = dtDay.AddDays(1);
            }

            if (dtDay.Day == 1 || dtDay.CompareTo(dtNextMonth) >= 0)
            {
                break;
            }

            if (iDayOfWeek >= 7)
            {
                iDayOfWeek = 0;
                table.Rows.Add(new TableRow());
                iWeek = table.Rows.Count - 1;
            }
        }

        // Now add each of the days of the next month to round things out.
        while (table.Rows[iWeek].Cells.Count < 7)
        {
            AddDayCell(table.Rows[table.Rows.Count - 1], dtDay, 0, "adjacentDay");
            dtDay = dtDay.AddDays(1);
        }
    }