using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Media;
using C1.C1Preview;
using C1.C1Preview.DataBinding;
using C1.C1Schedule;

namespace PrintDocTemplates
{
	/// <summary>
	/// Contains static methods filling document for different views
	/// </summary>
	public static class Utils
	{
		/// <summary>
		/// Fills specified control with a Memo style.
		/// </summary>
		/// <param name="doc"></param>
		public static void MakeMemo(C1PrintDocument doc)
		{
			doc.Clear();

			doc.DocumentInfo.Title = "Memo style";
			doc.DocumentInfo.Subject = "Memo";

			AddNamespaces(doc);

			AddHeadersFooters(doc);
			doc.Tags["AppointmentsFont"].Value = new Font("Arial", 10);

            // add string tags (localizable)

            Tag newTag = new Tag("Subject", "Subject:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Location", "Location:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);
            newTag = new Tag("Start", "Start:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("End", "End:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("ShowTimeAs", "Show Time As:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Recurrence", "Recurrence:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("None", "none", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Categories", "Categories:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Resources", "Resources:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Contacts", "Contacts:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

            newTag = new Tag("Importance", "Importance:", typeof(string));
            newTag.ShowInDialog = false;
            doc.Tags.Add(newTag);

			RenderArea ra = new RenderArea();
			ra.Width = "100%";
			ra.BreakBefore = BreakEnum.Page;
			ra.DataBinding.DataSource = new Expression("Document.Tags!Appointments.Value");
            ra.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            ra.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");
            ra.Style.Borders.Top = LineDef.DefaultBold;
			ra.Stacking = StackingRulesEnum.InlineLeftToRight;
			ra.Style.Padding.Top = "1mm";
			ra.Style.Spacing.All = "1mm";

			RenderText rt = new RenderText();
			rt.FormatDataBindingInstanceScript = //VisibilityEnum
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Parent.Original.DataBinding.Fields!Subject.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Subject.Value]";
            rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Parent.Original.DataBinding.Fields!Subject.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[Fields!Subject.Value]";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Parent.Original.DataBinding.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Location.Value]";
            rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Parent.Original.DataBinding.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[Fields!Location.Value]";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
            rt.Text = "[Document.Tags!Start.Value]";
            rt.Width = "25%";
			rt.Style.Padding.Top = "2mm";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.Text = "[String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:ddd} {1:g}\", Fields!Start.Value, Fields!Start.Value)]";
			rt.Width = "75%";
			rt.Style.Padding.Top = "2mm";
			ra.Children.Add(rt);

			rt = new RenderText();
            rt.Text = "[Document.Tags!End.Value]";
            rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.Text = "[String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:ddd} {1:g}\", Fields!End.Value, Fields!End.Value)]";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
            rt.Text = "[Document.Tags!ShowTimeAs.Value]";
            rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.Text = "[Fields!BusyStatus.Value.Text]";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
            rt.Text = "[Document.Tags!Recurrence.Value]";
            rt.Width = "25%";
			rt.Style.Padding.Top = "2mm";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"Dim index as Integer = RenderObject.Parent.Original.DataBinding.RowNumber - 1 \r\n" +
				"Dim app As Appointment = Document.Tags!Appointments.Value(index)\r\n" +
				"Dim text As RenderText = RenderObject\r\n" +
				"If app.RecurrenceState <> RecurrenceStateEnum.NotRecurring Then\r\n" +
				"    text.Text = app.GetRecurrencePattern().Description\r\n" +
				"Else\r\n" +
                "    text.Text = Document.Tags!None.Value\r\n" +
                "End If";
			rt.Style.Padding.Top = "2mm";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Links.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Links.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Contacts.Value]";
            rt.Style.Padding.Top = "2mm";
			rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Links.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Links.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[Fields!Links.Value.ToString()]";
			rt.Style.Padding.Top = "2mm";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Categories.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Categories.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Categories.Value]";
            rt.Style.Padding.Top = "2mm";
			rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Categories.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Categories.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[Fields!Categories.Value.ToString()]";
			rt.Style.Padding.Top = "2mm";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Resources.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Resources.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Resources.Value]";
            rt.Width = "25%";
			rt.Style.Padding.Top = "2mm";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf((Not (RenderObject.Parent.Original.DataBinding.Fields!Resources.Value Is Nothing)) And RenderObject.Parent.Original.DataBinding.Fields!Resources.Value.Count > 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[Fields!Resources.Value.ToString()]";
			rt.Style.Padding.Top = "2mm";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not (RenderObject.Parent.Original.DataBinding.Fields!Importance.Value = 1), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
            rt.Text = "[Document.Tags!Importance.Value]";
            rt.Style.Padding.Top = "2mm";
			rt.Width = "25%";
			rt.Style.FontBold = true;
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not (RenderObject.Parent.Original.DataBinding.Fields!Importance.Value = 1), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Style.Padding.Top = "2mm";
			rt.Text = "[Fields!Importance.Value.ToString()]";
			rt.Width = "75%";
			ra.Children.Add(rt);

			rt = new RenderText();
			rt.Text = "[Fields!Body.Value.ToString()]";
			rt.Style.Padding.Top = "3mm";
			rt.Style.Padding.Right = "2mm";
			rt.Width = "100%";
			ra.Children.Add(rt);

			doc.Body.Children.Add(ra);

			AddCommonTags(doc);

			newTag = new Tag("Appointments", null, typeof(IList<Appointment>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
		}

		/// <summary>
		/// Fills specified control with a Details style.
		/// </summary>
		/// <param name="doc"></param>
		public static void MakeDetails(C1PrintDocument doc)
		{
			doc.Clear();

			doc.DocumentInfo.Title = "Details style";
			doc.DocumentInfo.Subject = "Details";
			AddNamespaces(doc);

			AddHeadersFooters(doc);
			doc.Tags["FooterRight"].Value = "[GeneratedDateTime]";

			doc.DocumentStartingScript +=
				"If Tags!InsertPageBreaks.Value And Tags!PageBreak.Value <> \"Day\" Then \r\n" +
				"	If Tags.IndexByName(\"LastDate\") = -1 Then\r\n" +
				"	    Dim tag As Tag\r\n" +
				"       tag = New Tag(\"LastDate\", Tags!StartDate.Value.Date)\r\n" +
				"       Tags.Add(tag)\r\n" +
				"   Else\r\n" +
				"       Tags!LastDate.Value = Tags!StartDate.Value.Date\r\n" +
				"   End If\r\n" +
				"End If\r\n" +
				"Dim dateAppointments As New DateAppointmentsCollection(Tags!StartDate.Value, Tags!EndDate.Value, Tags!Appointments.Value, false)\r\n" +
				"If Tags.IndexByName(\"DateAppointments\") = -1 Then\r\n" +
				"   Dim tagApps As Tag\r\n" +
				"   tagApps = New Tag(\"DateAppointments\", dateAppointments)\r\n" +
				"   tagApps.SerializeValue = False\r\n" +
				"   Tags.Add(tagApps)\r\n" +
				"Else\r\n" +
				"   Tags!DateAppointments.Value = dateAppointments\r\n" +
				"End If";

			// RenderArea representing the single day
			RenderArea ra1 = new RenderArea();
			ra1.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value");
			ra1.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			ra1.FormatDataBindingInstanceScript =
				"If Tags!InsertPageBreaks.Value Then\r\n" +
				"	 Dim newDate as DateTime\r\n" +
				"	 newDate = RenderObject.Original.DataBinding.Fields!Date.Value\r\n" +
				"    Select Case Tags!PageBreak.Value\r\n" +
				"		Case \"Week\"\r\n" +
				"			Dim tmp as DateTime\r\n" +
				"			tmp = Tags!LastDate.Value.Date.AddDays(1)\r\n" +
				"			While tmp <= newDate\r\n" +
				"				If tmp.DayOfWeek = Tags!CalendarInfo.Value.WeekStart Then\r\n" +
				"					RenderObject.BreakBefore = BreakEnum.Page\r\n" +
				"					Exit While\r\n" +
				"				End If\r\n" +
				"				tmp = tmp.AddDays(1)\r\n" +
				"			End While\r\n" +
				"		Case \"Month\"\r\n" +
				"			If Tags!LastDate.Value.Month <> newDate.Month Then\r\n" +
				"				RenderObject.BreakBefore = BreakEnum.Page\r\n" +
				"			End If\r\n" +
				"		Case Else\r\n" +
				"			RenderObject.BreakBefore = BreakEnum.Page\r\n" +
				"    End Select\r\n" +
				"    Tags!LastDate.Value = newDate\r\n" +
				"End If";

			ra1.Style.Spacing.All = "1mm";

			// day header
			RenderText rt = new RenderText("[String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:D}\", Fields!Date.Value)]");
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Style.Font = Document.Tags!DateHeadingsFont.Value";
			rt.Style.Borders.All = LineDef.Default;
			rt.Style.Padding.All = "2mm";
			rt.Style.BackColor = Colors.LightGray;

			ra1.Children.Add(rt);

			// RenderArea tepresenting the single appointment
			RenderArea raApp = new RenderArea();
			raApp.Style.Spacing.All = "2mm";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;

			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Parent.Fields!Appointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");

			rt = new RenderText();
			rt.Text = "[IIf(Fields!AllDayEvent.Value, \"All Day\", String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t} - {1:t}\", " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, DataBinding.Parent.Fields!Date.Value, Fields!Start.Value), " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value.AddDays(1)), CDate(Fields!End.Value)) > 0, DataBinding.Parent.Fields!Date.Value.AddDays(1), Fields!End.Value)))]";
			rt.Width = "25%";
			rt.Style.FontBold = true;
			raApp.Children.Add(rt);

			RenderArea appDetails = new RenderArea();
			appDetails.Width = "75%";
			appDetails.Stacking = StackingRulesEnum.InlineLeftToRight;

			RenderText rt1 = new RenderText();
			rt1.Text = "[Fields!Subject.Value] ";
			rt1.Style.FontBold = true;
			rt1.Width = "Auto";
			appDetails.Children.Add(rt1);

			rt1 = new RenderText();
			rt1.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt1.Text = "[\"-- \" & Fields!Location.Value]";
			rt1.Style.FontBold = true;
			rt1.Width = "Auto";
			appDetails.Children.Add(rt1);

			rt1 = new RenderText();
			rt1.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Body.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse) \r\n" +
				"RenderObject.BreakBefore = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Subject.Value & RenderObject.Original.DataBinding.Parent.Fields!Location.Value), BreakEnum.Line, BreakEnum.None)";
			rt1.Text = "[Fields!Body.Value]";
			appDetails.Children.Add(rt1);

			rt1 = new RenderText();
			rt1.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(DateDiff(DateInterval.Second, CDate(RenderObject.Original.DataBinding.Parent.Parent.Fields!Date.Value), CDate(RenderObject.Original.DataBinding.Parent.Fields!Start.Value)) < 0, VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt1.Text = "[\"Please See Above\"]";
			rt1.Style.FontBold = true;
			rt1.BreakBefore = BreakEnum.Line;
			appDetails.Children.Add(rt1);

			raApp.Children.Add(appDetails);

			ra1.Children.Add(raApp);
			doc.Body.Children.Add(ra1);

			AddCommonTags(doc);

			Tag newTag = new Tag("Appointments", null, typeof(IList<Appointment>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("StartDate", DateTime.Today, typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("EndDate", DateTime.Today.AddDays(1), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("InsertPageBreaks", false, typeof(Boolean));
			newTag.Description = "Start a new page each";
			doc.Tags.Add(newTag);
			newTag = new Tag("PageBreak", "Day", typeof(string));
			newTag.Description = "";
			newTag.InputParams = new TagListInputParams(TagListInputParamsTypeEnum.ComboBox, new TagListInputParamsItem("Day", "Day"), new TagListInputParamsItem("Week", "Week"), new TagListInputParamsItem("Month", "Month"));
			doc.Tags.Add(newTag);
			newTag = new Tag("HidePrivateAppointments", false, typeof(bool));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
		}

		/// <summary>
		/// Fills specified control with a Month style.
		/// </summary>
		/// <param name="doc"></param>
		public static void MakeMonth(C1PrintDocument doc)
		{
			doc.Clear();

			doc.DocumentInfo.Title = "Monthly style";
			doc.DocumentInfo.Subject = "Month";
			AddNamespaces(doc);

			AddHeadersFooters(doc);
			doc.PageLayout.PageSettings.Landscape = true;
			doc.Tags["FooterRight"].Value = "[GeneratedDateTime]";
			doc.Tags["DateHeadingsFont"].Value = new Font("Segoe UI", 20, FontStyle.Bold);

			doc.DocumentStartingScript +=
				"Dim daysNumber As Long = 7.0 \r\n" +
				"If Document.Tags!WorkDaysOnly.Value Then\r\n" +
				"   daysNumber = Document.Tags!CalendarInfo.Value.WorkDays.Count \r\n" +
				"End If\r\n" +
				"Document.Tags!DayWidth.Value = New Unit((97.3/daysNumber - 0.005).ToString(\"#.###\", System.Globalization.CultureInfo.InvariantCulture) & \"%\") \r\n" +
				"Dim tasksNumber As Integer = 0 \r\n" +
				"If Document.Tags!IncludeTasks.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If tasksNumber = 1 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"100%\")\r\n" +
				"ElseIf tasksNumber = 2 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"50%\")\r\n" +
				"Else\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"33.3%\")\r\n" +
				"End If\r\n" +
				"Dim startT As DateTime = Tags!StartDate.Value  \r\n" +
				"Dim endT As DateTime = Tags!EndDate.Value  \r\n" +
				"While startT.DayOfWeek <> Tags!CalendarInfo.Value.WeekStart \r\n" +
				"    startT = startT.AddDays(-1)\r\n" +
				"End While\r\n" +
				"Dim days As Long = DateDiff(DateInterval.Day, startT, endT )\r\n" +
				"endT = endT.AddDays(35 - (days Mod 35))\r\n" +
				"Dim months As New List(Of Date)\r\n" +
				"Dim s As DateTime = startT\r\n" +
				"While s < endT\r\n" +
				"	months.Add(s)\r\n" +
				"   s = s.AddDays(35)\r\n" +
				"End While\r\n" +
				"If Tags.IndexByName(\"Months\") = -1 Then\r\n" +
				"   Dim tagMonths As Tag\r\n" +
				"   tagMonths = New Tag(\"Months\", months)\r\n" +
				"   tagMonths.SerializeValue = False\r\n" +
				"   Tags.Add(tagMonths)\r\n" +
				"Else\r\n" +
				"   Tags!Months.Value = months\r\n" +
				"End If\r\n" +
				"\r\n" +
				"Dim dateAppointments As New DateAppointmentsCollection(startT, endT, Tags!Appointments.Value, Tags!CalendarInfo.Value, True, Not Tags!WorkDaysOnly.Value)\r\n" +
				"If Tags.IndexByName(\"DateAppointments\") = -1 Then\r\n" +
				"   Dim tagApps As Tag\r\n" +
				"   tagApps = New Tag(\"DateAppointments\", dateAppointments)\r\n" +
				"   tagApps.SerializeValue = False\r\n" +
				"   Tags.Add(tagApps)\r\n" +
				"Else\r\n" +
				"   Tags!DateAppointments.Value = dateAppointments\r\n" +
				"End If\r\n";

			// RenderArea representing the single page
			RenderArea raPage = new RenderArea();
			raPage.DataBinding.DataSource = new Expression("Document.Tags!Months.Value");
			raPage.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raPage.BreakBefore = BreakEnum.Page;
			raPage.Width = "100%";
			raPage.Height = "100%";
			raPage.Stacking = StackingRulesEnum.InlineLeftToRight;

			#region ** month header
			// month header
			RenderArea raMonthHeader = new RenderArea();
			raMonthHeader.Style.Borders.All = LineDef.Default;
			raMonthHeader.Width = "100%";
            raMonthHeader.Height = "28mm";
            raMonthHeader.Stacking = StackingRulesEnum.InlineLeftToRight;

			RenderText rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Style.Font = Document.Tags!DateHeadingsFont.Value\r\n" +
				"Dim rt As RenderText = RenderObject\r\n" +
				"Dim startDate As Date = RenderObject.Original.Parent.Parent.DataBinding.Fields!Date.Value\r\n" +
				"Dim endDate As Date = startDate.AddDays(34)\r\n" +
				"Dim txt As String = startDate.ToString(\"MMMM\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"If startDate.Year <> endDate.Year Then\r\n" +
				"    txt = txt & \" \" & startDate.ToString(\"yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"End If\r\n" +
				"txt = txt & \" - \" & endDate.ToString(\"MMMM yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"rt.Text = txt\r\n" +
				"Document.Tags!WeekTabs.Value = New List(of Date)\r\n" +
				"Document.Tags!WeekTabs.Value.Add(startDate)\r\n" +
				"Document.Tags!WeekTabs.Value.Add(startDate.AddDays(7))\r\n" +
				"Document.Tags!WeekTabs.Value.Add(startDate.AddDays(14))\r\n" +
				"Document.Tags!WeekTabs.Value.Add(startDate.AddDays(21))\r\n" +
				"Document.Tags!WeekTabs.Value.Add(startDate.AddDays(28))\r\n" +
				"Document.Tags!MonthCalendars.Value = New List(of Date)\r\n" +
				"startDate = New Date(startDate.Year, startDate.Month, 1)\r\n" +
				"While startDate <= endDate\r\n" +
				"	Document.Tags!MonthCalendars.Value.Add(startDate)\r\n" +
				"	startDate = startDate.AddMonths(1)\r\n" +
				"End While";
			rt.Style.TextAlignVert = AlignVertEnum.Center;
			rt.Style.Spacing.Left = "2mm";
			rt.Height = "100%";
            rt.Width = "parent.Width - 102mm";

			raMonthHeader.Children.Add(rt);

			RenderArea monthCalendar = new RenderArea();
			monthCalendar.DataBinding.DataSource = new Expression("Document.Tags!MonthCalendars.Value");
			monthCalendar.Stacking = StackingRulesEnum.InlineLeftToRight;
            monthCalendar.Style.Spacing.Left = "1mm";
            monthCalendar.Style.Spacing.Right = "1mm";
            monthCalendar.Style.Spacing.Top = "0.5mm";
            monthCalendar.Width = "34mm";

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"MMMM yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.FormatDataBindingInstanceScript =
				"Dim startDate As Date = RenderObject.Original.Parent.DataBinding.Fields!Date.Value\r\n" +
				"Dim endDate As Date = startDate.AddMonths(1).AddDays(-1)\r\n" +
				"While startDate.DayOfWeek <> Document.Tags!CalendarInfo.Value.WeekStart \r\n" +
				"    startDate = startDate.AddDays(-1)\r\n" +
				"End While\r\n" +
				"Document.Tags!WeekNumber.Value = New List(of Date)\r\n" +
				"While startDate <= endDate\r\n" +
				"	Document.Tags!WeekNumber.Value.Add(startDate)\r\n" +
				"	startDate = startDate.AddDays(7)\r\n" +
				"End While";
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.Font = new Font("Segoe UI", 8);
			rt.Width = "100%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText(" ");
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.DateTimeFormat.GetShortestDayName(CDate(Fields!Date.Value).DayOfWeek)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Document.Tags!WeekNumber.Value(0), Document.Tags!WeekNumber.Value(0).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			RenderArea raWeek = new RenderArea();
			raWeek.DataBinding.DataSource = new Expression("Document.Tags!WeekNumber.Value");
			raWeek.Style.Font = new Font("Arial", 7f);
			raWeek.Width = "100%";
			raWeek.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.Calendar.GetWeekOfYear(CDate(Fields!Date.Value), System.Globalization.CalendarWeekRule.FirstDay, Document.Tags!CalendarInfo.Value.WeekStart)]");
			rt.Style.Borders.Right = LineDef.Default;
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"%d\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!Date.Value.Month <> RenderObject.Original.Parent.Parent.DataBinding.Fields!Date.Value.Month Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
				"Else If RenderObject.Original.DataBinding.Fields!HasAppointments.Value Then\r\n" +
				"    RenderObject.Style.FontBold = true\r\n" +
				"End If";
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);
			monthCalendar.Children.Add(raWeek);

			raMonthHeader.Children.Add(monthCalendar);

			raPage.Children.Add(raMonthHeader);
			#endregion

			#region ** month
			// month 
			RenderArea raMonth = new RenderArea();
			raMonth.FormatDataBindingInstanceScript =
				"If Not (Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value) Then\r\n" +
				"    RenderObject.Width = \"100%\" \r\n" +
				"End If";
			raMonth.Style.Spacing.Top = "0.5mm";
			raMonth.Style.Borders.Top = LineDef.Default;
			raMonth.Style.Borders.Left = LineDef.Default;
			raMonth.Style.Borders.Bottom = LineDef.Default;
			raMonth.Width = "80%";
            raMonth.Height = "parent.Height - 28mm";
            raMonth.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText(" ");
			rt.Style.WordWrap = false;
			rt.Height = "4%";
			rt.Style.TextAngle = 90;
			rt.Width = "2.7%";
			raMonth.Children.Add(rt);

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"dddd\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6))");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Width = Document.Tags!DayWidth.Value";
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Borders.Right = LineDef.Default;
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.WordWrap = false;
			rt.Height = "4%";
			raMonth.Children.Add(rt);

			RenderArea raWeekTab = new RenderArea();
			raWeekTab.DataBinding.DataSource = new Expression("Document.Tags!WeekTabs.Value");
			raWeekTab.Height = "19.2%";
			raWeekTab.Width = "100%";
			raWeekTab.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"Dim txt As RenderText = RenderObject\r\n" +
				"Dim start As Date = RenderObject.Parent.Original.DataBinding.Fields!Date.Value\r\n" +
				"Dim endT As Date = start.AddDays(6)\r\n" +
				"If start.Month = endT.Month Then \r\n" +
				"	txt.Text = start.ToString(\"%d\", Document.Tags!CalendarInfo.Value.CultureInfo) & \" - \" & endT.ToString(\"d.MM\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"Else\r\n" +
				"	txt.Text = start.ToString(\"d.MM\", Document.Tags!CalendarInfo.Value.CultureInfo) & \" - \" & endT.ToString(\"d.MM\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"End If";
			rt.Style.Borders.Right = LineDef.Default;
			rt.Style.FontBold = true;
			rt.Style.TextAngle = 90;
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.WordWrap = false;
			rt.Height = "100%";
			rt.Width = "2.7%";
			raWeekTab.Children.Add(rt);

			// RenderArea representing the single day
			RenderArea raDay = new RenderArea();
			raDay.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6))");
			raDay.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raDay.Style.Borders.Right = LineDef.Default;
			raDay.Style.Borders.Bottom = LineDef.Default;
			raDay.FormatDataBindingInstanceScript =
				"RenderObject.Width = Document.Tags!DayWidth.Value";
			raDay.Height = "100%";

			// day header
			rt = new RenderText("[IIF(Fields!Date.Value.Day = 1 Or CDate(Fields!Date.Value) = CDate(Document.Tags!WeekTabs.Value(0).Date), String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:m}\", Fields!Date.Value) ,Fields!Date.Value.Day)]");
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Padding.Left = "1mm";
			rt.Style.FontBold = true;
			rt.Style.BackColor = Colors.White;
			rt.Style.TextAlignHorz = AlignHorzEnum.Left;
			rt.Style.WordWrap = false;

			raDay.Children.Add(rt);

			RenderText status = new RenderText(" ");
			status.FormatDataBindingInstanceScript =
				"If IsNothing(RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value) Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse\r\n" +
				"Else \r\n" +
				"    RenderObject.Style.Brush = RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value.Brush.Brush \r\n" +
				"End If";
			status.Width = "100%";
			status.Height = "1.5mm";
			raDay.Children.Add(status);

            RenderArea appointments = new RenderArea();
            appointments.Height = "parent.Height - Y - 2.5mm";
            
            // RenderArea representing the single appointment
			RenderArea raApp = new RenderArea();
			raApp.Style.Spacing.All = "0.2mm";
			raApp.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!AllDayEvent.Value Then\r\n" +
				"    RenderObject.Style.Borders.All = LineDef.Default\r\n" +
				"End If\r\n" +
				"If Not IsNothing(RenderObject.Original.DataBinding.Fields!Label.Value) Then\r\n" +
				"    RenderObject.Style.Brush = CType(RenderObject.Original.DataBinding.Fields!Label.Value, Label).Brush.Brush\r\n" +
				"End If";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;
            raApp.Height = "14pt";

			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Parent.Fields!Appointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");

			rt = new RenderText();
            rt.Style.WordWrap = false;
            rt.Text = "[IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, \"> \", String.Empty) & " +
                "IIf(Fields!AllDayEvent.Value, \"\", String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t}\", " +
                "IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, DataBinding.Parent.Fields!Date.Value, Fields!Start.Value)))] [Fields!Subject.Value]";
            rt.Width = "Auto";
            raApp.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[\" (\" & Fields!Location.Value & \")\"]";
            rt.Style.WordWrap = false;
            rt.Width = "Auto";
			raApp.Children.Add(rt);

            appointments.Children.Add(raApp);
            raDay.Children.Add(appointments);

            RenderArea overflowArea = new RenderArea();
            overflowArea.Name = "overflow";
            RenderText arrow = new RenderText(new string((char)0x36, 1), new Font("Webdings", 10));
            arrow.Style.Padding.Top = "-1.5mm";
            arrow.X = "parent.Width - 4mm";
            overflowArea.Children.Add(arrow);
            overflowArea.ZOrder = 100;
            overflowArea.Height = "2.5mm";
            overflowArea.FragmentResolvedScript =
                "if (C1PrintDocument.FormatVersion.AssemblyVersion.MinorRevision <> 100) Then\r\n" +
                "  Dim fragment As RenderFragment = RenderFragment.Parent.Children(2)\r\n" +
                "  If (fragment.HasChildren) Then\r\n" +
                "    If (RenderFragment.Parent.BoundsOnPage.Contains(fragment.Children(fragment.Children.Count - 1).BoundsOnPage)) Then\r\n" +
                "      RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "    else\r\n" +
                "      RenderFragment.RenderObject.Visibility = VisibilityEnum.Visible\r\n" +
                "    end if\r\n" +
                "  else\r\n" +
                "    RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "  end if\r\n" +
                "else\r\n" +
                "  RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "end if";
            raDay.Children.Add(overflowArea);
            
            raWeekTab.Children.Add(raDay);
			raMonth.Children.Add(raWeekTab);

			raPage.Children.Add(raMonth);
			#endregion

			#region ** tasks
			// tasks
			RenderArea include = new RenderArea();
			include.FormatDataBindingInstanceScript =
				"If Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Visible \r\n" +
				"Else\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If";
			include.Width = "20%";
            include.Height = "parent.Height - 28mm";

			RenderArea raTasks = new RenderArea();
			raTasks.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeTasks.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raTasks.Style.Borders.All = LineDef.Default;
			raTasks.Style.Spacing.Top = "0.5mm";
			raTasks.Style.Spacing.Left = "0.5mm";
			raTasks.Width = "100%";

			rt = new RenderText();
			rt.Text = "Tasks";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raTasks.Children.Add(rt);
			include.Children.Add(raTasks);

			RenderArea raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);
			include.Children.Add(raNotes);

			raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);

