Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/AssemblyInfo.cs
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/AssemblyInfo.cs	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/AssemblyInfo.cs	(revision 789)
@@ -1,4 +1,5 @@
 using System.Reflection;
 using System.Runtime.CompilerServices;
+using System.Runtime.InteropServices;
 
 //
@@ -7,6 +8,6 @@
 // associated with an assembly.
 //
-[assembly: AssemblyTitle("ClinicalScheduling")]
-[assembly: AssemblyDescription("Windows Scheduling Application")]
+[assembly: AssemblyTitle("Clinical Scheduling")]
+[assembly: AssemblyDescription("Windows Scheduling Application for VistA")]
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("WorldVistA")]
@@ -27,5 +28,5 @@
 // by using the '*' as shown below:
 
-[assembly: AssemblyVersion("2.2.*")]
+[assembly: AssemblyVersion("1.1.*")]
 
 //
@@ -57,3 +58,4 @@
 [assembly: AssemblyKeyFile("")]
 [assembly: AssemblyKeyName("")]
-[assembly: AssemblyFileVersionAttribute("2.2.0.0")]
+[assembly: AssemblyFileVersionAttribute("1.1.0.0")]
+[assembly: ComVisibleAttribute(false)]
Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs	(revision 789)
@@ -266,5 +266,4 @@
             this.lblResource = new System.Windows.Forms.Label();
             this.panelCenter = new System.Windows.Forms.Panel();
-            this.calendarGrid1 = new IndianHealthService.ClinicalScheduling.CalendarGrid();
             this.ctxCalendarGrid = new System.Windows.Forms.ContextMenu();
             this.ctxCalGridAdd = new System.Windows.Forms.MenuItem();
@@ -281,4 +280,5 @@
             this.splitter1 = new System.Windows.Forms.Splitter();
             this.splitter2 = new System.Windows.Forms.Splitter();
+            this.calendarGrid1 = new IndianHealthService.ClinicalScheduling.CalendarGrid();
             this.panelRight.SuspendLayout();
             this.panelClip.SuspendLayout();
@@ -404,4 +404,5 @@
             // 
             this.mnuPrintPatientLetter.Index = 13;
+            this.mnuPrintPatientLetter.Shortcut = System.Windows.Forms.Shortcut.CtrlL;
             this.mnuPrintPatientLetter.Text = "Print Patient Le&tter";
             this.mnuPrintPatientLetter.Click += new System.EventHandler(this.mnuPrintPatientLetter_Click);
@@ -415,4 +416,5 @@
             // 
             this.mnuClose.Index = 15;
+            this.mnuClose.Shortcut = System.Windows.Forms.Shortcut.CtrlW;
             this.mnuClose.Text = "&Close Schedule";
             this.mnuClose.Click += new System.EventHandler(this.mnuClose_Click);
@@ -633,5 +635,5 @@
             this.tvSchedules.Location = new System.Drawing.Point(0, 0);
             this.tvSchedules.Name = "tvSchedules";
-            this.tvSchedules.Size = new System.Drawing.Size(128, 473);
+            this.tvSchedules.Size = new System.Drawing.Size(128, 410);
             this.tvSchedules.Sorted = true;
             this.tvSchedules.TabIndex = 1;
@@ -681,5 +683,5 @@
             this.panelRight.Location = new System.Drawing.Point(676, 0);
             this.panelRight.Name = "panelRight";
-            this.panelRight.Size = new System.Drawing.Size(128, 473);
+            this.panelRight.Size = new System.Drawing.Size(128, 410);
             this.panelRight.TabIndex = 3;
             this.panelRight.Visible = false;
@@ -777,6 +779,107 @@
             this.panelCenter.Location = new System.Drawing.Point(136, 24);
             this.panelCenter.Name = "panelCenter";
-            this.panelCenter.Size = new System.Drawing.Size(537, 425);
+            this.panelCenter.Size = new System.Drawing.Size(537, 362);
             this.panelCenter.TabIndex = 7;
