#if FRAMEWORK20
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Imaging;
using DevComponents.DotNetBar.Rendering;
namespace DevComponents.DotNetBar.Schedule
{
    /// 
    /// Represents date-navigation control that is used with CalendarView to provide calendar date navigation.
    /// 
    [ToolboxItem(true), ToolboxBitmap(typeof(DateNavigator), "Schedule.DateNavigator.ico")]
    [Designer("DevComponents.DotNetBar.Design.DateNavigatorDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral,  PublicKeyToken=90f470f34c89ccaf")]
    public partial class DateNavigator : PanelEx
    {
        #region Events
        /// 
        /// Occurs when a date Navigation is occurring
        /// 
        [Description("Occurs when a date Navigation is occurring.")]
        public event EventHandler DateChanging;
        /// 
        /// Occurs when a date Navigation has occurred
        /// 
        [Description("Occurs when a date Navigation has occurred.")]
        public event EventHandler DateChanged;
        /// 
        /// Occurs when the DateNavigator needs a formatted date label
        /// 
        [Description("Occurs when the DateNavigator needs a formatted date label.")]
        public event EventHandler GetDateLabel;
        
        #endregion
        #region Constants
        private const int MaxYearMonthSpan = 120;
        #endregion
        #region Private variables
        private CalendarView _CalendarView;
        private string _CurrentDayLabel = "MMMM dd, yyyy";
        private string _CurrentWeekStartLabel = "MMMM dd, yyyy";
        private string _CurrentWeekEndLabel = "MMMM dd, yyyy";
        private string _CurrentWeekSameYearStartLabel = "MMMM dd";
        private string _CurrentWeekSameYearEndLabel = "MMMM dd, yyyy";
        private string _CurrentWeekSameMonthYearStartLabel = "MMMM dd";
        private string _CurrentWeekSameMonthYearEndLabel = "dd, yyyy";
        private string _CurrentMonthStartLabel = "MMMM yyyy";
        private string _CurrentMonthEndLabel = "MMMM yyyy";
        private string _CurrentYearStartLabel = "MMMM yyyy";
        private string _CurrentYearEndLabel = "MMMM yyyy";
        private string _CurrentTimeLineHourLabel = "MMMM dd, yyyy";
        private string _CurrentTimeLineDayStartLabel = "MMMM dd, yyyy";
        private string _CurrentTimeLineDayEndLabel = "MMMM dd, yyyy";
        private string _CurrentTimeLineDaySameYearStartLabel = "MMMM dd";
        private string _CurrentTimeLineDaySameYearEndLabel = "MMMM dd, yyyy";
        private string _CurrentTimeLineDaySameMonthYearStartLabel = "MMMM dd";
        private string _CurrentTimeLineDaySameMonthYearEndLabel = "dd, yyyy";
        private string _CurrentTimeLineYearStartLabel = "yyyy";
        private string _CurrentTimeLineYearEndLabel = "yyyy";
        #endregion
        public DateNavigator()
        {
            InitializeComponent();
            UpdateButtonImages();
            Style.BackColor1.Color =
                ((Office2007Renderer)GlobalManager.Renderer).ColorTable.CalendarView.TimeRulerColors[0].Colors[0];
            StyleManager.Register(this);
        }
        #region Public properties
        #region CalendarView
        /// 
        /// Gets or sets the CalendarView date navigation will be applied to.
        /// 
        [DefaultValue(null), Category("Behavior")]
        [Description("Indicates CalendarView date navigation will be applied to.")]
        public CalendarView CalendarView
        {
            get { return _CalendarView; }
            set
            {
                if (_CalendarView != null)
                {
                    _CalendarView.SelectedViewChanged -= CalendarSelectedViewChanged;
                    _CalendarView.ViewDateChanged -= CalendarViewViewDateChanged;
                    _CalendarView.TimeLineViewScrollDateChanged -= CalendarViewTimeLineViewScrollDateChanged;
                }
                _CalendarView = value;
                if (_CalendarView != null)
                {
                    _CalendarView.SelectedViewChanged += CalendarSelectedViewChanged;
                    _CalendarView.ViewDateChanged += CalendarViewViewDateChanged;
                    _CalendarView.TimeLineViewScrollDateChanged += CalendarViewTimeLineViewScrollDateChanged;
                }
                UpdateDisplay();
            }
        }
        /// 
        /// Handles CalendarView ViewDateChanged events
        /// 
        /// 
        /// 
        void CalendarViewViewDateChanged(object sender, ViewDateChangedEventArgs e)
        {
            UpdateDisplay();
        }
        /// 
        /// Handle CalendarView SelectedViewChanged events
        /// 
        /// 
        /// 
        private void CalendarSelectedViewChanged(object sender, SelectedViewEventArgs e)
        {
            UpdateDisplay();
        }
        /// 
        /// Handles CalendarView_TimeLineViewScrollDateChanged events
        /// 
        /// 
        /// 
        void CalendarViewTimeLineViewScrollDateChanged(object sender, EventArgs e)
        {
            UpdateDisplay();
        }
        #endregion
        #region CurrentDayLabel
        /// 
        /// Gets or sets the current Day format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current Day format label.")]
        public string CurrentDayLabel
        {
            get { return (_CurrentDayLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentDayLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekStartLabel
        /// 
        /// Gets or sets the current Week, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current Week, start format label.")]
        public string CurrentWeekStartLabel
        {
            get { return (_CurrentWeekStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekEndLabel
        /// 
        /// Gets or sets the current Week, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current Week, end format label.")]
        public string CurrentWeekEndLabel
        {
            get { return (_CurrentWeekEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekSameYearStartLabel
        /// 
        /// Gets or sets the current Week, same Year, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd"), Category("Appearance")]
        [Description("Indicates the current Week, same Year, start format label.")]
        public string CurrentWeekSameYearStartLabel
        {
            get { return (_CurrentWeekSameYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekSameYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekSameYearEndLabel
        /// 
        /// Gets or sets the current Week, same Year, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current Week, same Year, end format label.")]
        public string CurrentWeekSameYearEndLabel
        {
            get { return (_CurrentWeekSameYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekSameYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekSameMonthYearStartLabel
        /// 
        /// Gets or sets the current Week, same Month & Year, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd"), Category("Appearance")]
        [Description("Indicates the current Week, same Month & Year, start format label.")]
        public string CurrentWeekSameMonthYearStartLabel
        {
            get { return (_CurrentWeekSameMonthYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekSameMonthYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentWeekSameMonthYearEndLabel
        /// 
        /// Gets or sets the current Week, same Month & Year, end format label
        /// 
        [Localizable(true), DefaultValue("dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current Week, same Month & Year, end format label.")]
        public string CurrentWeekSameMonthYearEndLabel
        {
            get { return (_CurrentWeekSameMonthYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentWeekSameMonthYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentMonthStartLabel
        /// 
        /// Gets or sets the current Month, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM yyyy"), Category("Appearance")]
        [Description("Indicates the current Month, start format label.")]
        public string CurrentMonthStartLabel
        {
            get { return (_CurrentMonthStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentMonthStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentMonthEndLabel
        /// 
        /// Gets or sets the current Month, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM yyyy"), Category("Appearance")]
        [Description("Indicates the current Month, end format label.")]
        public string CurrentMonthEndLabel
        {
            get { return (_CurrentMonthEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentMonthEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentYearStartLabel
        /// 
        /// Gets or sets the current Year, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM yyyy"), Category("Appearance")]
        [Description("Indicates the current Year, start format label.")]
        public string CurrentYearStartLabel
        {
            get { return (_CurrentYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentYearEndLabel
        /// 
        /// Gets or sets the current Year, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM yyyy"), Category("Appearance")]
        [Description("Indicates the current Year, end format label.")]
        public string CurrentYearEndLabel
        {
            get { return (_CurrentYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineHourLabel
        /// 
        /// Gets or sets the current TimeLine Hour format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Hour format label.")]
        public string CurrentTimeLineHourLabel
        {
            get { return (_CurrentTimeLineHourLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineHourLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDayStartLabel
        /// 
        /// Gets or sets the current TimeLine Day, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, start format label.")]
        public string CurrentTimeLineDayStartLabel
        {
            get { return (_CurrentTimeLineDayStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDayStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDayEndLabel
        /// 
        /// Gets or sets the current TimeLine Day, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, end format label.")]
        public string CurrentTimeLineDayEndLabel
        {
            get { return (_CurrentTimeLineDayEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDayEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDaySameYearStartLabel
        /// 
        /// Gets or sets the current TimeLine Day, same Year, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, same Year, start format label.")]
        public string CurrentTimeLineDaySameYearStartLabel
        {
            get { return (_CurrentTimeLineDaySameYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDaySameYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDaySameYearEndLabel
        /// 
        /// Gets or sets the current TimeLine Day, same Year, end format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, same Year, end format label.")]
        public string CurrentTimeLineDaySameYearEndLabel
        {
            get { return (_CurrentTimeLineDaySameYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDaySameYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDaySameMonthYearStartLabel
        /// 
        /// Gets or sets the current TimeLine Day, same Month & Year, start format label
        /// 
        [Localizable(true), DefaultValue("MMMM dd"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, same Month & Year, start format label.")]
        public string CurrentTimeLineDaySameMonthYearStartLabel
        {
            get { return (_CurrentTimeLineDaySameMonthYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDaySameMonthYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineDaySameMonthYearEndLabel
        /// 
        /// Gets or sets the current TimeLine Day, same Month & Year, end format label
        /// 
        [Localizable(true), DefaultValue("dd, yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Day, same Month & Year, end format label.")]
        public string CurrentTimeLineDaySameMonthYearEndLabel
        {
            get { return (_CurrentTimeLineDaySameMonthYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineDaySameMonthYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineYearStartLabel
        /// 
        /// Gets or sets the current TimeLine Year, start format label
        /// 
        [Localizable(true), DefaultValue("yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Year, start format label.")]
        public string CurrentTimeLineYearStartLabel
        {
            get { return (_CurrentTimeLineYearStartLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineYearStartLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region CurrentTimeLineYearEndLabel
        /// 
        /// Gets or sets the current TimeLine Year, end format label
        /// 
        [Localizable(true), DefaultValue("yyyy"), Category("Appearance")]
        [Description("Indicates the current TimeLine Year, end format label.")]
        public string CurrentTimeLineYearEndLabel
        {
            get { return (_CurrentTimeLineYearEndLabel); }
            set
            {
                if (value == null)
                    value = "";
                _CurrentTimeLineYearEndLabel = value;
                UpdateDisplay();
            }
        }
        #endregion
        #region WeekDaysNavigationEnabled
        private bool _WeekDaysNavigationEnabled = true;
        /// 
        /// Gets or sets whether in Week View week-days navigation is enabled. Default value is true. When week-days navigation is enabled
        /// and start date points to Monday and end date points to Friday, navigating to next day will navigate to next Monday-Friday view.
        /// 
        [DefaultValue(true), Category("Behavior")]
        [Description("Indicates whether in Week View week-days navigation is enabled. When week-days navigation is enabled and start date points to Monday and end date points to Friday, navigating to next day will navigate to next Monday-Friday view.")]
        public bool WeekDaysNavigationEnabled
        {
            get { return _WeekDaysNavigationEnabled; }
            set
            {
                _WeekDaysNavigationEnabled = value;
            }
        }
        #endregion
        #endregion
        #region StyleManagerStyleChanged
        /// 
        /// Called by StyleManager to notify control that style on manager has changed and that control should refresh its appearance if
        /// its style is controlled by StyleManager.
        /// 
        /// New active style.
        [EditorBrowsable(EditorBrowsableState.Never)]
        public override void StyleManagerStyleChanged(eDotNetBarStyle newStyle)
        {
            base.StyleManagerStyleChanged(newStyle);
            UpdateButtonImages();
            this.Style.BackColor1.Color = ((Office2007Renderer)GlobalManager.Renderer).ColorTable.CalendarView.TimeRulerColors[0].Colors[0];
        }
        #endregion
        #region Navigate_click routines
        /// 
        /// Handles NavigateForward button clicks
        /// 
        /// 
        /// 
        private void NavigateForwardClick(object sender, EventArgs e)
        {
            NavigateDatesForward();
        }
        /// 
        /// Handles NavigateBack button clicks
        /// 
        /// 
        /// 
        private void NavigateBackClick(object sender, EventArgs e)
        {
            NavigateDatesBack();
        }
        #endregion
        #region NavigateDatesForward
        /// 
        /// Navigates forward
        /// 
        private void NavigateDatesForward()
        {
            if (_CalendarView != null)
            {
                switch (_CalendarView.SelectedView)
                {
                    case eCalendarView.Day:
                        NavigateDayForward();
                        break;
                    case eCalendarView.Week:
                        NavigateWeekForward();
                        break;
                    case eCalendarView.Month:
                        NavigateMonthForward();
                        break;
                    case eCalendarView.Year:
                        NavigateYearForward();
                        break;
                    case eCalendarView.TimeLine:
                        NavigateTimeLineForward();
                        break;
                }
                UpdateDisplay();
            }
        }
        #region NavigateDayForward
        /// 
        /// NavigateDayForward
        /// 
        private void NavigateDayForward()
        {
            DateTime oldDate = _CalendarView.DayViewDate;
            DateTime newDate = _CalendarView.DayViewDate.AddDays(1);
            if (DoDateChanging(NavigationDirection.Forward,
                oldDate, oldDate, ref newDate, ref newDate) == false)
            {
                _CalendarView.DayViewDate = newDate;
                DoDateChanged(NavigationDirection.Forward, oldDate, oldDate, newDate, newDate);
            }
        }
        #endregion
        #region NavigateWeekForward
        /// 
        /// NavigateWeekForward
        /// 
        private void NavigateWeekForward()
        {
            DateTime calendarStart = _CalendarView.WeekViewStartDate;
            DateTime calendarEnd = _CalendarView.WeekViewEndDate;
            TimeSpan span = calendarEnd.Subtract(calendarStart);
            DateTime start = calendarStart.AddDays(1).Add(span);
            DateTime end = calendarEnd.AddDays(1).Add(span);
            if (WeekDaysNavigationEnabled &&
                calendarStart.DayOfWeek == DayOfWeek.Monday && calendarEnd.DayOfWeek == DayOfWeek.Friday)
            {
                // Browse week-days only
                start = calendarStart.AddDays(7);
                end = start.AddDays(4);
            }
            if (DoDateChanging(NavigationDirection.Forward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.WeekViewStartDate = start;
                _CalendarView.WeekViewEndDate = end;
                DoDateChanged(NavigationDirection.Forward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateMonthForward
        /// 
        /// NavigateMonthForward
        /// 
        private void NavigateMonthForward()
        {
            DateTime calendarStart = _CalendarView.MonthViewStartDate;
            DateTime calendarEnd = _CalendarView.MonthViewEndDate;
            TimeSpan span = calendarEnd.Subtract(calendarStart);
            DateTime start = calendarStart.AddMonths(1);
            DateTime end = start.Add(span);
            if (calendarStart.Day == 1 &&
                calendarEnd.Day == ScheduleSettings.GetActiveCulture().Calendar.GetDaysInMonth(calendarEnd.Year, calendarEnd.Month))
            {
                end = start.AddMonths(1).AddMinutes(-1);
            }
            if (DoDateChanging(NavigationDirection.Forward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.MonthViewStartDate = start;
                _CalendarView.MonthViewEndDate = end;
                DoDateChanged(NavigationDirection.Forward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateYearForward
        /// 
        /// NavigateYearForward
        /// 
        private void NavigateYearForward()
        {
            DateTime calendarStart = _CalendarView.YearViewStartDate;
            DateTime calendarEnd = _CalendarView.YearViewEndDate;
            int months = CountMonthSpan(calendarStart, calendarEnd);
            DateTime start = calendarEnd.AddMonths(1);
            start = start.AddDays(-start.Day + 1);
            DateTime end = start.AddMonths(months + 1);
            end = end.AddDays(-1);
            if (DoDateChanging(NavigationDirection.Forward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.YearViewStartDate = start;
                _CalendarView.YearViewEndDate = end;
                DoDateChanged(NavigationDirection.Forward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateTimeLineForward
        /// 
        /// NavigateTimeLineForward
        /// 
        private void NavigateTimeLineForward()
        {
            DateTime calendarStart = _CalendarView.TimeLineViewScrollStartDate;
            DateTime calendarEnd = _CalendarView.TimeLineViewScrollEndDate;
            DateTime start = GetForwardPeriodDate(_CalendarView.TimeLineViewScrollStartDate);
            DateTime end = start;
            if (DoDateChanging(NavigationDirection.Forward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.TimeLineViewScrollStartDate = start;
                DoDateChanged(NavigationDirection.Forward, calendarStart, calendarEnd,
                    _CalendarView.TimeLineViewScrollStartDate, _CalendarView.TimeLineViewScrollEndDate);
            }
        }
        #endregion
        #region GetForwardPeriodDate
        /// 
        /// Gets the next forward TimeLine Period Date
        /// 
        /// Current date
        /// Next Period Date
        private DateTime GetForwardPeriodDate(DateTime calendarStart)
        {
            // Hours or Minutes
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Minutes ||
                _CalendarView.TimeLinePeriod == eTimeLinePeriod.Hours)
            {
                // Move forward by a day
                calendarStart = calendarStart.AddDays(1);
                return (new DateTime(calendarStart.Year,
                    calendarStart.Month, calendarStart.Day, 0, 0, 0));
            }
            // Days
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Days)
            {
                // If our interval is a single day, then
                // move forward by a month
                if (_CalendarView.TimeLineInterval == 1)
                {
                    calendarStart = calendarStart.AddMonths(1);
                    return (new DateTime(calendarStart.Year, calendarStart.Month, 1));
                }
                // The interval is multiple days, so
                // move forward by a year
                calendarStart = calendarStart.AddYears(1);
                if (calendarStart.AddMinutes(_CalendarView.BaseInterval).Year > calendarStart.Year)
                    calendarStart = calendarStart.AddYears(1);
                return (new DateTime(calendarStart.Year, 1, 1));
            }
            // Years
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Years)
            {
                TimeSpan ts = calendarStart - _CalendarView.TimeLineViewStartDate;
                // Move forward by 10 columns at a time
                int interval = (int)(ts.TotalMinutes / _CalendarView.BaseInterval);
                interval = ((interval + 10) / 10) * 10;
                return (_CalendarView.TimeLineViewStartDate.AddMinutes(
                    interval * _CalendarView.BaseInterval));
            }
            return (calendarStart);
        }
        #endregion
        #endregion
        #region NavigateDatesBack
        /// 
        /// Navigates back
        /// 
        private void NavigateDatesBack()
        {
            if (_CalendarView != null)
            {
                switch (_CalendarView.SelectedView)
                {
                    case eCalendarView.Day:
                        NavigateDayBack();
                        break;
                    case eCalendarView.Week:
                        NavigateWeekBack();
                        break;
                    case eCalendarView.Month:
                        NavigateMonthBack();
                        break;
                    case eCalendarView.Year:
                        NavigateYearBack();
                        break;
                    case eCalendarView.TimeLine:
                        NavigateTimeLineBack();
                        break;
                }
                UpdateDisplay();
            }
        }
        #region NavigateDayBack
        /// 
        /// NavigateDayBack
        /// 
        private void NavigateDayBack()
        {
            DateTime oldDate = _CalendarView.DayViewDate;
            DateTime newDate = _CalendarView.DayViewDate.AddDays(-1);
            if (DoDateChanging(NavigationDirection.Backward,
                oldDate, oldDate, ref newDate, ref newDate) == false)
            {
                _CalendarView.DayViewDate = newDate;
                DoDateChanged(NavigationDirection.Backward, oldDate, oldDate, newDate, newDate);
            }
        }
        #endregion
        #region NavigateWeekBack
        /// 
        /// NavigateWeekBack
        /// 
        private void NavigateWeekBack()
        {
            DateTime calendarStart = _CalendarView.WeekViewStartDate;
            DateTime calendarEnd = _CalendarView.WeekViewEndDate;
            TimeSpan span = calendarEnd.Subtract(calendarStart).Negate();
            DateTime start = calendarStart.AddDays(-1).Add(span);
            DateTime end = calendarEnd.AddDays(-1).Add(span);
            if (WeekDaysNavigationEnabled &&
                calendarStart.DayOfWeek == DayOfWeek.Monday && calendarEnd.DayOfWeek == DayOfWeek.Friday)
            {
                // Browse week-days only
                start = calendarStart.AddDays(-7);
                end = start.AddDays(4);
            }
            if (DoDateChanging(NavigationDirection.Backward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.WeekViewStartDate = start;
                _CalendarView.WeekViewEndDate = end;
                DoDateChanged(NavigationDirection.Backward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateMonthBack
        /// 
        /// NavigateMonthBack
        /// 
        private void NavigateMonthBack()
        {
            DateTime calendarStart = _CalendarView.MonthViewStartDate;
            DateTime calendarEnd = _CalendarView.MonthViewEndDate;
            TimeSpan span = calendarEnd.Subtract(calendarStart);
            DateTime start = calendarStart.AddMonths(-1);
            DateTime end = start.Add(span);
            if (calendarStart.Day == 1 &&
                calendarEnd.Day == ScheduleSettings.GetActiveCulture().Calendar.GetDaysInMonth(calendarEnd.Year, calendarEnd.Month))
            {
                end = start.AddMonths(1).AddMinutes(-1);
            }
            if (DoDateChanging(NavigationDirection.Backward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.MonthViewStartDate = start;
                _CalendarView.MonthViewEndDate = end;
                DoDateChanged(NavigationDirection.Backward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateYearBack
        /// 
        /// NavigateYearBack
        /// 
        private void NavigateYearBack()
        {
            DateTime calendarStart = _CalendarView.YearViewStartDate;
            DateTime calendarEnd = _CalendarView.YearViewEndDate;
            int months = CountMonthSpan(calendarStart, calendarEnd);
            DateTime end = calendarStart.AddDays(-1);
            DateTime start = end.AddMonths(-months);
            start = start.AddDays(-start.Day + 1);
            if (DoDateChanging(NavigationDirection.Backward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.YearViewStartDate = start;
                _CalendarView.YearViewEndDate = end;
                DoDateChanged(NavigationDirection.Backward, calendarStart, calendarEnd, start, end);
            }
        }
        #endregion
        #region NavigateTimeLineBack
        /// 
        /// NavigateTimeLineBack
        /// 
        private void NavigateTimeLineBack()
        {
            DateTime calendarStart = _CalendarView.TimeLineViewScrollStartDate;
            DateTime calendarEnd = _CalendarView.TimeLineViewScrollEndDate;
            DateTime start = GetBackPeriodDate(_CalendarView.TimeLineViewScrollStartDate);
            DateTime end = start;
            if (DoDateChanging(NavigationDirection.Backward,
                calendarStart, calendarEnd, ref start, ref end) == false)
            {
                _CalendarView.TimeLineViewScrollStartDate = start;
                DoDateChanged(NavigationDirection.Backward, calendarStart, calendarEnd,
                    _CalendarView.TimeLineViewScrollStartDate, _CalendarView.TimeLineViewScrollEndDate);
            }
        }
        #endregion
        #region GetBackPeriodDate
        /// 
        /// Gets the next back TimeLine Period Date
        /// 
        /// Current date
        /// Next back Period Date
        private DateTime GetBackPeriodDate(DateTime calendarStart)
        {
            // Hours or minutes
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Minutes ||
                _CalendarView.TimeLinePeriod == eTimeLinePeriod.Hours)
            {
                // Go back by a day
                if (calendarStart.Hour == 0)
                    calendarStart = calendarStart.AddDays(-1);
                return (new DateTime(calendarStart.Year,
                    calendarStart.Month, calendarStart.Day, 0, 0, 0));
            }
            // Days
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Days)
            {
                // If the interval is a single day
                // then go back by a month
                if (_CalendarView.TimeLineInterval == 1)
                {
                    if (calendarStart.Day == 1)
                        calendarStart = calendarStart.AddMonths(-1);
                    return (new DateTime(calendarStart.Year, calendarStart.Month, 1));
                }
                // Multi-day interval, go back
                // by a year
                if (calendarStart.AddMinutes(-_CalendarView.BaseInterval).Year < calendarStart.Year)
                    calendarStart = calendarStart.AddYears(-1);
                return (new DateTime(calendarStart.Year, 1, 1));
            }
            // Years
            if (_CalendarView.TimeLinePeriod == eTimeLinePeriod.Years)
            {
                TimeSpan ts = calendarStart - _CalendarView.TimeLineViewStartDate;
                // Go back 10 columns
                int interval = (int)(ts.TotalMinutes / _CalendarView.BaseInterval);
                interval = ((interval % 10 == 0)
                    ? interval - 10 : (interval / 10) * 10);
                return (_CalendarView.TimeLineViewStartDate.AddMinutes(
                    interval * _CalendarView.BaseInterval));
            }
            return (calendarStart);
        }
        #endregion
        #endregion
        #region CountMonthSpan
        /// 
        /// CountMonthSpan
        /// 
        /// 
        /// 
        /// 
        private int CountMonthSpan(DateTime calendarStart, DateTime calendarEnd)
        {
            int monthSpan = (calendarEnd.Year * 12 + calendarEnd.Month) -
                (calendarStart.Year * 12 + calendarStart.Month);
            return (monthSpan > MaxYearMonthSpan ? MaxYearMonthSpan : monthSpan);
        }
        #endregion
        #region UpdateDisplay
        #region UpdateDisplay
        /// 
        /// Updates the Date Label text
        /// 
        public void UpdateDisplay()
        {
            if (IsDisposed == false)
            {
                if (_CalendarView == null)
                {
                    CurrentDateLabel.Text = "";
                }
                else
                {
                    if (GetDateLabel != null)
                    {
                        GetDateLabelEventArgs args = new GetDateLabelEventArgs();
                        GetDateLabel(this, args);
                        if (string.IsNullOrEmpty(args.DateLabel) == false)
                        {
                            CurrentDateLabel.Text = args.DateLabel;
                            return;
                        }
                    }
                    IFormatProvider formatProvider =
                        ScheduleSettings.GetActiveCulture(); //.GetFormat(typeof (DateTime));
                    switch (_CalendarView.SelectedView)
                    {
                        case eCalendarView.Day:
                            UpdateDayDisplay(formatProvider, _CalendarView.DayViewDate);
                            break;
                        case eCalendarView.Week:
                            UpdateWeekDisplay(formatProvider,
                                _CalendarView.WeekViewStartDate, _CalendarView.WeekViewEndDate);
                            break;
                        case eCalendarView.Month:
                            UpdateMonthDisplay(formatProvider,
                                _CalendarView.MonthViewStartDate, _CalendarView.MonthViewEndDate);
                            break;
                        case eCalendarView.Year:
                            UpdateYearDisplay(formatProvider,
                                _CalendarView.YearViewStartDate, _CalendarView.YearViewEndDate);
                            break;
                        case eCalendarView.TimeLine:
                            UpdateTimeLineDisplay(formatProvider,
                                _CalendarView.TimeLineViewScrollStartDate,
                                _CalendarView.TimeLineViewScrollEndDate);
                            break;
                    }
                }
            }
        }
        #endregion
        #region UpdateDayDisplay
        /// 
        /// Updates the DayView display
        /// 
        /// 
        /// 
        private void UpdateDayDisplay(IFormatProvider formatProvider, DateTime start)
        {
            CurrentDateLabel.Text = (start == DateTime.MinValue)
                ? "" : start.ToString(CurrentDayLabel, formatProvider);
        }
        #endregion
        #region UpdateWeekDisplay
        /// 
        /// Updates the WeekView display
        /// 
        /// 
        /// 
        /// 
        private void UpdateWeekDisplay(IFormatProvider formatProvider, DateTime start, DateTime end)
        {
            if (start == DateTime.MinValue || end == DateTime.MinValue)
            {
                CurrentDateLabel.Text = "";
            }
            else
            {
                if (start.Year == end.Year && start.Month == end.Month)
                {
                    CurrentDateLabel.Text =
                        start.ToString(CurrentWeekSameYearStartLabel, formatProvider) + @" - " +
                        end.ToString(CurrentWeekSameYearEndLabel, formatProvider);
                }
                else if (start.Year == end.Year)
                {
                    CurrentDateLabel.Text =
                        start.ToString(CurrentWeekSameMonthYearStartLabel, formatProvider) + @" - " +
                        end.ToString(CurrentWeekSameMonthYearEndLabel, formatProvider);
                }
                else
                {
                    CurrentDateLabel.Text =
                        start.ToString(CurrentWeekStartLabel, formatProvider) + @" - " +
                        end.ToString(CurrentWeekEndLabel, formatProvider);
                }
            }
        }
        #endregion
        #region UpdateMonthDisplay
        /// 
        /// Updates the MonthView display
        /// 
        /// 
        /// 
        /// 
        private void UpdateMonthDisplay(IFormatProvider formatProvider, DateTime start, DateTime end)
        {
            if (start == DateTime.MinValue || end == DateTime.MinValue)
            {
                CurrentDateLabel.Text = "";
            }
            else
            {
                string s = start.ToString(CurrentMonthStartLabel, formatProvider);
                if (end.Year != start.Year)
                    s += " - " + end.ToString(CurrentMonthEndLabel, formatProvider);
                CurrentDateLabel.Text = s;
            }
        }
        #endregion
        #region UpdateYearDisplay
        /// 
        /// Updates the YearView display
        /// 
        /// 
        /// 
        /// 
        private void UpdateYearDisplay(IFormatProvider formatProvider, DateTime start, DateTime end)
        {
            if (start == DateTime.MinValue)
            {
                CurrentDateLabel.Text = "";
            }
            else
            {
                string s = start.ToString(CurrentYearStartLabel, formatProvider);
                if (start.Month != end.Month || start.Year != end.Year)
                    s += " - " + end.ToString(CurrentYearEndLabel, formatProvider);
                CurrentDateLabel.Text = s;
            }
        }
        #endregion
        #region UpdateTimeLineDisplay
        /// 
        /// Updates the TimeLineView display
        /// 
        /// 
        /// 
        /// 
        private void UpdateTimeLineDisplay(IFormatProvider formatProvider, DateTime start, DateTime end)
        {
            if (start == DateTime.MinValue || end == DateTime.MinValue)
            {
                CurrentDateLabel.Text = "";
            }
            else
            {
                switch (_CalendarView.TimeLinePeriod)
                {
                    case eTimeLinePeriod.Hours:
                    case eTimeLinePeriod.Minutes:
                        CurrentDateLabel.Text = start.ToString(CurrentTimeLineHourLabel, formatProvider);
                        break;
                    case eTimeLinePeriod.Days:
                        if (start.Year == end.Year && start.Month == end.Month)
                        {
                            CurrentDateLabel.Text =
                                start.ToString(CurrentTimeLineDaySameMonthYearStartLabel, formatProvider) + @" - " +
                                end.ToString(CurrentTimeLineDaySameMonthYearEndLabel, formatProvider);
                        }
                        else if (start.Year == end.Year)
                        {
                            CurrentDateLabel.Text =
                                start.ToString(CurrentTimeLineDaySameYearStartLabel, formatProvider) + @" - " +
                                end.ToString(CurrentTimeLineDaySameYearEndLabel, formatProvider);
                        }
                        else
                        {
                            CurrentDateLabel.Text =
                                start.ToString(CurrentTimeLineDayStartLabel, formatProvider) + @" - " +
                                end.ToString(CurrentTimeLineDayEndLabel, formatProvider);
                        }
                        break;
                    case eTimeLinePeriod.Years:
                        CurrentDateLabel.Text =
                            start.ToString(CurrentTimeLineYearStartLabel, formatProvider) + @" - " +
                            end.ToString(CurrentTimeLineYearEndLabel, formatProvider);
                        break;
                }
            }
        }
        #endregion
        #endregion
        #region UpdateButtonImages
        /// 
        /// Updates the button images
        /// 
        private void UpdateButtonImages()
        {
            Bitmap image = new Bitmap(10, 10, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(image))
            {
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                using (Pen pen = new Pen(GetImageForeColor(), 2))
                {
                    g.DrawLines(pen, new Point[] {
                        new Point(5,0),
                        new Point(1,4),
                        new Point(5,8)
                    });
                    g.DrawLines(pen, new Point[] {
                        new Point(1,4),
                        new Point(9,4)
                    });
                }
            }
            if (NavigateBack.Image != null)
            {
                Image img = NavigateBack.Image;
                NavigateBack.Image = null;
                img.Dispose();
            }
            NavigateBack.Image = image;
            image = new Bitmap(10, 10, PixelFormat.Format32bppArgb);
            using (Graphics g = Graphics.FromImage(image))
            {
                g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
                using (Pen pen = new Pen(GetImageForeColor(), 2))
                {
                    g.DrawLines(pen, new Point[] {
                        new Point(0,4),
                        new Point(8,4),
                        new Point(4,0),
                        new Point(8,4),
                        new Point(4,8)
                    });
                }
            }
            if (NavigateForward.Image != null)
            {
                Image img = NavigateForward.Image;
                NavigateForward.Image = null;
                img.Dispose();
            }
            NavigateForward.Image = image;
        }
        /// 
        /// Gets image fore color
        /// 
        /// 
        private Color GetImageForeColor()
        {
            if (GlobalManager.Renderer is Office2007Renderer)
            {
                return ((Office2007Renderer)GlobalManager.Renderer).ColorTable.CheckBoxItem.Default.Text;
            }
            return this.ColorScheme.ItemText;
        }
        #endregion
        #region DoDateChanging
        private bool DoDateChanging(NavigationDirection direction,
            DateTime oldStartDate, DateTime oldEndDate, ref DateTime newStartDate, ref DateTime newEndDate)
        {
            if (DateChanging != null)
            {
                DateChangingEventArgs ev = new DateChangingEventArgs(
                    direction, oldStartDate, oldEndDate, newStartDate, newEndDate);
                DateChanging(this, ev);
                if (ev.Cancel == true)
                    return (true);
                newStartDate = ev.NewStartDate;
                newEndDate = ev.NewEndDate;
            }
            return (false);
        }
        #endregion
        #region DoDateChanged
        private void DoDateChanged(NavigationDirection direction,
            DateTime oldStartDate, DateTime oldEndDate, DateTime newStartDate, DateTime newEndDate)
        {
            if (DateChanged != null)
            {
                DateChangedEventArgs ev = new DateChangedEventArgs(
                    direction, oldStartDate, oldEndDate, newStartDate, newEndDate);
                DateChanged(this, ev);
            }
        }
        #endregion
        #region DateChangingEventArgs
        /// 
        /// DateChangingEventArgs
        /// 
        public class DateChangingEventArgs : DateChangedEventArgs
        {
            #region Private variables
            private bool _Cancel;
            #endregion
            public DateChangingEventArgs(NavigationDirection direction,
                DateTime oldStartDate, DateTime oldEndDate, DateTime newStartDate, DateTime newEndDate)
                : base(direction, oldStartDate, oldEndDate, newStartDate, newEndDate)
            {
            }
            #region Public properties
            /// 
            /// Gets or sets whether to cancel the operation
            /// 
            public bool Cancel
            {
                get { return (_Cancel); }
                set { _Cancel = value; }
            }
            #endregion
        }
        #endregion
        #region DateChangedEventArgs
        /// 
        /// DateChangingEventArgs
        /// 
        public class DateChangedEventArgs : EventArgs
        {
            #region Private variables
            NavigationDirection _Direction;
            private DateTime _OldStartDate;
            private DateTime _OldEndDate;
            private DateTime _NewStartDate;
            private DateTime _NewEndDate;
            #endregion
            public DateChangedEventArgs(NavigationDirection direction,
                DateTime oldStartDate, DateTime oldEndDate, DateTime newStartDate, DateTime newEndDate)
            {
                _Direction = direction;
                _OldStartDate = oldStartDate;
                _OldEndDate = oldEndDate;
                _NewStartDate = newStartDate;
                _NewEndDate = newEndDate;
            }
            #region Public properties
            /// 
            /// Gets the navigation direction
            /// 
            public NavigationDirection Direction
            {
                get { return (_Direction); }
                set { _Direction = value; }
            }
            /// 
            /// Gets the old navigation start date
            /// 
            public DateTime OldStartDate
            {
                get { return (_OldStartDate); }
            }
            /// 
            /// Gets the old navigation end date
            /// 
            public DateTime OldEndDate
            {
                get { return (_OldEndDate); }
            }
            /// 
            /// Gets or sets the new navigation start date
            /// 
            public DateTime NewStartDate
            {
                get { return (_NewStartDate); }
                set { _NewStartDate = value; }
            }
            /// 
            /// Gets or sets the new navigation end date
            /// 
            public DateTime NewEndDate
            {
                get { return (_NewEndDate); }
                set { _NewEndDate = value; }
            }
            #endregion
        }
        #endregion
        #region GetDateLabelEventArgs
        /// 
        /// GetDateLabelEventArgs
        /// 
        public class GetDateLabelEventArgs : EventArgs
        {
            #region Private variables
            private string _DateLabel;
            #endregion
            #region Public properties
            /// 
            /// Gets the formatted DateLabel
            /// 
            public string DateLabel
            {
                get { return (_DateLabel); }
                set { _DateLabel = value; }
            }
            #endregion
        }
        #endregion
    }
    #region enums
    public enum NavigationDirection
    {
        Forward,
        Backward
    }
    #endregion
}
#endif