/// <summary>
        /// </summary>
        /// <exception cref="ArgumentNullException"><para><paramref name="dateItesm"/> is <see langword="null"/>.</para></exception>
        public void Add(NuGenDateItemCollection dateItems)
        {
            if (dateItems == null)
            {
                throw new ArgumentNullException("dateItems");
            }

            for (int i = 0; i < dateItems.Count; i++)
            {
                this.Add(dateItems[i]);
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="NuGenDateItemCollection"/> class.
 /// </summary>
 /// <exception cref="ArgumentNullException">
 /// <para><paramref name="owner"/> is <see langword="null"/>.</para>
 /// -or-
 /// <para><paramref name="dateItems"/> is <see langword="null"/>.</para>
 /// </exception>
 public NuGenDateItemCollection(NuGenCalendar owner, NuGenDateItemCollection dateItems) : this(owner)
 {
     this.Add(dateItems);
 }
		/// <summary>
		/// </summary>
		/// <exception cref="ArgumentNullException"><para><paramref name="dateItesm"/> is <see langword="null"/>.</para></exception>
		public void Add(NuGenDateItemCollection dateItems)
		{
			if (dateItems == null)
				throw new ArgumentNullException("dateItems");

			for (int i = 0; i < dateItems.Count; i++)
			{
				this.Add(dateItems[i]);
			}
		}
		/// <summary>
		/// Initializes a new instance of the <see cref="NuGenCalendar"/> class.
		/// </summary>
		/// <param name="serviceProvider">
		/// <para>Requires:</para>
		/// <para><see cref="INuGenControlStateService"/></para>
		/// <para><see cref="INuGenCalendarRenderer"/></para>
		/// </param>
		public NuGenCalendar(INuGenServiceProvider serviceProvider)
			: base(serviceProvider)
		{
			this.SetStyle(ControlStyles.DoubleBuffer, true);
			this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
			this.SetStyle(ControlStyles.UserPaint, true);
			this.SetStyle(ControlStyles.ResizeRedraw, true);
			this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);

			_borderColor = Color.Black;
			_selectButton = MouseButtons.Left;
			_extendedKey = NuGenExtendedSelectionKey.Ctrl;

			_activeRegion = NuGenCalendarRegion.None;
			_selectionMode = NuGenSelectionMode.MultiSimple;
			_dateTimeFormat = DateTimeFormatInfo.CurrentInfo;
			_theme = IntPtr.Zero;

			_installedCultures = CultureInfo.GetCultures(CultureTypes.InstalledWin32Cultures);
			_culture = CultureInfo.CurrentCulture;

			_showToday = true;
			_showTrailing = true;
			_showFocus = true;
			_todayColor = Color.Red;
			//initiate regions	
			_weekday = new NuGenWeekday(this);
			_month = new NuGenMonth(this);
			_footer = new NuGenFooter(this);
			_weeknumber = new NuGenWeeknumber(this);
			_header = new NuGenHeader(this, serviceProvider);

			_keyboard = new KeyboardConfig(this);
			_keyboardEnabled = true;
			_activeMonth = new NuGenActiveMonth(this);
			_dateItemCollection = new NuGenDateItemCollection(this);
			_selectedDates = new NuGenSelectedDatesCollection(this);

			// setup callback for weeknumbers
			WeeknumberCallBack = new NuGenWeekCallback(_weeknumber.CalcWeek);

			// setup internal events
			_hook.KeyDown += new KeyEventHandler(m_hook_KeyDown);
			_hook.KeyUp += new KeyEventHandler(m_hook_KeyUp);

			_dateItemCollection.DateItemModified += m_dateItemCollection_DateItemModified;

			_month.DayRender += m_month_DayRender;
			_month.DayQueryInfo += m_month_DayQueryInfo;
			_month.DayLostFocus += m_month_DayLostFocus;
			_month.DayGotFocus += m_month_DayGotFocus;
			_month.ImageClick += m_month_ImageClick;
			_month.DayMouseMove += m_month_DayMouseMove;
			_month.DayClick += m_month_DayClick;
			_month.DayDoubleClick += m_month_DayDoubleClick;
			_month.DaySelected += m_month_DaySelected;
			_month.DayDeselected += m_month_DayDeselected;
			_month.ColorChanged += m_month_ColorChanged;
			_month.BorderStyleChanged += m_month_BorderStyleChanged;
			_month.PropertyChanged += m_month_PropertyChanged;
			_month.BeforeDaySelected += m_month_BeforeDaySelected;
			_month.BeforeDayDeselected += m_month_BeforeDayDeselected;

			_footer.Click += m_footer_Click;
			_footer.DoubleClick += m_footer_DoubleClick;
			_footer.PropertyChanged += m_footer_PropertyChanged;

			_weeknumber.PropertyChanged += m_weeknumber_PropertyChanged;
			_weeknumber.Click += m_weeknumber_Click;
			_weeknumber.DoubleClick += m_weeknumber_DoubleClick;

			_weekday.PropertyChanged += m_weekday_PropertyChanged;
			_weekday.Click += m_weekday_Click;
			_weekday.DoubleClick += m_weekday_DoubleClick;

			_header.PropertyChanged += m_header_PropertyChanged;
			_header.Click += m_header_Click;
			_header.DoubleClick += m_header_DoubleClick;
			_header.PrevMonthButtonClick += m_header_PrevMonthButtonClick;
			_header.NextMonthButtonClick += m_header_NextMonthButtonClick;
			_header.PrevYearButtonClick += m_header_PrevYearButtonClick;
			_header.NextYearButtonClick += m_header_NextYearButtonClick;


			_activeMonth.MonthChanged += m_activeMonth_MonthChanged;
			_activeMonth.BeforeMonthChanged += m_activeMonth_BeforeMonthChanged;

			_printDoc.BeginPrint += m_printDoc_BeginPrint;
			_printDoc.PrintPage += m_printDoc_PrintPage;
			_printDoc.QueryPageSettings += m_printDoc_QueryPageSettings;

			_borderStyle = ButtonBorderStyle.Solid;

			_printDoc.DocumentName = "MonthCalendar";

			_showFooter = true;
			_showHeader = true;
			_showWeekday = true;

			_selectTrailing = true;
			_selectKeyDown = false;

			_activeMonth.Month = DateTime.Today.Month;
			_activeMonth.Year = DateTime.Today.Year;

			_minDate = DateTime.Now.AddYears(-10);
			_maxDate = DateTime.Now.AddYears(10);

			_month.SelectedMonth = DateTime.Parse(_activeMonth.Year + "-" + _activeMonth.Month + "-01");

			_hook.InstallKeyboardHook();
			_keyHandled = false;
			this.Size = new Size(250, 250);
			Setup();
			this.UseTheme = true;
		}
		/// <summary>
		/// Initializes a new instance of the <see cref="NuGenDateItemCollection"/> class.
		/// </summary>
		/// <exception cref="ArgumentNullException">
		/// <para><paramref name="owner"/> is <see langword="null"/>.</para>
		/// -or-
		/// <para><paramref name="dateItems"/> is <see langword="null"/>.</para>
		/// </exception>
		public NuGenDateItemCollection(NuGenCalendar owner, NuGenDateItemCollection dateItems) : this(owner)
		{
			this.Add(dateItems);
		}