+            // 
+            // ctxCalendarGrid
+            // 
+            this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
+            this.ctxCalGridAdd,
+            this.ctxCalGridEdit,
+            this.ctxCalGridDelete,
+            this.ctxCalGridCheckIn,
+            this.menuItem2,
+            this.ctxCalGridNoShow,
+            this.ctxCalGridNoShowUndo,
+            this.menuItem9,
+            this.ctxCalGridWalkin});
+            this.ctxCalendarGrid.Popup += new System.EventHandler(this.ctxCalendarGrid_Popup);
+            // 
+            // ctxCalGridAdd
+            // 
+            this.ctxCalGridAdd.Index = 0;
+            this.ctxCalGridAdd.Text = "Add Appointment";
+            this.ctxCalGridAdd.Click += new System.EventHandler(this.ctxCalGridAdd_Click);
+            // 
+            // ctxCalGridEdit
+            // 
+            this.ctxCalGridEdit.Index = 1;
+            this.ctxCalGridEdit.Text = "Edit Appointment";
+            this.ctxCalGridEdit.Click += new System.EventHandler(this.ctxCalGridEdit_Click);
+            // 
+            // ctxCalGridDelete
+            // 
+            this.ctxCalGridDelete.Index = 2;
+            this.ctxCalGridDelete.Text = "Cancel Appointment";
+            this.ctxCalGridDelete.Click += new System.EventHandler(this.ctxCalGridDelete_Click);
+            // 
+            // ctxCalGridCheckIn
+            // 
+            this.ctxCalGridCheckIn.Index = 3;
+            this.ctxCalGridCheckIn.Text = "Check In Patient";
+            this.ctxCalGridCheckIn.Click += new System.EventHandler(this.ctxCalGridCheckIn_Click);
+            // 
+            // menuItem2
+            // 
+            this.menuItem2.Index = 4;
+            this.menuItem2.Text = "-";
+            // 
+            // ctxCalGridNoShow
+            // 
+            this.ctxCalGridNoShow.Index = 5;
+            this.ctxCalGridNoShow.Text = "Mark as No Show";
+            this.ctxCalGridNoShow.Click += new System.EventHandler(this.ctxCalGridNoShow_Click);
+            // 
+            // ctxCalGridNoShowUndo
+            // 
+            this.ctxCalGridNoShowUndo.Index = 6;
+            this.ctxCalGridNoShowUndo.Text = "Undo NoShow";
+            this.ctxCalGridNoShowUndo.Click += new System.EventHandler(this.ctxCalGridNoShowUndo_Click);
+            // 
+            // menuItem9
+            // 
+            this.menuItem9.Index = 7;
+            this.menuItem9.Text = "-";
+            // 
+            // ctxCalGridWalkin
+            // 
+            this.ctxCalGridWalkin.Index = 8;
+            this.ctxCalGridWalkin.Text = "Create Wal&k-In Appointment";
+            this.ctxCalGridWalkin.Click += new System.EventHandler(this.ctxCalGridWalkin_Click);
+            // 
+            // panelBottom
+            // 
+            this.panelBottom.Controls.Add(this.statusBar1);
+            this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
+            this.panelBottom.Location = new System.Drawing.Point(136, 386);
+            this.panelBottom.Name = "panelBottom";
+            this.panelBottom.Size = new System.Drawing.Size(537, 24);
+            this.panelBottom.TabIndex = 8;
+            // 
+            // statusBar1
+            // 
+            this.statusBar1.Dock = System.Windows.Forms.DockStyle.Fill;
+            this.statusBar1.Location = new System.Drawing.Point(0, 0);
+            this.statusBar1.Name = "statusBar1";
+            this.statusBar1.Size = new System.Drawing.Size(537, 24);
+            this.statusBar1.SizingGrip = false;
+            this.statusBar1.TabIndex = 0;
+            // 
+            // splitter1
+            // 
+            this.splitter1.Location = new System.Drawing.Point(128, 24);
+            this.splitter1.Name = "splitter1";
+            this.splitter1.Size = new System.Drawing.Size(8, 386);
+            this.splitter1.TabIndex = 9;
+            this.splitter1.TabStop = false;
+            // 
+            // splitter2
+            // 
+            this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
+            this.splitter2.Location = new System.Drawing.Point(673, 24);
+            this.splitter2.Name = "splitter2";
+            this.splitter2.Size = new System.Drawing.Size(3, 386);
+            this.splitter2.TabIndex = 10;
+            this.splitter2.TabStop = false;
             // 
             // calendarGrid1
@@ -799,5 +902,5 @@
             this.calendarGrid1.Resources = ((System.Collections.ArrayList)(resources.GetObject("calendarGrid1.Resources")));
             this.calendarGrid1.SelectedAppointment = 0;