			RenderTable lines = new RenderTable();
			lines.Rows.Insert(0, 1);
			lines.Rows[0].Height = "0.5cm";
			TableVectorGroup gr = lines.RowGroups[0, 1];
			gr.Header = TableHeaderEnum.None;
			List<int> lst = new List<int>(60);
			for (int i = 0; i < 60; i++)
			{
				lst.Add(i);
			}
			gr.DataBinding.DataSource = lst;
			lines.Style.GridLines.Horz = LineDef.Default;
			lines.RowSizingMode = TableSizingModeEnum.Fixed;

			raNotes.Children.Add(lines);

			include.Children.Add(raNotes);

			raPage.Children.Add(include);
			#endregion

			doc.Body.Children.Add(raPage);

			AddCommonTags(doc);

			Tag newTag = new Tag("Appointments", null, typeof(IList<Appointment>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("WeekTabs", null, typeof(List<DateTime>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("WeekNumber", null, typeof(List<DateTime>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("MonthCalendars", null, typeof(List<DateTime>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("StartDate", DateTime.Today, typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("EndDate", DateTime.Today.AddDays(1), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("HidePrivateAppointments", false, typeof(bool));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("TaskHeight", new Unit("33.3%"), typeof(Unit));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("DayWidth", new Unit("13.9%"), typeof(Unit));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);

			newTag = new Tag("IncludeTasks", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Tasks";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeBlankNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (blank)";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeLinedNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (lined)";
			doc.Tags.Add(newTag);
			newTag = new Tag("WorkDaysOnly", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Only Print Workdays";
			doc.Tags.Add(newTag);
		}

		/// <summary>
		/// Fills specified control with a Week style.
		/// </summary>
		/// <param name="doc"></param>
		public static void MakeWeek(C1PrintDocument doc)
		{
			doc.Clear();

			doc.DocumentInfo.Title = "Weekly style";
			doc.DocumentInfo.Subject = "Week";
			AddNamespaces(doc);

			AddHeadersFooters(doc);
			doc.Tags["FooterRight"].Value = "[GeneratedDateTime]";
			doc.Tags["DateHeadingsFont"].Value = new Font("Segoe UI", 20, FontStyle.Bold);

			doc.DocumentStartingScript +=
				"Dim tasksNumber As Integer = 0 \r\n" +
				"If Document.Tags!IncludeTasks.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If tasksNumber = 1 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"100%\")\r\n" +
				"ElseIf tasksNumber = 2 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"50%\")\r\n" +
				"Else\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"33.3%\")\r\n" +
				"End If\r\n" +
				"Dim startT As DateTime = Tags!StartDate.Value  \r\n" +
				"Dim endT As DateTime = Tags!EndDate.Value  \r\n" +
				"While startT.DayOfWeek <> Tags!CalendarInfo.Value.WeekStart \r\n" +
				"    startT = startT.AddDays(-1)\r\n" +
				"End While\r\n" +
				"Dim days As Long = DateDiff(DateInterval.Day, startT, endT )\r\n" +
				"endT = endT.AddDays(7 - (days Mod 7))\r\n" +
				"Dim weeks As New List(Of Date)\r\n" +
				"Dim s As DateTime = startT\r\n" +
				"While s < endT\r\n" +
				"	weeks.Add(s)\r\n" +
				"   s = s.AddDays(7)\r\n" +
				"End While\r\n" +
				"If Tags.IndexByName(\"Weeks\") = -1 Then\r\n" +
				"   Dim tagWeeks As Tag\r\n" +
				"   tagWeeks = New Tag(\"Weeks\", weeks)\r\n" +
				"   tagWeeks.SerializeValue = False\r\n" +
				"   Tags.Add(tagWeeks)\r\n" +
				"Else\r\n" +
				"   Tags!Weeks.Value = weeks\r\n" +
				"End If\r\n" +
				"\r\n" +
				"Dim dateAppointments As New DateAppointmentsCollection(startT, endT, Tags!Appointments.Value, Tags!CalendarInfo.Value, True, True)\r\n" +
				"If Tags.IndexByName(\"DateAppointments\") = -1 Then\r\n" +
				"   Dim tagApps As Tag\r\n" +
				"   tagApps = New Tag(\"DateAppointments\", dateAppointments)\r\n" +
				"   tagApps.SerializeValue = False\r\n" +
				"   Tags.Add(tagApps)\r\n" +
				"Else\r\n" +
				"   Tags!DateAppointments.Value = dateAppointments\r\n" +
				"End If";

			// RenderArea representing the single page
			RenderArea raPage = new RenderArea();
			raPage.DataBinding.DataSource = new Expression("Document.Tags!Weeks.Value");
			raPage.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raPage.BreakBefore = BreakEnum.Page;
			raPage.Width = "100%";
			raPage.Height = "100%";
			raPage.Stacking = StackingRulesEnum.InlineLeftToRight;

			#region ** week header
			// month header
			RenderArea raWeekHeader = new RenderArea();
			raWeekHeader.Style.Borders.All = LineDef.Default;
			raWeekHeader.Width = "100%";
            raWeekHeader.Height = "28mm";
            raWeekHeader.Stacking = StackingRulesEnum.InlineLeftToRight;

			RenderText rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Style.Font = Document.Tags!DateHeadingsFont.Value\r\n" +
				"Dim rt As RenderText = RenderObject\r\n" +
				"Dim startDate As Date = RenderObject.Original.Parent.Parent.DataBinding.Fields!Date.Value\r\n" +
				"Dim endDate As Date = startDate.AddDays(6)\r\n" +
				"Dim txt As String = startDate.ToString(\"MMMM d\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"If startDate.Year <> endDate.Year Then\r\n" +
				"    txt = txt & \" \" & startDate.ToString(\"yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"End If\r\n" +
				"txt = txt & \" - \" & endDate.ToString(\"MMMM d yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)\r\n" +
				"rt.Text = txt\r\n" +
				"Document.Tags!MonthCalendars.Value = New List(of Date)\r\n" +
				"startDate = New Date(startDate.Year, startDate.Month, 1)\r\n" +
				"While startDate <= endDate\r\n" +
				"	Document.Tags!MonthCalendars.Value.Add(startDate)\r\n" +
				"	startDate = startDate.AddMonths(1)\r\n" +
				"End While";
            rt.Style.TextAlignVert = AlignVertEnum.Center;
            rt.Style.Spacing.Left = "2mm";
            rt.Height = "100%";
            rt.Width = "parent.Width - 70mm";

			raWeekHeader.Children.Add(rt);

			RenderArea monthCalendar = new RenderArea();
			monthCalendar.DataBinding.DataSource = new Expression("Document.Tags!MonthCalendars.Value");
			monthCalendar.Stacking = StackingRulesEnum.InlineLeftToRight;
            monthCalendar.Style.Spacing.Left = "1mm";
            monthCalendar.Style.Spacing.Right = "1mm";
            monthCalendar.Style.Spacing.Top = "0.5mm";
            monthCalendar.Width = "34mm";

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"MMMM yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.FormatDataBindingInstanceScript =
				"Dim startDate As Date = RenderObject.Original.Parent.DataBinding.Fields!Date.Value\r\n" +
				"Dim endDate As Date = startDate.AddMonths(1).AddDays(-1)\r\n" +
				"While startDate.DayOfWeek <> Document.Tags!CalendarInfo.Value.WeekStart \r\n" +
				"    startDate = startDate.AddDays(-1)\r\n" +
				"End While\r\n" +
				"Document.Tags!WeekNumber.Value = New List(of Date)\r\n" +
				"While startDate <= endDate\r\n" +
				"	Document.Tags!WeekNumber.Value.Add(startDate)\r\n" +
				"	startDate = startDate.AddDays(7)\r\n" +
				"End While";
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.Font = new Font("Segoe UI", 8);
			rt.Width = "100%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText(" ");
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.DateTimeFormat.GetShortestDayName(CDate(Fields!Date.Value).DayOfWeek)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Document.Tags!WeekNumber.Value(0), Document.Tags!WeekNumber.Value(0).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			RenderArea raWeek = new RenderArea();
			raWeek.DataBinding.DataSource = new Expression("Document.Tags!WeekNumber.Value");
			raWeek.Style.Font = new Font("Arial", 7f);
			raWeek.Width = "100%";
			raWeek.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.Calendar.GetWeekOfYear(CDate(Fields!Date.Value), System.Globalization.CalendarWeekRule.FirstDay, Document.Tags!CalendarInfo.Value.WeekStart)]");
			rt.Style.Borders.Right = LineDef.Default;
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"%d\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!Date.Value.Month <> RenderObject.Original.Parent.Parent.DataBinding.Fields!Date.Value.Month Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
				"Else If RenderObject.Original.DataBinding.Fields!HasAppointments.Value Then\r\n" +
				"    RenderObject.Style.FontBold = true\r\n" +
				"End If";
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);
			monthCalendar.Children.Add(raWeek);

			raWeekHeader.Children.Add(monthCalendar);

			raPage.Children.Add(raWeekHeader);
			#endregion

			#region ** week
			// month 
			RenderArea raWeekBody = new RenderArea();
			raWeekBody.FormatDataBindingInstanceScript =
				"If Not (Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value) Then\r\n" +
				"    RenderObject.Width = \"100%\" \r\n" +
				"End If";
			raWeekBody.Style.Spacing.Top = "0.5mm";
			raWeekBody.Style.Borders.All = LineDef.Default;
			raWeekBody.Width = "75%";
            raWeekBody.Height = "parent.Height - 28mm";
            raWeekBody.Stacking = StackingRulesEnum.InlineLeftToRight;

			// RenderArea representing the single day
			RenderArea raDay = new RenderArea();
			raDay.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6))");
			raDay.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raDay.Style.Borders.Right = LineDef.Default;
			raDay.Style.Borders.Bottom = LineDef.Default;
			raDay.Stacking = StackingRulesEnum.InlineLeftToRight;
			raDay.Width = "50%";
			raDay.Height = "25%";

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"d  dddd\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Padding.Left = "1mm";
			rt.Style.FontBold = true;
			rt.Style.BackColor = Colors.White;
			rt.Style.TextAlignHorz = AlignHorzEnum.Left;
			rt.Style.WordWrap = false;
			raDay.Children.Add(rt);

			RenderText status = new RenderText(" ");
			status.FormatDataBindingInstanceScript =
				"If IsNothing(RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value) Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse\r\n" +
				"Else \r\n" +
				"    RenderObject.Style.Brush = RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value.Brush.Brush \r\n" +
				"End If";
			status.Width = "100%";
			status.Height = "1.5mm";
			raDay.Children.Add(status);

            RenderArea appointments = new RenderArea();
            appointments.Height = "parent.Height - Y - 2.5mm";
            
            // RenderArea representing the single appointment
			RenderArea raApp = new RenderArea();
			raApp.Style.Spacing.All = "0.5mm";
			raApp.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!AllDayEvent.Value Then\r\n" +
				"    RenderObject.Style.Borders.All = LineDef.Default\r\n" +
				"End If\r\n" +
				"If Not IsNothing(RenderObject.Original.DataBinding.Fields!Label.Value) Then\r\n" +
				"    RenderObject.Style.Brush = CType(RenderObject.Original.DataBinding.Fields!Label.Value, Label).Brush.Brush\r\n" +
				"End If";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;
			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Parent.Fields!Appointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");

			rt = new RenderText();
			rt.Text = "[IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, \"> \", String.Empty) & " +
				"IIf(Fields!AllDayEvent.Value, \"\", String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t} {1:t}\", " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, DataBinding.Parent.Fields!Date.Value, Fields!Start.Value), " +
                "IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value.AddDays(1)), CDate(Fields!End.Value)) > 0, DataBinding.Parent.Fields!Date.Value.AddDays(1), Fields!End.Value)))] [Fields!Subject.Value]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[\" (\" & Fields!Location.Value & \")\"]";
			rt.Width = "Auto";
            raApp.Children.Add(rt);

            appointments.Children.Add(raApp);
            raDay.Children.Add(appointments);

            RenderArea overflowArea = new RenderArea();
            overflowArea.Name = "overflow";
            RenderText arrow = new RenderText(new string((char)0x36, 1), new Font("Webdings", 10));
            arrow.Style.Padding.Top = "-1.5mm";
            arrow.X = "parent.Width - 4mm";
            overflowArea.Children.Add(arrow);
            overflowArea.ZOrder = 100;
            overflowArea.Height = "2.5mm";
            overflowArea.FragmentResolvedScript =
                "if (C1PrintDocument.FormatVersion.AssemblyVersion.MinorRevision <> 100) Then\r\n" +
                "  Dim fragment As RenderFragment = RenderFragment.Parent.Children(2)\r\n" +
                "  If (fragment.HasChildren) Then\r\n" +
                "    If (RenderFragment.Parent.BoundsOnPage.Contains(fragment.Children(fragment.Children.Count - 1).BoundsOnPage)) Then\r\n" +
                "      RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "    else\r\n" +
                "      RenderFragment.RenderObject.Visibility = VisibilityEnum.Visible\r\n" +
                "    end if\r\n" +
                "  else\r\n" +
                "    RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "  end if\r\n" +
                "else\r\n" +
                "  RenderFragment.RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
                "end if";
            raDay.Children.Add(overflowArea);

			raWeekBody.Children.Add(raDay);

			raPage.Children.Add(raWeekBody);
			#endregion

			#region ** tasks
			// tasks
			RenderArea include = new RenderArea();
			include.FormatDataBindingInstanceScript =
				"If Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Visible \r\n" +
				"Else\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If";
			include.Width = "25%";
            include.Height = "parent.Height - 28mm";

			RenderArea raTasks = new RenderArea();
			raTasks.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeTasks.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raTasks.Style.Borders.All = LineDef.Default;
			raTasks.Style.Spacing.Top = "0.5mm";
			raTasks.Style.Spacing.Left = "0.5mm";
			raTasks.Width = "100%";

			rt = new RenderText();
			rt.Text = "Tasks";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raTasks.Children.Add(rt);
			include.Children.Add(raTasks);

			RenderArea raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);
			include.Children.Add(raNotes);

			raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);

			RenderTable lines = new RenderTable();
			lines.Rows.Insert(0, 1);
			lines.Rows[0].Height = "0.5cm";
			TableVectorGroup gr = lines.RowGroups[0, 1];
			gr.Header = TableHeaderEnum.None;
			List<int> lst = new List<int>(60);
			for (int i = 0; i < 60; i++)
			{
				lst.Add(i);
			}
			gr.DataBinding.DataSource = lst;
			lines.Style.GridLines.Horz = LineDef.Default;
			lines.RowSizingMode = TableSizingModeEnum.Fixed;

			raNotes.Children.Add(lines);

			include.Children.Add(raNotes);

			raPage.Children.Add(include);
			#endregion

			doc.Body.Children.Add(raPage);

			AddCommonTags(doc);

			Tag newTag = new Tag("Appointments", null, typeof(IList<Appointment>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("WeekNumber", null, typeof(List<DateTime>));
			newTag.SerializeValue = false;
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("MonthCalendars", null, typeof(List<DateTime>));
			newTag.SerializeValue = false;
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("StartDate", DateTime.Today, typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("EndDate", DateTime.Today.AddDays(1), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("HidePrivateAppointments", false, typeof(bool));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("TaskHeight", new Unit("33.3%"), typeof(Unit));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);

			newTag = new Tag("IncludeTasks", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Tasks";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeBlankNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (blank)";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeLinedNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (lined)";
			doc.Tags.Add(newTag);
		}

		/// <summary>
		/// Fills specified control with a Day style.
		/// </summary>
		/// <param name="doc"></param>
		public static void MakeDay(C1PrintDocument doc)
		{
			doc.Clear();

			doc.DocumentInfo.Title = "Daily style";
			doc.DocumentInfo.Subject = "Day";
			AddNamespaces(doc);

			AddHeadersFooters(doc);
			doc.Tags["FooterRight"].Value = "[GeneratedDateTime]";
			doc.Tags["DateHeadingsFont"].Value = new Font("Segoe UI", 24, FontStyle.Bold);

			doc.DocumentStartingScript +=
				"Dim tasksNumber As Integer = 0 \r\n" +
				"If Document.Tags!IncludeTasks.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"   tasksNumber = tasksNumber + 1 \r\n" +
				"End If\r\n" +
				"If tasksNumber = 1 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"100%\")\r\n" +
				"ElseIf tasksNumber = 2 Then\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"50%\")\r\n" +
				"Else\r\n" +
				"   Document.Tags!TaskHeight.Value = New Unit(\"33.3%\")\r\n" +
				"End If\r\n" +
				"Dim dateAppointments As New DateAppointmentsCollection(Tags!StartDate.Value, Tags!EndDate.Value, Tags!Appointments.Value, Tags!CalendarInfo.Value, True, True)\r\n" +
				"If Tags.IndexByName(\"DateAppointments\") = -1 Then\r\n" +
				"   Dim tagApps As Tag\r\n" +
				"   tagApps = New Tag(\"DateAppointments\", dateAppointments)\r\n" +
				"   tagApps.SerializeValue = False\r\n" +
				"   Tags.Add(tagApps)\r\n" +
				"Else\r\n" +
				"   Tags!DateAppointments.Value = dateAppointments\r\n" +
				"End If\r\n" +
				"Dim startT As Date = Tags!StartTime.Value  \r\n" +
				"Dim endT As Date = Tags!EndTime.Value  \r\n" +
				"If startT > endT Then\r\n" +
				"   Tags!StartTime.Value = endT \r\n" +
				"   Tags!EndTime.Value = startT \r\n" +
				"End If";

			// RenderArea representing the single page
			RenderArea raPage = new RenderArea();
			raPage.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value");
			raPage.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raPage.BreakBefore = BreakEnum.Page;
			raPage.Width = "100%";
			raPage.Height = "100%";
			raPage.Stacking = StackingRulesEnum.InlineLeftToRight;

			#region ** day header
			// day header
			RenderArea raDayHeader = new RenderArea();
			raDayHeader.Style.Borders.All = LineDef.Default;
			raDayHeader.Width = "100%";
            raDayHeader.Height = "28mm";
            raDayHeader.Stacking = StackingRulesEnum.InlineLeftToRight;

			RenderText rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"D\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Style.Font = Document.Tags!DateHeadingsFont.Value\r\n" +
				"Dim startDate As Date = RenderObject.Original.Parent.Parent.DataBinding.Fields!Date.Value\r\n" +
				"Document.Tags!StartTime.Value = startDate.Add(Document.Tags!StartTime.Value.TimeOfDay)\r\n" +
				"Document.Tags!EndTime.Value = startDate.Add(Document.Tags!EndTime.Value.TimeOfDay)\r\n" +
				"Document.Tags!MonthCalendar.Value = New Date(startDate.Year, startDate.Month, 1) \r\n" +
				"startDate = Document.Tags!StartTime.Value\r\n" +
				"Document.Tags!DayHours.Value = New Dictionary(of Date, Date)\r\n" +
				"While startDate < Document.Tags!EndTime.Value\r\n" +
				"	Document.Tags!DayHours.Value.Add(startDate, startDate)\r\n" +
				"	startDate = startDate.AddMinutes(30)\r\n" +
				"End While";
            rt.Style.TextAlignVert = AlignVertEnum.Center;
            rt.Style.Spacing.Left = "2mm";
            rt.Height = "100%";
            rt.Width = "parent.Width - 38mm";

			raDayHeader.Children.Add(rt);

			RenderArea monthCalendar = new RenderArea();
			monthCalendar.Stacking = StackingRulesEnum.InlineLeftToRight;
			monthCalendar.Style.Spacing.Left = "1mm";
			monthCalendar.Style.Spacing.Right = "3mm";
			monthCalendar.Style.Spacing.Top = "0.5mm";
            monthCalendar.Width = "36mm";

			rt = new RenderText("[CDate(Document.Tags!MonthCalendar.Value).ToString(\"MMMM yyy\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.FormatDataBindingInstanceScript =
				"Dim startDate As Date = Document.Tags!MonthCalendar.Value\r\n" +
				"Dim endDate As Date = startDate.AddMonths(1).AddDays(-1)\r\n" +
				"While startDate.DayOfWeek <> Document.Tags!CalendarInfo.Value.WeekStart \r\n" +
				"    startDate = startDate.AddDays(-1)\r\n" +
				"End While\r\n" +
				"Document.Tags!WeekNumber.Value = New List(of Date)\r\n" +
				"While startDate <= endDate\r\n" +
				"	Document.Tags!WeekNumber.Value.Add(startDate)\r\n" +
				"	startDate = startDate.AddDays(7)\r\n" +
				"End While";
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.Font = new Font("Segoe UI", 8);
			rt.Width = "100%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText(" ");
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.DateTimeFormat.GetShortestDayName(CDate(Fields!Date.Value).DayOfWeek)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Document.Tags!WeekNumber.Value(0), Document.Tags!WeekNumber.Value(0).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.Style.Borders.Bottom = LineDef.Default;
			rt.Style.Font = new Font("Arial", 7f);
			rt.Style.TextAlignHorz = AlignHorzEnum.Center;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			monthCalendar.Children.Add(rt);

			RenderArea raWeek = new RenderArea();
			raWeek.DataBinding.DataSource = new Expression("Document.Tags!WeekNumber.Value");
			raWeek.Style.Font = new Font("Arial", 7f);
			raWeek.Width = "100%";
			raWeek.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText("[Document.Tags!CalendarInfo.Value.CultureInfo.Calendar.GetWeekOfYear(CDate(Fields!Date.Value), System.Globalization.CalendarWeekRule.FirstDay, Document.Tags!CalendarInfo.Value.WeekStart)]");
			rt.Style.Borders.Right = LineDef.Default;
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Style.WordWrap = false;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);

			rt = new RenderText("[CDate(Fields!Date.Value).ToString(\"%d\", Document.Tags!CalendarInfo.Value.CultureInfo)]");
			rt.DataBinding.DataSource = new Expression("New DateAppointmentsCollection(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value).AddDays(6), Document.Tags!Appointments.Value, True)");
			rt.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			rt.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!Date.Value.Month <> Document.Tags!MonthCalendar.Value.Month Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Hidden\r\n" +
				"Else If RenderObject.Original.DataBinding.Fields!HasAppointments.Value Then\r\n" +
				"    RenderObject.Style.FontBold = true\r\n" +
				"End If";
			rt.Style.TextAlignHorz = AlignHorzEnum.Right;
			rt.Width = "12.5%";
			raWeek.Children.Add(rt);
			monthCalendar.Children.Add(raWeek);

			raDayHeader.Children.Add(monthCalendar);

			raPage.Children.Add(raDayHeader);
			#endregion

			#region ** day
			// day 
			RenderArea raDayBody = new RenderArea();
			raDayBody.FormatDataBindingInstanceScript =
				"If Not (Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value) Then\r\n" +
				"    RenderObject.Width = \"100%\" \r\n" +
				"End If";
			raDayBody.Style.Spacing.Top = "0.5mm";
			raDayBody.Style.Borders.All = LineDef.Default;
			raDayBody.Width = "75%";
            raDayBody.Height = "parent.Height - 28mm";
            raDayBody.Stacking = StackingRulesEnum.BlockTopToBottom;

			#region ** all-day events
			// RenderArea representing the single day
			RenderArea raDay = new RenderArea();
			raDay.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value))");
			raDay.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raDay.Stacking = StackingRulesEnum.InlineLeftToRight;
			raDay.Height = "Auto";

			RenderText status = new RenderText(" ");
			status.FormatDataBindingInstanceScript =
				"If IsNothing(RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value) Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse\r\n" +
				"Else \r\n" +
				"    RenderObject.Style.Brush = RenderObject.Original.DataBinding.Parent.Fields!BusyStatus.Value.Brush.Brush \r\n" +
				"End If";
			status.Width = "100%";
			status.Height = "1.5mm";
			raDay.Children.Add(status);

			// RenderArea representing the single appointment
			RenderArea raApp = new RenderArea();
			raApp.Style.Spacing.All = "0.5mm";
			raApp.Style.Spacing.Left = "1.25cm";
			raApp.FormatDataBindingInstanceScript =
				"If RenderObject.Original.DataBinding.Fields!AllDayEvent.Value Then\r\n" +
				"    RenderObject.Style.Borders.All = LineDef.Default\r\n" +
				"ElseIf DateDiff(DateInterval.Second, CDate(Document.Tags!StartTime.Value), CDate(RenderObject.Original.DataBinding.Fields!Start.Value)) >= 0 Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse\r\n" +
				"End If\r\n" +
				"If Not IsNothing(RenderObject.Original.DataBinding.Fields!Label.Value) Then\r\n" +
				"    RenderObject.Style.Brush = CType(RenderObject.Original.DataBinding.Fields!Label.Value, Label).Brush.Brush\r\n" +
				"End If";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;
			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Parent.Fields!Appointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");

			rt = new RenderText();
			rt.Text = "[IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, \"> \", String.Empty) & " +
				"IIf(Fields!AllDayEvent.Value, \"\", String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t} {1:t}\", " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, DataBinding.Parent.Fields!Date.Value, Fields!Start.Value), " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value.AddDays(1)), CDate(Fields!End.Value)) > 0, DataBinding.Parent.Fields!Date.Value.AddDays(1), Fields!End.Value)))]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.Text = " [Fields!Subject.Value] ";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[\" (\" & Fields!Location.Value & \")\"]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			raDay.Children.Add(raApp);

			raDayBody.Children.Add(raDay);
			#endregion

			#region ** slots
			raDay = new RenderArea();
			raDay.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value))");
			raDay.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raDay.Stacking = StackingRulesEnum.InlineLeftToRight;
			raDay.Height = "parent - prev.height - next.height";

			RenderArea raTimeSlot = new RenderArea();
			raTimeSlot.FormatDataBindingInstanceScript =
				"RenderObject.Height = New Unit((100/CLng(Document.Tags!DayHours.Value.Count) - 0.005).ToString(\"#.###\", System.Globalization.CultureInfo.InvariantCulture) & \"%\")";
			raTimeSlot.DataBinding.DataSource = new Expression("Document.Tags!DayHours.Value");
			raTimeSlot.Width = "100%";
			raTimeSlot.Height = "0.5cm";
			raTimeSlot.Stacking = StackingRulesEnum.InlineLeftToRight;

			RenderParagraph rp = new RenderParagraph();
			rp.FormatDataBindingInstanceScript =
				"Document.Tags!SlotAppointments.Value = Document.Tags!DateAppointments.Value.GetIntervalAppointments(RenderObject.Original.DataBinding.Parent.Fields!Key.Value, RenderObject.Original.DataBinding.PArent.Fields!Key.Value.AddMinutes(30), False)\r\n" +
				"RenderObject.Visibility = IIf(RenderObject.Original.DataBinding.Parent.Fields!Key.Value.Minute = 0, VisibilityEnum.Visible, VisibilityEnum.Hidden)\r\n" +
				"Dim headerFont As Font = Document.Tags!DateHeadingsFont.Value\r\n" +
				"RenderObject.Style.Font = New Font(headerFont.FontFamily, headerFont.Size * 2 / 3)";
			rp.Width = "1.65cm";
			rp.Style.TextAlignHorz = AlignHorzEnum.Right;
			rp.Style.Borders.Top = LineDef.Default;
			rp.Style.Padding.Right = "1mm";
			rp.Height = "100%";
			ParagraphText pt = new ParagraphText("[IIf(String.IsNullOrEmpty(Document.Tags!CalendarInfo.Value.CultureInfo.DateTimeFormat.AMDesignator), CDate(Fields!Key.Value).ToString(\"%H\"), CDate(Fields!Key.Value).ToString(\"%h\"))]");
			pt.Style.FontBold = true;
			pt.Style.Padding.Right = "1mm";
			rp.Content.Add(pt);
			rp.Content.Add(new ParagraphText("[IIf(String.IsNullOrEmpty(Document.Tags!CalendarInfo.Value.CultureInfo.DateTimeFormat.AMDesignator), \"00\", CDate(Fields!Key.Value).ToString(\"tt\", Document.Tags!CalendarInfo.Value.CultureInfo).ToLower())]", TextPositionEnum.Superscript));
			raTimeSlot.Children.Add(rp);

			RenderArea slot = new RenderArea();
			slot.Width = "parent.width - prev.width - prev.left";
			slot.Height = "100%";
			slot.Style.Borders.Top = LineDef.Default;
			slot.Style.Borders.Left = LineDef.Default;
			slot.Stacking = StackingRulesEnum.InlineLeftToRight;

			// RenderArea representing the single appointment
			raApp = new RenderArea();
			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Document.Tags!SlotAppointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");
            raApp.Style.Spacing.All = "0.5mm";
			raApp.FormatDataBindingInstanceScript =
				"RenderObject.Width = New Unit((100/CLng(Document.Tags!SlotAppointments.Value.Count) - 0.005).ToString(\"#.###\", System.Globalization.CultureInfo.InvariantCulture) & \"%\")\r\n" +
				"If Not IsNothing(RenderObject.Original.DataBinding.Fields!Label.Value) Then\r\n" +
				"    RenderObject.Style.Brush = CType(RenderObject.Original.DataBinding.Fields!Label.Value, Label).Brush.Brush\r\n" +
				"End If";
			raApp.Width = "10%";
			raApp.Height = "100%";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;

			rt = new RenderText();
			rt.Text = "[String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t}-{1:t}\", Fields!Start.Value, Fields!End.Value).ToLower()]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.Text = " [Fields!Subject.Value] ";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[\" (\" & Fields!Location.Value & \")\"]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			slot.Children.Add(raApp);

			raTimeSlot.Children.Add(slot);

			raDay.Children.Add(raTimeSlot);
			raDayBody.Children.Add(raDay);
			#endregion

			#region ** late appointments
			raDay = new RenderArea();
			raDay.DataBinding.DataSource = new Expression("Document.Tags!DateAppointments.Value(Parent.Fields!Date.Value, CDate(Parent.Fields!Date.Value))");
			raDay.DataBinding.Sorting.Expressions.Add("Fields!Date.Value");
			raDay.Style.Borders.Top = LineDef.Default;
			raDay.Stacking = StackingRulesEnum.InlineLeftToRight;
			raDay.Height = "Auto";

			// RenderArea representing the single appointment
			raApp = new RenderArea();
			raApp.Style.Spacing.All = "0.5mm";
			raApp.Style.Spacing.Left = "1.25cm";
			raApp.FormatDataBindingInstanceScript =
				"If DateDiff(DateInterval.Second, CDate(Document.Tags!EndTime.Value), CDate(RenderObject.Original.DataBinding.Fields!Start.Value)) >= 0 Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Visible\r\n" +
				"Else\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse\r\n" +
				"End If\r\n" +
				"If Not IsNothing(RenderObject.Original.DataBinding.Fields!Label.Value) Then\r\n" +
				"    RenderObject.Style.Brush = CType(RenderObject.Original.DataBinding.Fields!Label.Value, Label).Brush.Brush\r\n" +
				"End If";
			raApp.Stacking = StackingRulesEnum.InlineLeftToRight;
			// Set the text's data source to the data source of the containing  RenderArea - this indicates that the render object is bound to the current group in the specified object:
			raApp.DataBinding.DataSource = new Expression("Parent.Fields!Appointments.Value");
			raApp.DataBinding.Sorting.Expressions.Add("Fields!Start.Value");
            raApp.DataBinding.Sorting.Expressions.Add("Fields!Subject.Value");

			rt = new RenderText();
			rt.Text = "[IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, \"> \", String.Empty) & " +
				"IIf(Fields!AllDayEvent.Value, \"\", String.Format(Document.Tags!CalendarInfo.Value.CultureInfo, \"{0:t} {1:t}\", " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value), CDate(Fields!Start.Value)) < 0, DataBinding.Parent.Fields!Date.Value, Fields!Start.Value), " +
				"IIf(DateDiff(DateInterval.Second, CDate(DataBinding.Parent.Fields!Date.Value.AddDays(1)), CDate(Fields!End.Value)) > 0, DataBinding.Parent.Fields!Date.Value.AddDays(1), Fields!End.Value)))]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.Text = " [Fields!Subject.Value] ";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			rt = new RenderText();
			rt.FormatDataBindingInstanceScript =
				"RenderObject.Visibility = IIf(Not String.IsNullOrEmpty(RenderObject.Original.DataBinding.Parent.Fields!Location.Value), VisibilityEnum.Visible, VisibilityEnum.Collapse)";
			rt.Text = "[\" (\" & Fields!Location.Value & \")\"]";
			rt.Width = "Auto";
			raApp.Children.Add(rt);