-            this.calendarGrid1.Size = new System.Drawing.Size(537, 425);
+            this.calendarGrid1.Size = new System.Drawing.Size(537, 362);
             this.calendarGrid1.StartDate = new System.DateTime(2003, 1, 27, 0, 0, 0, 0);
             this.calendarGrid1.TabIndex = 0;
@@ -808,109 +911,8 @@
             this.calendarGrid1.CGAppointmentAdded += new IndianHealthService.ClinicalScheduling.CGAppointmentChangedHandler(this.calendarGrid1_CGAppointmentAdded);
             // 
-            // ctxCalendarGrid
-            // 
-            this.ctxCalendarGrid.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
-            this.ctxCalGridAdd,
-            this.ctxCalGridEdit,
-            this.ctxCalGridDelete,
-            this.ctxCalGridCheckIn,
-            this.menuItem2,
-            this.ctxCalGridNoShow,
-            this.ctxCalGridNoShowUndo,
-            this.menuItem9,
-            this.ctxCalGridWalkin});
-            this.ctxCalendarGrid.Popup += new System.EventHandler(this.ctxCalendarGrid_Popup);
-            // 
-            // ctxCalGridAdd
-            // 
-            this.ctxCalGridAdd.Index = 0;
-            this.ctxCalGridAdd.Text = "Add Appointment";
-            this.ctxCalGridAdd.Click += new System.EventHandler(this.ctxCalGridAdd_Click);
-            // 
-            // ctxCalGridEdit
-            // 
-            this.ctxCalGridEdit.Index = 1;
-            this.ctxCalGridEdit.Text = "Edit Appointment";
-            this.ctxCalGridEdit.Click += new System.EventHandler(this.ctxCalGridEdit_Click);
-            // 
-            // ctxCalGridDelete
-            // 
-            this.ctxCalGridDelete.Index = 2;
-            this.ctxCalGridDelete.Text = "Cancel Appointment";
-            this.ctxCalGridDelete.Click += new System.EventHandler(this.ctxCalGridDelete_Click);
-            // 
-            // ctxCalGridCheckIn
-            // 
-            this.ctxCalGridCheckIn.Index = 3;
-            this.ctxCalGridCheckIn.Text = "Check In Patient";
-            this.ctxCalGridCheckIn.Click += new System.EventHandler(this.ctxCalGridCheckIn_Click);
-            // 
-            // menuItem2
-            // 
-            this.menuItem2.Index = 4;
-            this.menuItem2.Text = "-";
-            // 
-            // ctxCalGridNoShow
-            // 
-            this.ctxCalGridNoShow.Index = 5;
-            this.ctxCalGridNoShow.Text = "Mark as No Show";
-            this.ctxCalGridNoShow.Click += new System.EventHandler(this.ctxCalGridNoShow_Click);
-            // 
-            // ctxCalGridNoShowUndo
-            // 
-            this.ctxCalGridNoShowUndo.Index = 6;
-            this.ctxCalGridNoShowUndo.Text = "Undo NoShow";
-            this.ctxCalGridNoShowUndo.Click += new System.EventHandler(this.ctxCalGridNoShowUndo_Click);
-            // 
-            // menuItem9
-            // 
-            this.menuItem9.Index = 7;
-            this.menuItem9.Text = "-";
-            // 
-            // ctxCalGridWalkin
-            // 
-            this.ctxCalGridWalkin.Index = 8;
-            this.ctxCalGridWalkin.Text = "Create Wal&k-In Appointment";
-            this.ctxCalGridWalkin.Click += new System.EventHandler(this.ctxCalGridWalkin_Click);
-            // 
-            // panelBottom
-            // 
-            this.panelBottom.Controls.Add(this.statusBar1);
-            this.panelBottom.Dock = System.Windows.Forms.DockStyle.Bottom;
-            this.panelBottom.Location = new System.Drawing.Point(136, 449);
-            this.panelBottom.Name = "panelBottom";
-            this.panelBottom.Size = new System.Drawing.Size(537, 24);
-            this.panelBottom.TabIndex = 8;
-            // 
-            // statusBar1
-            // 
-            this.statusBar1.Dock = System.Windows.Forms.DockStyle.Fill;
-            this.statusBar1.Location = new System.Drawing.Point(0, 0);
-            this.statusBar1.Name = "statusBar1";
-            this.statusBar1.Size = new System.Drawing.Size(537, 24);
-            this.statusBar1.SizingGrip = false;
-            this.statusBar1.TabIndex = 0;
-            // 
-            // splitter1
-            // 
-            this.splitter1.Location = new System.Drawing.Point(128, 24);
-            this.splitter1.Name = "splitter1";
-            this.splitter1.Size = new System.Drawing.Size(8, 449);
-            this.splitter1.TabIndex = 9;
-            this.splitter1.TabStop = false;
-            // 
-            // splitter2
-            // 
-            this.splitter2.Dock = System.Windows.Forms.DockStyle.Right;
-            this.splitter2.Location = new System.Drawing.Point(673, 24);
-            this.splitter2.Name = "splitter2";
-            this.splitter2.Size = new System.Drawing.Size(3, 449);
-            this.splitter2.TabIndex = 10;
-            this.splitter2.TabStop = false;
-            // 
             // CGView
             // 
             this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
-            this.ClientSize = new System.Drawing.Size(804, 473);
+            this.ClientSize = new System.Drawing.Size(804, 410);
             this.Controls.Add(this.panelCenter);
             this.Controls.Add(this.panelBottom);
@@ -1784,5 +1786,6 @@
 						a.Add(appt.Resource);
 				}
-				//Call rebook letters RPC to get datatable
+
+                // Print rebooks
 				string sClinicList = "";
 				foreach (string sRes in a)
Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.cs
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.cs	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.cs	(revision 789)
@@ -31,4 +31,5 @@
         dsPatientApptDisplay2 _dsApptDisplay;
         private PrintDocument printCancelLetters;
+        private PrintDocument printRebookLetters;
         dsRebookAppts _dsRebookAppts;
 		#endregion Fields
@@ -73,5 +74,12 @@
 		}
 
-		public void InitializeFormRebookLetters(CGDocumentManager docManager,
+        /// <summary>
+        /// Print Rebook Letters by Date
+        /// </summary>
+        /// <param name="docManager">This docManger</param>
+        /// <param name="sClinicList">Clinics for which to print</param>
+        /// <param name="dtBegin">Beginning Date</param>
+        /// <param name="dtEnd">End Date</param>
+        public void InitializeFormRebookLetters(CGDocumentManager docManager,
 			string sClinicList,
 		    DateTime dtBegin,
@@ -89,9 +97,11 @@
 
                 //Call RPC to get list of appt ids that have been rebooked for these clinics on these dates
-                string sSql1 = "BSDX REBOOK CLINIC LIST^" + sClinicList + "^" + sBegin + "^" + sEnd;
-                DataTable dtLetters = docManager.RPMSDataTable(sSql1, "PatientAppts");
-				
+                string sSql1 = "BSDX REBOOK CLINIC LIST^" + sClinicList + "^" + sBegin + "^" + sEnd;				
 				string sSql2 = "BSDX RESOURCE LETTERS^" + sClinicList;
-				DataTable dt = docManager.RPMSDataTable(sSql2, "Resources");				
+
+                _dsRebookAppts = new dsRebookAppts();
+                _dsRebookAppts.PatientAppts.Merge(docManager.RPMSDataTable(sSql1, "PatientAppts"));
+                _dsRebookAppts.BSDXResource.Merge(docManager.RPMSDataTable(sSql2, "Resources"));
+
             }
 			catch (Exception ex)
@@ -99,5 +109,15 @@
 				throw ex;
 			}
-		}
+
+            PrintPreviewControl.Document = printRebookLetters;
+
+		}
+
+        /// <summary>
+        /// Print Rebook Letters by Date
+        /// </summary>
+        /// <param name="docManager">This docManger</param>
+        /// <param name="sClinicList">Clinics for which to print</param>
+        /// <param name="sApptIDList">List of appointments IENs in ^BSDXAPPT, delimited by |</param>
         public void InitializeFormRebookLetters(CGDocumentManager docManager,
             string sClinicList,
@@ -111,9 +131,11 @@
                 }
 
-                string sSql = "BSDX REBOOK LIST^" + sApptIDList;
-                DataTable dtLetters = docManager.RPMSDataTable(sSql, "PatientAppts");
-
+                string sSql1 = "BSDX REBOOK LIST^" + sApptIDList;
                 string sSql2 = "BSDX RESOURCE LETTERS^" + sClinicList;