			raDay.Children.Add(raApp);

			raDayBody.Children.Add(raDay);
			#endregion

			raPage.Children.Add(raDayBody);
			#endregion

			#region ** tasks
			// tasks
			RenderArea include = new RenderArea();
			include.FormatDataBindingInstanceScript =
				"If Document.Tags!IncludeTasks.Value Or Document.Tags!IncludeBlankNotes.Value Or Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Visible \r\n" +
				"Else\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If";
			include.Width = "25%";
            include.Height = "parent.Height - 28mm";

			RenderArea raTasks = new RenderArea();
			raTasks.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeTasks.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raTasks.Style.Borders.All = LineDef.Default;
			raTasks.Style.Spacing.Top = "0.5mm";
			raTasks.Style.Spacing.Left = "0.5mm";
			raTasks.Width = "100%";

			rt = new RenderText();
			rt.Text = "Tasks";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raTasks.Children.Add(rt);
			include.Children.Add(raTasks);

			RenderArea raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeBlankNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);
			include.Children.Add(raNotes);

			raNotes = new RenderArea();
			raNotes.FormatDataBindingInstanceScript =
				"If Not Document.Tags!IncludeLinedNotes.Value Then\r\n" +
				"    RenderObject.Visibility = VisibilityEnum.Collapse \r\n" +
				"End If\r\n" +
				"RenderObject.Height = Document.Tags!TaskHeight.Value";
			raNotes.Style.Borders.All = LineDef.Default;
			raNotes.Style.Spacing.Top = "0.5mm";
			raNotes.Style.Spacing.Left = "0.5mm";
			raNotes.Width = "100%";