-                DataTable dt = docManager.RPMSDataTable(sSql2, "Resources");
+
+                _dsRebookAppts = new dsRebookAppts();
+                _dsRebookAppts.PatientAppts.Merge(docManager.RPMSDataTable(sSql1, "PatientAppts"));
+                _dsRebookAppts.BSDXResource.Merge(docManager.RPMSDataTable(sSql2, "Resources"));
+
 
             }
@@ -122,4 +144,6 @@
                 throw ex;
             }
+
+            PrintPreviewControl.Document = printRebookLetters;
         }
 
@@ -203,5 +227,7 @@
 		}
 
-
+        /// <summary>
+        /// Ctor
+        /// </summary>
 		public DPatientLetter() : base()
 		{
@@ -241,4 +267,5 @@
             this.printReminderLetters = new System.Drawing.Printing.PrintDocument();
             this.printCancelLetters = new System.Drawing.Printing.PrintDocument();
+            this.printRebookLetters = new System.Drawing.Printing.PrintDocument();
             this.SuspendLayout();
             // 
@@ -254,4 +281,8 @@
             // 
             this.printCancelLetters.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printCancelLetters_PrintPage);
+            // 
+            // printRebookLetters
+            // 
+            this.printRebookLetters.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(this.printRebookLetters_PrintPage);
             // 
             // DPatientLetter
@@ -332,4 +363,25 @@
 
         }
+
+        private void printRebookLetters_PrintPage(object sender, PrintPageEventArgs e)
+        {
+            // no patients
+            if (_dsRebookAppts.PatientAppts.Count == 0)
+            {
+                ClinicalScheduling.Printing.PrintMessage("No Appointments found", e);
+                return;
+            }
+            // if there are patients
+            else if (_currentApptPrinting < _dsRebookAppts.PatientAppts.Count)
+            {
+                dsRebookAppts.BSDXResourceRow c = (dsRebookAppts.BSDXResourceRow)
+                   _dsRebookAppts.PatientAppts[_currentApptPrinting].GetParentRow(_dsRebookAppts.Relations[0]);
+                //XXX: Rebook letter rather oddly currently stored in NO SHOW LETTER field. What gives???
+                ClinicalScheduling.Printing.PrintRebookLetter(_dsRebookAppts.PatientAppts[_currentApptPrinting], e, c.NO_SHOW_LETTER, "Rebook Letter");
+                _currentApptPrinting++;
+                if (_currentApptPrinting < _dsRebookAppts.PatientAppts.Count)
+                    e.HasMorePages = true;
+            }
+        }
 	}
 }
Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.resx
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.resx	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/DPatientLetter.resx	(revision 789)
@@ -127,3 +127,6 @@
     <value>374, 17</value>
   </metadata>
+  <metadata name="printRebookLetters.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
+    <value>515, 17</value>
+  </metadata>
 </root>
Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs	(revision 789)
@@ -148,5 +148,14 @@
             printArea.Y += 15;
             printArea.Height -= 15;
-            
+
+            // write appointment date
+            string str = "Appointment Date: " + ptRow.ApptDate + "\n\n";
+            g.DrawString(str, fBody, Brushes.Black, printArea);
+
+            // move down
+            int strHeight = (int)g.MeasureString(str, fBody, printArea.Width).Height;
+            printArea.Y += strHeight;
+            printArea.Height -= strHeight;
+
             // write missive
             g.DrawString(letter, fBody, Brushes.Black, printArea);
@@ -165,7 +174,7 @@
 
         /// <summary>
-        /// Print Letter to be given or mailed to the patient
-        /// </summary>
-        /// <param name="ptrow">Strongly typed PatientApptsRow to pass (just one ApptRow)</param>
+        /// Cancellation Letter to be given or mailed to the patient
+        /// </summary>
+        /// <param name="ptRow">Strongly typed PatientApptsRow to pass (just one ApptRow)</param>
         /// <param name="e">You know what that is</param>
         /// <param name="letter">Contains letter string</param>
@@ -190,4 +199,13 @@
             printArea.Y += 15;
             printArea.Height -= 15;
+
+            // write appointment date
+            string str = "Appointment Date: " + ptRow.OldApptDate + "\n\n";
+            g.DrawString(str, fBody, Brushes.Black, printArea);
+
+            // move down
+            int strHeight = (int)g.MeasureString(str, fBody, printArea.Width).Height;
+            printArea.Y += strHeight;
+            printArea.Height -= strHeight;
 
             // write missive
@@ -206,4 +224,62 @@
         }
 
+        /// <summary>
+        /// Print rebook letters. Prints old and new appointments dates then the missive.
+        /// </summary>
+        /// <param name="ptRow">Strongly typed appointment row</param>
+        /// <param name="e">etc</param>
+        /// <param name="letter">Text of the letter to print</param>
+        /// <param name="title">Title to print at the top of the letter</param>
+        public static void PrintRebookLetter(dsRebookAppts.PatientApptsRow ptRow, PrintPageEventArgs e, string letter, string title)
+        {
+            Rectangle printArea = e.MarginBounds;
+            Graphics g = e.Graphics;
+            StringFormat sf = new StringFormat();
+            sf.Alignment = StringAlignment.Center; //for title
+            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
+            Font fBody = new Font(FontFamily.GenericSerif, 12);
+            g.DrawString(title, fTitle, Brushes.Black, printArea, sf); //title
+
+            // move down
+            int titleHeight = (int)g.MeasureString(title, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // draw underline
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // write old and new appointment dates
+            string str = "Old Appointment Date:\t\t" + ptRow.OldApptDate + "\n";
+            str += "New Appointment Date:\t\t" + ptRow.NewApptDate + "\n\n";
+            g.DrawString(str, fBody, Brushes.Black, printArea);
+
+            // move down
+            int strHeight = (int)g.MeasureString(str, fBody, printArea.Width).Height;
+            printArea.Y += strHeight;
+            printArea.Height -= strHeight;
+
+            // write missive
+            g.DrawString(letter, fBody, Brushes.Black, printArea);
+
+            //print Address in lower left corner for windowed envolopes
+            printArea.Location = new Point(e.MarginBounds.X, (int)(e.PageBounds.Height * 0.66));
+            printArea.Height = (int)(e.MarginBounds.Height * 0.20);
+            sf.Alignment = StringAlignment.Near;
+            sf.LineAlignment = StringAlignment.Center;
+            StringBuilder address = new StringBuilder(100);
+            address.AppendLine(ptRow.Name);
+            address.AppendLine(ptRow.STREET);
+            address.AppendLine(ptRow.CITY + ", " + ptRow.STATE + " " + ptRow.ZIP);
+            g.DrawString(address.ToString(), fBody, Brushes.Black, printArea, sf);
+
+        }
+
+        /// <summary>
+        /// Print message on a page; typically that there are no appointments to be found.
+        /// </summary>
+        /// <param name="msg">The exact string to print.</param>
+        /// <param name="e">Print Page event args</param>
         public static void PrintMessage(string msg, PrintPageEventArgs e)
         {
Index: Scheduling/trunk/cs/bsdx0200GUISourceCode/bin/Release/ClinicalScheduling.XML
===================================================================
--- Scheduling/trunk/cs/bsdx0200GUISourceCode/bin/Release/ClinicalScheduling.XML	(revision 788)
+++ Scheduling/trunk/cs/bsdx0200GUISourceCode/bin/Release/ClinicalScheduling.XML	(revision 789)
@@ -168,4 +168,53 @@
             </summary>
         </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.InitializeFormClinicSchedule(IndianHealthService.ClinicalScheduling.CGDocumentManager,System.String,System.DateTime,System.DateTime)">
+            <summary>
+            Print Clinic Schedules
+            </summary>
+            <param name="docManager">This docManger</param>
+            <param name="sClinicList">Clinics for which to print</param>
+            <param name="dtBegin">Beginning Date</param>
+            <param name="dtEnd">End Date</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.InitializeFormRebookLetters(IndianHealthService.ClinicalScheduling.CGDocumentManager,System.String,System.DateTime,System.DateTime)">
+            <summary>
+            Print Rebook Letters by Date
+            </summary>
+            <param name="docManager">This docManger</param>
+            <param name="sClinicList">Clinics for which to print</param>
+            <param name="dtBegin">Beginning Date</param>
+            <param name="dtEnd">End Date</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.InitializeFormRebookLetters(IndianHealthService.ClinicalScheduling.CGDocumentManager,System.String,System.String)">
+            <summary>
+            Print Rebook Letters by Date
+            </summary>
+            <param name="docManager">This docManger</param>
+            <param name="sClinicList">Clinics for which to print</param>
+            <param name="sApptIDList">List of appointments IENs in ^BSDXAPPT, delimited by |</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.InitializeFormCancellationLetters(IndianHealthService.ClinicalScheduling.CGDocumentManager,System.String,System.DateTime,System.DateTime)">
+            <summary>
+            Print Cancellation letters to mail to patients
+            </summary>
+            <param name="docManager">This Docmanager</param>
+            <param name="sClinicList">| delemited clinic list (IEN's)</param>
+            <param name="dtBegin">Beginning Date</param>
+            <param name="dtEnd">Ending Date</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.InitializeFormPatientReminderLetters(IndianHealthService.ClinicalScheduling.CGDocumentManager,System.String,System.DateTime,System.DateTime)">
+            <summary>
+            Print Reminder Letters to give or mail to patients
+            </summary>
+            <param name="docManager">This docManger</param>
+            <param name="sClinicList">Clinics for which to print</param>
+            <param name="dtBegin">Beginning Date</param>
+            <param name="dtEnd">End Date</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.#ctor">
+            <summary>
+            Ctor
+            </summary>
+        </member>
         <member name="M:IndianHealthService.ClinicalScheduling.DPatientLetter.Dispose(System.Boolean)">
             <summary>
@@ -505,13 +554,38 @@
             </summary>
         </member>
-        <member name="M:IndianHealthService.ClinicalScheduling.Printing.PrintAppointments(IndianHealthService.ClinicalScheduling.dsPatientApptDisplay2,System.Drawing.Printing.PrintPageEventArgs,System.DateTime,System.DateTime,System.Int32,System.Int32@)">
-            <summary>
-            Print Appointments
-            </summary>
-            <param name="ds">Strongly Typed DataSet contains Resources and Appointments</param>
-            <param name="e">PrintPageEventArgs from PrintDocument Print handler</param>
-            <param name="beg">Begin Datetime to print appointments</param>
-            <param name="end">End Datetime to print appointments</param>
-            <remarks>beg and end have no effect on operation--they are there for documentation for user only</remarks>
+        <!-- Badly formed XML comment ignored for member "M:IndianHealthService.ClinicalScheduling.Printing.PrintAppointments(IndianHealthService.ClinicalScheduling.dsPatientApptDisplay2,System.Drawing.Printing.PrintPageEventArgs,System.DateTime,System.DateTime,System.Int32,System.Int32@,System.Int32)" -->
+        <member name="M:IndianHealthService.ClinicalScheduling.Printing.PrintReminderLetter(IndianHealthService.ClinicalScheduling.dsPatientApptDisplay2.PatientApptsRow,System.Drawing.Printing.PrintPageEventArgs,System.String,System.String)">
+            <summary>
+            Print Letter to be given or mailed to the patient
+            </summary>
+            <param name="ptrow">Strongly typed PatientApptsRow to pass (just one ApptRow)</param>
+            <param name="e">You know what that is</param>
+            <param name="letter">Contains letter string</param>
+            <param name="title">Title of the letter</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.Printing.PrintCancelLetter(IndianHealthService.ClinicalScheduling.dsRebookAppts.PatientApptsRow,System.Drawing.Printing.PrintPageEventArgs,System.String,System.String)">
+            <summary>
+            Cancellation Letter to be given or mailed to the patient
+            </summary>
+            <param name="ptRow">Strongly typed PatientApptsRow to pass (just one ApptRow)</param>
+            <param name="e">You know what that is</param>
+            <param name="letter">Contains letter string</param>
+            <param name="title">Title of the letter</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.Printing.PrintRebookLetter(IndianHealthService.ClinicalScheduling.dsRebookAppts.PatientApptsRow,System.Drawing.Printing.PrintPageEventArgs,System.String,System.String)">
+            <summary>
+            Print rebook letters. Prints old and new appointments dates then the missive.
+            </summary>
+            <param name="ptRow">Strongly typed appointment row</param>
+            <param name="e">etc</param>
+            <param name="letter">Text of the letter to print</param>
+            <param name="title">Title to print at the top of the letter</param>
+        </member>
+        <member name="M:IndianHealthService.ClinicalScheduling.Printing.PrintMessage(System.String,System.Drawing.Printing.PrintPageEventArgs)">
+            <summary>
+            Print message on a page; typically that there are no appointments to be found.
+            </summary>
+            <param name="msg">The exact string to print.</param>
+            <param name="e">Print Page event args</param>
         </member>
         <member name="T:IndianHealthService.ClinicalScheduling.DResourceGroupItem">