			rt = new RenderText();
			rt.Text = "Notes";
			rt.Style.Padding.Left = "2mm";
			rt.Style.Borders.Bottom = LineDef.Default;
			raNotes.Children.Add(rt);

			RenderTable lines = new RenderTable();
			lines.Rows.Insert(0, 1);
			lines.Rows[0].Height = "0.5cm";
			TableVectorGroup gr = lines.RowGroups[0, 1];
			gr.Header = TableHeaderEnum.None;
			List<int> lst = new List<int>(60);
			for (int i = 0; i < 60; i++)
			{
				lst.Add(i);
			}
			gr.DataBinding.DataSource = lst;
			lines.Style.GridLines.Horz = LineDef.Default;
			lines.RowSizingMode = TableSizingModeEnum.Fixed;

			raNotes.Children.Add(lines);

			include.Children.Add(raNotes);

			raPage.Children.Add(include);
			#endregion

			doc.Body.Children.Add(raPage);

			AddCommonTags(doc);

			Tag newTag = new Tag("Appointments", null, typeof(IList<Appointment>));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("WeekNumber", null, typeof(List<DateTime>));
			newTag.SerializeValue = false;
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("DayHours", null, typeof(Dictionary<DateTime, DateTime>));
			newTag.SerializeValue = false;
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("MonthCalendar", null, typeof(DateTime));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("StartDate", DateTime.Today, typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);
			newTag = new Tag("EndDate", DateTime.Today.AddDays(1), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			doc.Tags.Add(newTag);

			newTag = new Tag("StartTime", DateTime.Today.AddHours(7), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			((TagDateTimeInputParams)newTag.InputParams).Format = DateTimePickerFormat.Time;
			doc.Tags.Add(newTag);
			newTag = new Tag("EndTime", DateTime.Today.AddHours(19), typeof(DateTime));
			newTag.InputParams = new TagDateTimeInputParams();
			((TagDateTimeInputParams)newTag.InputParams).Format = DateTimePickerFormat.Time;
			doc.Tags.Add(newTag);

			newTag = new Tag("HidePrivateAppointments", false, typeof(bool));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("TaskHeight", new Unit("33.3%"), typeof(Unit));
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);
			newTag = new Tag("SlotAppointments", null, typeof(List<Appointment>));
			newTag.SerializeValue = false;
			newTag.ShowInDialog = false;
			doc.Tags.Add(newTag);

			newTag = new Tag("IncludeTasks", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Tasks";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeBlankNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (blank)";
			doc.Tags.Add(newTag);
			newTag = new Tag("IncludeLinedNotes", false, typeof(bool));
			newTag.ShowInDialog = true;
			newTag.InputParams = new TagBoolInputParams();
			newTag.Description = "Include Notes (lined)";
			doc.Tags.Add(newTag);
		}

		/// <summary>
		/// Adds header and footer tags (common for all documents)
		/// </summary>
		/// <param name="doc"></param>
		private static void AddHeadersFooters(C1PrintDocument doc)
		{
			RenderTable theader = new RenderTable();
			theader.Cells[0, 0].Style.TextAlignHorz = AlignHorzEnum.Left;
			theader.Cells[0, 1].Style.TextAlignHorz = AlignHorzEnum.Center;
			theader.Cells[0, 2].Style.TextAlignHorz = AlignHorzEnum.Right;
			theader.CellStyle.Padding.Bottom = "2mm";
			theader.Cells[0, 0].Text = "[Document.Tags!HeaderLeft.Value]";
			theader.Cells[0, 1].Text = "[Document.Tags!HeaderCenter.Value]";
			theader.Cells[0, 2].Text = "[Document.Tags!HeaderRight.Value]";

			doc.PageLayouts.Default.PageHeader = theader;

			theader = new RenderTable();
			theader.Cells[0, 0].Style.TextAlignHorz = AlignHorzEnum.Left;
			theader.Cells[0, 1].Style.TextAlignHorz = AlignHorzEnum.Center;
			theader.Cells[0, 2].Style.TextAlignHorz = AlignHorzEnum.Right;
			theader.CellStyle.Padding.Bottom = "2mm";
			theader.Cells[0, 0].Text = "[IIf(Document.Tags!ReverseOnEvenPages.Value, Document.Tags!HeaderRight.Value, Document.Tags!HeaderLeft.Value)]";
			theader.Cells[0, 1].Text = "[Document.Tags!HeaderCenter.Value]";
			theader.Cells[0, 2].Text = "[IIf(Document.Tags!ReverseOnEvenPages.Value, Document.Tags!HeaderLeft.Value, Document.Tags!HeaderRight.Value)]";

			doc.PageLayouts.EvenPages = new PageLayout();
			doc.PageLayouts.EvenPages.PageHeader = theader;

			RenderTable tfooter = new RenderTable();
			tfooter.Cells[0, 0].Style.TextAlignHorz = AlignHorzEnum.Left;
			tfooter.Cells[0, 1].Style.TextAlignHorz = AlignHorzEnum.Center;
			tfooter.Cells[0, 2].Style.TextAlignHorz = AlignHorzEnum.Right;
			tfooter.CellStyle.Padding.Top = "2mm";
			tfooter.Cells[0, 0].Text = "[Document.Tags!FooterLeft.Value]";
			tfooter.Cells[0, 1].Text = "[Document.Tags!FooterCenter.Value]";
			tfooter.Cells[0, 2].Text = "[Document.Tags!FooterRight.Value]";

			doc.PageLayouts.Default.PageFooter = tfooter;

			tfooter = new RenderTable();
			tfooter.Cells[0, 0].Style.TextAlignHorz = AlignHorzEnum.Left;
			tfooter.Cells[0, 1].Style.TextAlignHorz = AlignHorzEnum.Center;
			tfooter.Cells[0, 2].Style.TextAlignHorz = AlignHorzEnum.Right;
			tfooter.CellStyle.Padding.Top = "2mm";
			tfooter.Cells[0, 0].Text = "[IIf(Document.Tags!ReverseOnEvenPages.Value, Document.Tags!FooterRight.Value, Document.Tags!FooterLeft.Value)]";
			tfooter.Cells[0, 1].Text = "[Document.Tags!FooterCenter.Value]";
			tfooter.Cells[0, 2].Text = "[IIf(Document.Tags!ReverseOnEvenPages.Value, Document.Tags!FooterLeft.Value, Document.Tags!FooterRight.Value)]";

			doc.PageLayouts.EvenPages.PageFooter = tfooter;

			// add page header/footer tags
			Tag newTag = new Tag("HeaderLeft", String.Empty, typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("HeaderCenter", String.Empty, typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("HeaderRight", String.Empty, typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("FooterLeft", String.Empty, typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("FooterCenter", "[PageNo]", typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("FooterRight", String.Empty, typeof(string));
			doc.Tags.Add(newTag);
			newTag = new Tag("ReverseOnEvenPages", false, typeof(bool));
			doc.Tags.Add(newTag);
			newTag = new Tag("HeaderColor", Colors.Black, typeof(System.Windows.Media.Color));
			doc.Tags.Add(newTag);
			newTag = new Tag("FooterColor", Colors.Black, typeof(System.Windows.Media.Color));
			doc.Tags.Add(newTag);
			newTag = new Tag("HeaderFont", new Font("Tahoma", 8), typeof(Font));
			doc.Tags.Add(newTag);
			newTag = new Tag("FooterFont", new Font("Tahoma", 8), typeof(Font));
			doc.Tags.Add(newTag);

			newTag = new Tag("DateHeadingsFont", new Font("Segoe UI", 12, FontStyle.Bold), typeof(Font));
			doc.Tags.Add(newTag);
			newTag = new Tag("AppointmentsFont", new Font("Segoe UI", 8), typeof(Font));
			doc.Tags.Add(newTag);

			doc.DocumentStartingScript =
				"Document.Style.Font = Document.Tags!AppointmentsFont.Value\r\n" +
				"Document.PageLayout.PageFooter.Style.TextColor = Document.Tags!FooterColor.Value\r\n" +
				"Document.PageLayouts.EvenPages.PageFooter.Style.TextColor = Document.Tags!FooterColor.Value\r\n" +
				"Document.PageLayout.PageHeader.Style.TextColor = Document.Tags!HeaderColor.Value\r\n" +
				"Document.PageLayouts.EvenPages.PageHeader.Style.TextColor = Document.Tags!HeaderColor.Value\r\n" +
				"Document.PageLayout.PageFooter.Style.Font = Document.Tags!FooterFont.Value\r\n" +
				"Document.PageLayouts.EvenPages.PageFooter.Style.Font = Document.Tags!FooterFont.Value\r\n" +
				"Document.PageLayout.PageHeader.Style.Font = Document.Tags!HeaderFont.Value\r\n" +
				"Document.PageLayouts.EvenPages.PageHeader.Style.Font = Document.Tags!HeaderFont.Value\r\n";
		}

		/// <summary>
		/// Adds namespaces (common for all documents)
		/// </summary>
		/// <param name="doc"></param>
		private static void AddNamespaces(C1PrintDocument doc)
		{
			doc.TagEscapeString = "\x01";
			doc.ScriptingOptions.Namespaces.Add("C1.C1Schedule");
			doc.ScriptingOptions.Namespaces.Add("C1.C1Schedule.Printing");
		}

		/// <summary>
		/// Adds common tags
		/// </summary>
		/// <param name="doc"></param>
		private static void AddCommonTags(C1PrintDocument doc)
		{
			// CalendarInfo object contains all calendar-cspecific information
			// (culture, working days, week start, etc..)
			Tag newTag = new Tag("CalendarInfo", null, typeof(CalendarInfo));
			newTag.ShowInDialog = false;
			newTag.SerializeValue = false;
			doc.Tags.Add(newTag);
		}
	}
}